@emseepea/testing 0.11.3 → 0.12.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/README.md +44 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/published-contract.d.ts +48 -0
- package/dist/published-contract.d.ts.map +1 -0
- package/dist/published-contract.js +309 -0
- package/dist/published-contract.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -119,6 +119,50 @@ Never deploy `insecureTestAuthentication`. It accepts any supplied bearer token
|
|
|
119
119
|
and exists only to keep ordinary tests focused on composition and authorization
|
|
120
120
|
flow. Test a real verifier separately against its provider contract.
|
|
121
121
|
|
|
122
|
+
## Check a Published MCP Contract
|
|
123
|
+
|
|
124
|
+
Use the connected client to capture the public contract available with that
|
|
125
|
+
client's access. The snapshot includes tool schemas and UI metadata, plus each
|
|
126
|
+
listed resource's URI, MIME type, UI metadata, and Content Security Policy
|
|
127
|
+
(CSP). Resource bodies are excluded.
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
import { readFile } from "node:fs/promises";
|
|
131
|
+
import {
|
|
132
|
+
assertPublishedMcpContractCompatible,
|
|
133
|
+
extractPublishedMcpContract,
|
|
134
|
+
startEmseepea,
|
|
135
|
+
writePublishedMcpContractBaseline,
|
|
136
|
+
} from "@emseepea/testing";
|
|
137
|
+
import { createApp } from "./app.js";
|
|
138
|
+
|
|
139
|
+
const running = await startEmseepea(await createApp());
|
|
140
|
+
try {
|
|
141
|
+
const current = await extractPublishedMcpContract(await running.connect());
|
|
142
|
+
if (process.argv.includes("--capture")) {
|
|
143
|
+
await writePublishedMcpContractBaseline("contract-baselines/1.0.0.json", {
|
|
144
|
+
version: "1.0.0",
|
|
145
|
+
contract: current,
|
|
146
|
+
});
|
|
147
|
+
} else {
|
|
148
|
+
const baseline = JSON.parse(await readFile("contract-baselines/1.0.0.json", "utf8"));
|
|
149
|
+
assertPublishedMcpContractCompatible(current, [baseline]);
|
|
150
|
+
}
|
|
151
|
+
} finally {
|
|
152
|
+
await running.close();
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
`assertPublishedMcpContractCompatible` throws with every concrete breaking or
|
|
157
|
+
unclassified change, so an ordinary Node script exits non-zero. Input changes
|
|
158
|
+
must continue accepting prior callers. Output changes must remain within the
|
|
159
|
+
prior consumer contract. CSP allow-list additions are breaking; removals are
|
|
160
|
+
safe. Unknown JSON Schema changes fail closed for review.
|
|
161
|
+
|
|
162
|
+
Keep the capture version, release policy, baseline location, and retention in
|
|
163
|
+
the application repository. Run capture only for a contract that has actually
|
|
164
|
+
been published or submitted for review.
|
|
165
|
+
|
|
122
166
|
When a conversation writes to external state, pass an `environment` function
|
|
123
167
|
that returns a separate test database connection for each trial. The trial
|
|
124
168
|
number selects infrastructure only. It is never sent to the model or MCP
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Client } from "@modelcontextprotocol/client";
|
|
2
2
|
import { serveEmseepea, type AuthenticationOptions } from "@emseepea/server";
|
|
3
3
|
export { createMcpAppHostSimulator, type McpAppHostSimulator, type McpAppHostSimulatorOptions, type McpAppMessageRequest, } from "./mcp-app-host.js";
|
|
4
|
+
export { assertPublishedMcpContractCompatible, comparePublishedMcpContracts, extractPublishedMcpContract, writePublishedMcpContractBaseline, type PublishedMcpContract, type PublishedMcpContractBaseline, type PublishedMcpContractBreak, type PublishedMcpContractClient, type PublishedMcpResource, } from "./published-contract.js";
|
|
4
5
|
export type SupportedProtocolVersion = "2026-07-28" | "2025-11-25" | "2025-06-18" | "2025-03-26" | "2024-11-05" | "2024-10-07";
|
|
5
6
|
export interface TestCleanup {
|
|
6
7
|
after(cleanup: () => Promise<void>): void;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAiC,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EACL,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAiC,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EACL,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oCAAoC,EACpC,4BAA4B,EAC5B,2BAA2B,EAC3B,iCAAiC,EACjC,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,wBAAwB,GAChC,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAEjB,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,IAAI,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,GAAG,EAAE,GAAG,CAAC;CACV;AAED,6DAA6D;AAC7D,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,SAAS,GAAE,QAAQ,GAAG,WAAyB,GAC9C,qBAAqB,CAyBvB;AAED,KAAK,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,iBAAiB,GAAG,OAAO,CAAC,CAAC;AACpG,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC7B,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,WAAW,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AA4B7B,wBAAgB,cAAc,CAC5B,SAAS,EAAE,GAAG,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC7B,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,GAAG,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { fileURLToPath } from "node:url";
|
|
|
3
3
|
import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
|
|
4
4
|
import { serveEmseepea } from "@emseepea/server";
|
|
5
5
|
export { createMcpAppHostSimulator, } from "./mcp-app-host.js";
|
|
6
|
+
export { assertPublishedMcpContractCompatible, comparePublishedMcpContracts, extractPublishedMcpContract, writePublishedMcpContractBaseline, } from "./published-contract.js";
|
|
6
7
|
/** Test-only verifier. Never use it in a deployed server. */
|
|
7
8
|
export function insecureTestAuthentication(permissions, discovery = "protected") {
|
|
8
9
|
const resourceServerUrl = new URL("https://test.example/mcp");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,aAAa,EAA8B,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EACL,yBAAyB,GAI1B,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,aAAa,EAA8B,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EACL,yBAAyB,GAI1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oCAAoC,EACpC,4BAA4B,EAC5B,2BAA2B,EAC3B,iCAAiC,GAMlC,MAAM,yBAAyB,CAAC;AA6BjC,6DAA6D;AAC7D,MAAM,UAAU,0BAA0B,CACxC,WAA8B,EAC9B,YAAoC,WAAW;IAE/C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC9D,OAAO;QACL,SAAS;QACT,QAAQ,EAAE;YACR,KAAK,CAAC,iBAAiB,CAAC,KAAK;gBAC3B,OAAO;oBACL,KAAK;oBACL,QAAQ,EAAE,sBAAsB;oBAChC,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC;oBACxB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE;oBAC9C,QAAQ,EAAE,iBAAiB;iBAC5B,CAAC;YACJ,CAAC;SACF;QACD,QAAQ,EAAE;YACR,iBAAiB;YACjB,aAAa,EAAE;gBACb,MAAM,EAAE,2BAA2B;gBACnC,sBAAsB,EAAE,qCAAqC;gBAC7D,cAAc,EAAE,iCAAiC;gBACjD,wBAAwB,EAAE,CAAC,MAAM,CAAC;aACnC;SACF;KACF,CAAC;AACJ,CAAC;AAcD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAoC,EACpC,eAAmD,EAAE,EACrD,kBAAwC,EAAE;IAE1C,MAAM,YAAY,GAAG,OAAQ,YAAqC,CAAC,MAAM,KAAK,UAAU,CAAC;IACzF,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,SAAwB,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,YAA2B,CAAC,CAAC,CAAC,SAAwB,CAAC;IAClF,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAoC,CAAC;IACtF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO;QACL,GAAG,OAAO;QACV,KAAK;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvD,OAAO,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CACzC,OAAO,CAAC,GAAG,EACX,OAAO,EACP,OAAO,CAAC,UAAU,EAClB,KAAK,EACL,OAAO,CAAC,eAAe,CACxB;KACF,CAAC;AACJ,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,eAAkC,EAClC,qBAAkD,EAAE,EACpD,kBAAyC,EAAE;IAE3C,MAAM,YAAY,GAAG,CAAC,CAAC,eAAe,YAAY,GAAG,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,eAA8B,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,kBAAyB,CAAC,CAAC,CAAC,eAAe,CAAC;IAC7E,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAA2C,CAAC;IAC7F,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE;QAChE,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,GAAG;YACT,GAAG,OAAO,CAAC,WAAW;SACvB;QACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IACH,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7F,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,KAAW,EAAE,EAAE;YAC5C,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;iBACpB,IAAI,KAAK;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC7D,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1G,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC,EAClE,OAAO,CAAC,gBAAgB,IAAI,MAAM,CACnC,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;QAChC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAEnB,OAAO;QACL,KAAK;QACL,GAAG;QACH,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/D,OAAO,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CACzC,GAAG,EACH,OAAO,EACP,OAAO,CAAC,UAAU,EAClB,KAAK,EACL,OAAO,CAAC,eAAe,CACxB;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,GAAQ,EACR,OAAiB,EACjB,UAAU,GAAG,eAAe,EAC5B,KAAc,EACd,kBAA4C,YAAY;IAExD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EACtC,eAAe,KAAK,YAAY;QAC9B,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE;QAC5D,CAAC,CAAC,EAAE,yBAAyB,EAAE,CAAC,eAAe,CAAC,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAC7F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,6BAA6B,CACpD,GAAG,EACH,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CACnE,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAAiB,EAAE,IAAyB;IAC/D,IAAI,OAAkC,CAAC;IACvC,OAAO,GAAG,EAAE,CAAC,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAA+B;IACxD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO;IACpC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,MAAM,OAAO,CAAC,IAAI,CAAC;QACjB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAC3D,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
type JsonObject = Readonly<Record<string, unknown>>;
|
|
2
|
+
export interface PublishedMcpResource extends JsonObject {
|
|
3
|
+
readonly uri: string;
|
|
4
|
+
readonly contents: readonly JsonObject[];
|
|
5
|
+
}
|
|
6
|
+
export interface PublishedMcpContract {
|
|
7
|
+
readonly tools: readonly JsonObject[];
|
|
8
|
+
readonly resources: readonly PublishedMcpResource[];
|
|
9
|
+
}
|
|
10
|
+
export interface PublishedMcpContractBaseline {
|
|
11
|
+
readonly version: string;
|
|
12
|
+
readonly contract: PublishedMcpContract;
|
|
13
|
+
}
|
|
14
|
+
export interface PublishedMcpContractBreak {
|
|
15
|
+
readonly version: string;
|
|
16
|
+
readonly kind: string;
|
|
17
|
+
readonly path: string;
|
|
18
|
+
readonly detail: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PublishedMcpContractClient {
|
|
21
|
+
listTools(params?: {
|
|
22
|
+
cursor?: string;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
tools: unknown[];
|
|
25
|
+
nextCursor?: string;
|
|
26
|
+
}>;
|
|
27
|
+
listResources(params?: {
|
|
28
|
+
cursor?: string;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
resources: unknown[];
|
|
31
|
+
nextCursor?: string;
|
|
32
|
+
}>;
|
|
33
|
+
readResource(params: {
|
|
34
|
+
uri: string;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
contents: unknown[];
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
/** Extracts the effective public contract visible to the connected MCP principal. */
|
|
40
|
+
export declare function extractPublishedMcpContract(client: PublishedMcpContractClient): Promise<PublishedMcpContract>;
|
|
41
|
+
/** Writes a byte-stable, version-labelled baseline. */
|
|
42
|
+
export declare function writePublishedMcpContractBaseline(file: string, baseline: PublishedMcpContractBaseline): Promise<void>;
|
|
43
|
+
/** Returns every breaking or unclassified change against every supplied baseline. */
|
|
44
|
+
export declare function comparePublishedMcpContracts(current: PublishedMcpContract, baselines: readonly [PublishedMcpContractBaseline, ...PublishedMcpContractBaseline[]]): PublishedMcpContractBreak[];
|
|
45
|
+
/** Throws with concrete diagnostics so an ordinary Node script exits non-zero. */
|
|
46
|
+
export declare function assertPublishedMcpContractCompatible(current: PublishedMcpContract, baselines: readonly [PublishedMcpContractBaseline, ...PublishedMcpContractBaseline[]]): void;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=published-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"published-contract.d.ts","sourceRoot":"","sources":["../src/published-contract.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpD,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5F,aAAa,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,YAAY,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;CACzE;AAED,qFAAqF;AACrF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAuB/B;AAED,uDAAuD;AACvD,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,4BAA4B,GACrC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,qFAAqF;AACrF,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,SAAS,CAAC,4BAA4B,EAAE,GAAG,4BAA4B,EAAE,CAAC,GACpF,yBAAyB,EAAE,CAG7B;AAED,kFAAkF;AAClF,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,SAAS,CAAC,4BAA4B,EAAE,GAAG,4BAA4B,EAAE,CAAC,GACpF,IAAI,CAON"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
/** Extracts the effective public contract visible to the connected MCP principal. */
|
|
4
|
+
export async function extractPublishedMcpContract(client) {
|
|
5
|
+
const tools = await collectPages("tools", (cursor) => client.listTools(cursor ? { cursor } : undefined));
|
|
6
|
+
const listedResources = await collectPages("resources", (cursor) => client.listResources(cursor ? { cursor } : undefined));
|
|
7
|
+
const resources = await Promise.all(listedResources.map(async (resource) => {
|
|
8
|
+
if (typeof resource.uri !== "string")
|
|
9
|
+
throw new TypeError("Listed resource has no URI");
|
|
10
|
+
const read = await client.readResource({ uri: resource.uri });
|
|
11
|
+
const contents = read.contents.map((content) => {
|
|
12
|
+
if (!isObject(content))
|
|
13
|
+
throw new TypeError(`Resource ${resource.uri} returned invalid content`);
|
|
14
|
+
const { uri, mimeType, _meta } = content;
|
|
15
|
+
return { uri, mimeType, _meta };
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
...resource,
|
|
19
|
+
contents,
|
|
20
|
+
};
|
|
21
|
+
}));
|
|
22
|
+
return canonicalize({
|
|
23
|
+
tools: tools.toSorted(compareBy("name")),
|
|
24
|
+
resources: resources.toSorted(compareBy("uri")),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Writes a byte-stable, version-labelled baseline. */
|
|
28
|
+
export async function writePublishedMcpContractBaseline(file, baseline) {
|
|
29
|
+
await mkdir(dirname(file), { recursive: true });
|
|
30
|
+
await writeFile(file, `${JSON.stringify(canonicalize(baseline), null, 2)}\n`);
|
|
31
|
+
}
|
|
32
|
+
/** Returns every breaking or unclassified change against every supplied baseline. */
|
|
33
|
+
export function comparePublishedMcpContracts(current, baselines) {
|
|
34
|
+
if (baselines.length === 0)
|
|
35
|
+
throw new TypeError("At least one published MCP contract baseline is required");
|
|
36
|
+
return baselines.flatMap(({ version, contract }) => compareContract(version, contract, current));
|
|
37
|
+
}
|
|
38
|
+
/** Throws with concrete diagnostics so an ordinary Node script exits non-zero. */
|
|
39
|
+
export function assertPublishedMcpContractCompatible(current, baselines) {
|
|
40
|
+
const breaks = comparePublishedMcpContracts(current, baselines);
|
|
41
|
+
if (breaks.length === 0)
|
|
42
|
+
return;
|
|
43
|
+
throw new Error([
|
|
44
|
+
`Published MCP contract has ${breaks.length} breaking change(s):`,
|
|
45
|
+
...breaks.map(({ version, kind, path, detail }) => `- [${version}] [${kind}] ${path}: ${detail}`),
|
|
46
|
+
].join("\n"));
|
|
47
|
+
}
|
|
48
|
+
async function collectPages(key, list) {
|
|
49
|
+
const values = [];
|
|
50
|
+
const cursors = new Set();
|
|
51
|
+
let cursor;
|
|
52
|
+
do {
|
|
53
|
+
const page = await list(cursor);
|
|
54
|
+
for (const value of page[key]) {
|
|
55
|
+
if (!isObject(value))
|
|
56
|
+
throw new TypeError(`${key} discovery returned an invalid entry`);
|
|
57
|
+
values.push(value);
|
|
58
|
+
}
|
|
59
|
+
cursor = page.nextCursor;
|
|
60
|
+
if (cursor && cursors.has(cursor))
|
|
61
|
+
throw new Error(`${key} pagination repeated cursor ${cursor}`);
|
|
62
|
+
if (cursor)
|
|
63
|
+
cursors.add(cursor);
|
|
64
|
+
} while (cursor);
|
|
65
|
+
return values;
|
|
66
|
+
}
|
|
67
|
+
function compareContract(version, baseline, current) {
|
|
68
|
+
const breaks = [];
|
|
69
|
+
const add = (kind, path, detail) => breaks.push({ version, kind, path, detail });
|
|
70
|
+
for (const tool of baseline.tools) {
|
|
71
|
+
const name = String(tool.name);
|
|
72
|
+
const next = current.tools.find((candidate) => candidate.name === tool.name);
|
|
73
|
+
if (!next) {
|
|
74
|
+
add("tool-removed", `tools.${name}`, "tool is absent");
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
compareSchema(tool.inputSchema, next.inputSchema, "input", `tools.${name}.inputSchema`, add);
|
|
78
|
+
compareSchema(tool.outputSchema, next.outputSchema, "output", `tools.${name}.outputSchema`, add);
|
|
79
|
+
compareUiMetadata(tool._meta, next._meta, `tools.${name}._meta`, add);
|
|
80
|
+
comparePublicFields(tool, next, new Set(["name", "inputSchema", "outputSchema", "_meta"]), `tools.${name}`, add);
|
|
81
|
+
}
|
|
82
|
+
for (const resource of baseline.resources) {
|
|
83
|
+
const next = current.resources.find((candidate) => candidate.uri === resource.uri);
|
|
84
|
+
if (!next) {
|
|
85
|
+
add("resource-removed", `resources.${resource.uri}`, "resource is absent");
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (resource.mimeType !== next.mimeType) {
|
|
89
|
+
add("mime-type-changed", `resources.${resource.uri}.mimeType`, `${show(resource.mimeType)} -> ${show(next.mimeType)}`);
|
|
90
|
+
}
|
|
91
|
+
compareUiMetadata(resource._meta, next._meta, `resources.${resource.uri}._meta`, add);
|
|
92
|
+
comparePublicFields(resource, next, new Set(["uri", "mimeType", "_meta", "contents"]), `resources.${resource.uri}`, add);
|
|
93
|
+
for (const [index, content] of resource.contents.entries()) {
|
|
94
|
+
const nextContent = next.contents[index];
|
|
95
|
+
const path = `resources.${resource.uri}.contents[${index}]`;
|
|
96
|
+
if (!nextContent) {
|
|
97
|
+
add("resource-content-removed", path, "content is absent");
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (content.uri !== nextContent.uri) {
|
|
101
|
+
add("resource-uri-changed", `${path}.uri`, `${show(content.uri)} -> ${show(nextContent.uri)}`);
|
|
102
|
+
}
|
|
103
|
+
if (content.mimeType !== nextContent.mimeType) {
|
|
104
|
+
add("mime-type-changed", `${path}.mimeType`, `${show(content.mimeType)} -> ${show(nextContent.mimeType)}`);
|
|
105
|
+
}
|
|
106
|
+
compareUiMetadata(content._meta, nextContent._meta, `${path}._meta`, add);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return breaks;
|
|
110
|
+
}
|
|
111
|
+
function comparePublicFields(before, after, ignored, path, add) {
|
|
112
|
+
for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {
|
|
113
|
+
if (!ignored.has(key) && !equal(before[key], after[key])) {
|
|
114
|
+
add("contract-field-changed", `${path}.${key}`, `${show(before[key])} -> ${show(after[key])}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function compareSchema(baselineValue, currentValue, direction, path, add) {
|
|
119
|
+
if (baselineValue === undefined)
|
|
120
|
+
return;
|
|
121
|
+
if (!isObject(baselineValue) || !isObject(currentValue)) {
|
|
122
|
+
if (!equal(baselineValue, currentValue))
|
|
123
|
+
add("schema-changed", path, `${show(baselineValue)} -> ${show(currentValue)}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const baseline = baselineValue;
|
|
127
|
+
const current = currentValue;
|
|
128
|
+
compareSetConstraint("type", baseline.type, current.type, direction, path, add);
|
|
129
|
+
compareSetConstraint("enum", baseline.enum, current.enum, direction, path, add);
|
|
130
|
+
compareSetConstraint("const", baseline.const === undefined ? undefined : [baseline.const], current.const === undefined ? undefined : [current.const], direction, path, add);
|
|
131
|
+
compareBounds(baseline, current, direction, path, add);
|
|
132
|
+
comparePattern(baseline.pattern, current.pattern, direction, path, add);
|
|
133
|
+
compareMultipleOf(baseline.multipleOf, current.multipleOf, direction, path, add);
|
|
134
|
+
compareBooleanConstraint("uniqueItems", baseline.uniqueItems, current.uniqueItems, direction, path, add);
|
|
135
|
+
compareAdditionalProperties(baseline.additionalProperties, current.additionalProperties, direction, path, add);
|
|
136
|
+
const baselineProperties = isObject(baseline.properties) ? baseline.properties : {};
|
|
137
|
+
const currentProperties = isObject(current.properties) ? current.properties : {};
|
|
138
|
+
for (const [name, schema] of Object.entries(baselineProperties)) {
|
|
139
|
+
if (!(name in currentProperties))
|
|
140
|
+
add("field-removed", `${path}.properties.${name}`, "field is absent");
|
|
141
|
+
else
|
|
142
|
+
compareSchema(schema, currentProperties[name], direction, `${path}.properties.${name}`, add);
|
|
143
|
+
}
|
|
144
|
+
if (direction === "output" && baseline.additionalProperties === false) {
|
|
145
|
+
for (const name of Object.keys(currentProperties)) {
|
|
146
|
+
if (!(name in baselineProperties))
|
|
147
|
+
add("output-field-added", `${path}.properties.${name}`, "baseline rejects this field");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const baselineRequired = stringSet(baseline.required);
|
|
151
|
+
const currentRequired = stringSet(current.required);
|
|
152
|
+
const newlyIncompatible = direction === "input"
|
|
153
|
+
? [...currentRequired].filter((name) => !baselineRequired.has(name))
|
|
154
|
+
: [...baselineRequired].filter((name) => !currentRequired.has(name));
|
|
155
|
+
for (const name of newlyIncompatible) {
|
|
156
|
+
add(direction === "input" ? "input-field-now-required" : "output-field-now-optional", `${path}.properties.${name}`, "required fields changed incompatibly");
|
|
157
|
+
}
|
|
158
|
+
if (baseline.items !== undefined)
|
|
159
|
+
compareSchema(baseline.items, current.items, direction, `${path}.items`, add);
|
|
160
|
+
const handled = new Set([
|
|
161
|
+
"$schema", "$id", "$comment", "title", "description", "default", "examples", "deprecated", "readOnly", "writeOnly",
|
|
162
|
+
"type", "enum", "const", "minimum", "exclusiveMinimum", "maximum", "exclusiveMaximum", "minLength", "maxLength",
|
|
163
|
+
"minItems", "maxItems", "minProperties", "maxProperties", "pattern", "multipleOf", "uniqueItems", "additionalProperties",
|
|
164
|
+
"properties", "required", "items",
|
|
165
|
+
]);
|
|
166
|
+
for (const key of new Set([...Object.keys(baseline), ...Object.keys(current)])) {
|
|
167
|
+
if (!handled.has(key) && !equal(baseline[key], current[key])) {
|
|
168
|
+
add("unclassified-schema-change", `${path}.${key}`, `${show(baseline[key])} -> ${show(current[key])}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function compareSetConstraint(name, baselineValue, currentValue, direction, path, add) {
|
|
173
|
+
if (baselineValue === undefined && currentValue === undefined)
|
|
174
|
+
return;
|
|
175
|
+
if ((direction === "input" && baselineValue === undefined)
|
|
176
|
+
|| (direction === "output" && currentValue === undefined)) {
|
|
177
|
+
add(`${direction}-${name}-changed`, `${path}.${name}`, `${show(baselineValue)} -> ${show(currentValue)}`);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if ((direction === "input" && currentValue === undefined)
|
|
181
|
+
|| (direction === "output" && baselineValue === undefined))
|
|
182
|
+
return;
|
|
183
|
+
const baseline = valueSet(baselineValue);
|
|
184
|
+
const current = valueSet(currentValue);
|
|
185
|
+
const required = direction === "input" ? baseline : current;
|
|
186
|
+
const available = direction === "input" ? current : baseline;
|
|
187
|
+
if (required && (!available || [...required].some((value) => !available.has(value)))) {
|
|
188
|
+
add(`${direction}-${name}-changed`, `${path}.${name}`, `${show(baselineValue)} -> ${show(currentValue)}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function compareBounds(baseline, current, direction, path, add) {
|
|
192
|
+
for (const [key, lower] of [
|
|
193
|
+
["minimum", true], ["exclusiveMinimum", true], ["minLength", true], ["minItems", true], ["minProperties", true],
|
|
194
|
+
["maximum", false], ["exclusiveMaximum", false], ["maxLength", false], ["maxItems", false], ["maxProperties", false],
|
|
195
|
+
]) {
|
|
196
|
+
const before = typeof baseline[key] === "number" ? baseline[key] : undefined;
|
|
197
|
+
const after = typeof current[key] === "number" ? current[key] : undefined;
|
|
198
|
+
const tighter = lower
|
|
199
|
+
? after !== undefined && (before === undefined || after > before)
|
|
200
|
+
: after !== undefined && (before === undefined || after < before);
|
|
201
|
+
const wider = lower
|
|
202
|
+
? before !== undefined && (after === undefined || after < before)
|
|
203
|
+
: before !== undefined && (after === undefined || after > before);
|
|
204
|
+
if ((direction === "input" && tighter) || (direction === "output" && wider)) {
|
|
205
|
+
add(`${direction}-constraint-changed`, `${path}.${key}`, `${show(before)} -> ${show(after)}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function comparePattern(before, after, direction, path, add) {
|
|
210
|
+
if (before === after)
|
|
211
|
+
return;
|
|
212
|
+
if ((direction === "input" && after !== undefined) || (direction === "output" && before !== undefined)) {
|
|
213
|
+
add(`${direction}-pattern-changed`, `${path}.pattern`, `${show(before)} -> ${show(after)}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function compareMultipleOf(before, after, direction, path, add) {
|
|
217
|
+
if (before === after)
|
|
218
|
+
return;
|
|
219
|
+
const beforeNumber = typeof before === "number" && before > 0 ? before : undefined;
|
|
220
|
+
const afterNumber = typeof after === "number" && after > 0 ? after : undefined;
|
|
221
|
+
const compatible = direction === "input"
|
|
222
|
+
? afterNumber === undefined || (beforeNumber !== undefined && isIntegerRatio(beforeNumber, afterNumber))
|
|
223
|
+
: beforeNumber === undefined || (afterNumber !== undefined && isIntegerRatio(afterNumber, beforeNumber));
|
|
224
|
+
if (!compatible)
|
|
225
|
+
add(`${direction}-multiple-of-changed`, `${path}.multipleOf`, `${show(before)} -> ${show(after)}`);
|
|
226
|
+
}
|
|
227
|
+
function compareBooleanConstraint(name, before, after, direction, path, add) {
|
|
228
|
+
const incompatible = direction === "input" ? before !== true && after === true : before === true && after !== true;
|
|
229
|
+
if (incompatible)
|
|
230
|
+
add(`${direction}-${name}-changed`, `${path}.${name}`, `${show(before)} -> ${show(after)}`);
|
|
231
|
+
}
|
|
232
|
+
function compareAdditionalProperties(before, after, direction, path, add) {
|
|
233
|
+
if (equal(before, after))
|
|
234
|
+
return;
|
|
235
|
+
const beforeAllows = before !== false;
|
|
236
|
+
const afterAllows = after !== false;
|
|
237
|
+
const incompatible = direction === "input" ? beforeAllows && !afterAllows : !beforeAllows && afterAllows;
|
|
238
|
+
if (incompatible)
|
|
239
|
+
add(`${direction}-additional-properties-changed`, `${path}.additionalProperties`, `${show(before)} -> ${show(after)}`);
|
|
240
|
+
else if (isObject(before) || isObject(after))
|
|
241
|
+
add("unclassified-schema-change", `${path}.additionalProperties`, `${show(before)} -> ${show(after)}`);
|
|
242
|
+
}
|
|
243
|
+
function compareUiMetadata(beforeValue, afterValue, path, add) {
|
|
244
|
+
const before = isObject(beforeValue) ? beforeValue : {};
|
|
245
|
+
const after = isObject(afterValue) ? afterValue : {};
|
|
246
|
+
const beforeUi = isObject(before.ui) ? before.ui : {};
|
|
247
|
+
const afterUi = isObject(after.ui) ? after.ui : {};
|
|
248
|
+
const beforeContract = {
|
|
249
|
+
...before,
|
|
250
|
+
ui: { ...beforeUi, csp: undefined },
|
|
251
|
+
"openai/outputTemplate": undefined,
|
|
252
|
+
"openai/widgetCSP": undefined,
|
|
253
|
+
};
|
|
254
|
+
const afterContract = {
|
|
255
|
+
...after,
|
|
256
|
+
ui: { ...afterUi, csp: undefined },
|
|
257
|
+
"openai/outputTemplate": undefined,
|
|
258
|
+
"openai/widgetCSP": undefined,
|
|
259
|
+
};
|
|
260
|
+
if (!equal(beforeContract, afterContract))
|
|
261
|
+
add("ui-metadata-changed", path, `${show(beforeContract)} -> ${show(afterContract)}`);
|
|
262
|
+
if (before["openai/outputTemplate"] !== after["openai/outputTemplate"]) {
|
|
263
|
+
add("output-template-changed", `${path}.openai/outputTemplate`, `${show(before["openai/outputTemplate"])} -> ${show(after["openai/outputTemplate"])}`);
|
|
264
|
+
}
|
|
265
|
+
compareCsp(beforeUi.csp, afterUi.csp, `${path}.ui.csp`, add);
|
|
266
|
+
compareCsp(before["openai/widgetCSP"], after["openai/widgetCSP"], `${path}.openai/widgetCSP`, add);
|
|
267
|
+
}
|
|
268
|
+
function compareCsp(beforeValue, afterValue, path, add) {
|
|
269
|
+
const before = isObject(beforeValue) ? beforeValue : {};
|
|
270
|
+
const after = isObject(afterValue) ? afterValue : {};
|
|
271
|
+
for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {
|
|
272
|
+
const allowed = valueSet(before[key]) ?? new Set();
|
|
273
|
+
for (const value of valueSet(after[key]) ?? []) {
|
|
274
|
+
if (!allowed.has(value))
|
|
275
|
+
add("csp-widened", `${path}.${key}`, `${String(value)} was added`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function canonicalize(value) {
|
|
280
|
+
if (Array.isArray(value))
|
|
281
|
+
return value.map(canonicalize);
|
|
282
|
+
if (!isObject(value))
|
|
283
|
+
return value;
|
|
284
|
+
return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => [key, canonicalize(item)]));
|
|
285
|
+
}
|
|
286
|
+
function compareBy(key) {
|
|
287
|
+
return (left, right) => String(left[key]).localeCompare(String(right[key]));
|
|
288
|
+
}
|
|
289
|
+
function valueSet(value) {
|
|
290
|
+
if (value === undefined)
|
|
291
|
+
return undefined;
|
|
292
|
+
return new Set(Array.isArray(value) ? value.map(show) : [show(value)]);
|
|
293
|
+
}
|
|
294
|
+
function stringSet(value) {
|
|
295
|
+
return new Set(Array.isArray(value) ? value.filter((item) => typeof item === "string") : []);
|
|
296
|
+
}
|
|
297
|
+
function isIntegerRatio(left, right) {
|
|
298
|
+
return Math.abs(left / right - Math.round(left / right)) < Number.EPSILON * 10;
|
|
299
|
+
}
|
|
300
|
+
function isObject(value) {
|
|
301
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
302
|
+
}
|
|
303
|
+
function equal(left, right) {
|
|
304
|
+
return show(canonicalize(left)) === show(canonicalize(right));
|
|
305
|
+
}
|
|
306
|
+
function show(value) {
|
|
307
|
+
return JSON.stringify(value) ?? String(value);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=published-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"published-contract.js","sourceRoot":"","sources":["../src/published-contract.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emseepea/testing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "MCP integration and semantic testing helpers",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"test:built": "node --test test/*.test.mjs"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@emseepea/server": "0.12.
|
|
44
|
+
"@emseepea/server": "0.12.1",
|
|
45
45
|
"@modelcontextprotocol/client": "2.0.0"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|