@apollo/mcp-impostor-host 0.1.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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/bin/serve-impostor-host.js +2 -0
  3. package/dist/core/Host.d.ts +16 -0
  4. package/dist/core/Host.d.ts.map +1 -0
  5. package/dist/core/Host.js +56 -0
  6. package/dist/core/Host.js.map +1 -0
  7. package/dist/core/HostConnection.d.ts +71 -0
  8. package/dist/core/HostConnection.d.ts.map +1 -0
  9. package/dist/core/HostConnection.js +57 -0
  10. package/dist/core/HostConnection.js.map +1 -0
  11. package/dist/core/index.d.ts +3 -0
  12. package/dist/core/index.d.ts.map +1 -0
  13. package/dist/core/index.js +2 -0
  14. package/dist/core/index.js.map +1 -0
  15. package/dist/playwright/fixture.d.ts +24 -0
  16. package/dist/playwright/fixture.d.ts.map +1 -0
  17. package/dist/playwright/fixture.js +27 -0
  18. package/dist/playwright/fixture.js.map +1 -0
  19. package/dist/playwright/harness/harness.html +213 -0
  20. package/dist/playwright/index.d.ts +3 -0
  21. package/dist/playwright/index.d.ts.map +1 -0
  22. package/dist/playwright/index.js +2 -0
  23. package/dist/playwright/index.js.map +1 -0
  24. package/dist/playwright/types.d.ts +11 -0
  25. package/dist/playwright/types.d.ts.map +1 -0
  26. package/dist/playwright/types.js +2 -0
  27. package/dist/playwright/types.js.map +1 -0
  28. package/dist/react/Sandbox.d.ts +10 -0
  29. package/dist/react/Sandbox.d.ts.map +1 -0
  30. package/dist/react/Sandbox.js +109 -0
  31. package/dist/react/Sandbox.js.map +1 -0
  32. package/dist/react/index.d.ts +2 -0
  33. package/dist/react/index.d.ts.map +1 -0
  34. package/dist/react/index.js +2 -0
  35. package/dist/react/index.js.map +1 -0
  36. package/dist/sandbox/sandbox.html +119 -0
  37. package/dist/sandbox/server.js +77 -0
  38. package/dist/utilities/TypedEventTarget.d.ts +19 -0
  39. package/dist/utilities/TypedEventTarget.d.ts.map +1 -0
  40. package/dist/utilities/TypedEventTarget.js +5 -0
  41. package/dist/utilities/TypedEventTarget.js.map +1 -0
  42. package/dist/utilities/constants.d.ts +2 -0
  43. package/dist/utilities/constants.d.ts.map +1 -0
  44. package/dist/utilities/constants.js +8 -0
  45. package/dist/utilities/constants.js.map +1 -0
  46. package/dist/utilities/index.d.ts +6 -0
  47. package/dist/utilities/index.d.ts.map +1 -0
  48. package/dist/utilities/index.js +5 -0
  49. package/dist/utilities/index.js.map +1 -0
  50. package/dist/utilities/invariant.d.ts +2 -0
  51. package/dist/utilities/invariant.d.ts.map +1 -0
  52. package/dist/utilities/invariant.js +5 -0
  53. package/dist/utilities/invariant.js.map +1 -0
  54. package/dist/utilities/logger.d.ts +24 -0
  55. package/dist/utilities/logger.d.ts.map +1 -0
  56. package/dist/utilities/logger.js +33 -0
  57. package/dist/utilities/logger.js.map +1 -0
  58. package/dist/utilities/promiseWithResolvers.d.ts +7 -0
  59. package/dist/utilities/promiseWithResolvers.d.ts.map +1 -0
  60. package/dist/utilities/promiseWithResolvers.js +15 -0
  61. package/dist/utilities/promiseWithResolvers.js.map +1 -0
  62. package/package.json +98 -0
@@ -0,0 +1,19 @@
1
+ type TypedEventListener<TEvent extends Event> = (event: TEvent) => void;
2
+ interface TypedEventListenerObject<TEvent extends Event> {
3
+ handleEvent: (event: TEvent) => void;
4
+ }
5
+ type TypedEventListenerOrEventListenerObject<TEvent extends Event> = TypedEventListener<TEvent> | TypedEventListenerObject<TEvent>;
6
+ type TypedEventMap<T> = {
7
+ [K in keyof T]: T[K];
8
+ };
9
+ export interface TypedEventTarget<TEventMap extends TypedEventMap<TEventMap>> {
10
+ addEventListener: <T extends keyof TEventMap & string>(type: T, callback: TypedEventListenerOrEventListenerObject<TEventMap[T]> | null, options?: AddEventListenerOptions | boolean) => void;
11
+ removeEventListener: <T extends keyof TEventMap & string>(type: T, callback: TypedEventListenerOrEventListenerObject<TEventMap[T]> | null, options?: EventListenerOptions | boolean) => void;
12
+ /** @deprecated Use `dispatchTypedEvent` for better type safety */
13
+ dispatchEvent: (event: Event) => boolean;
14
+ }
15
+ export declare class TypedEventTarget<TEventMap extends TypedEventMap<TEventMap>> extends EventTarget {
16
+ dispatchTypedEvent<T extends keyof TEventMap>(_type: T, event: TEventMap[T]): boolean;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=TypedEventTarget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypedEventTarget.d.ts","sourceRoot":"","sources":["../../src/utilities/TypedEventTarget.ts"],"names":[],"mappings":"AACA,KAAK,kBAAkB,CAAC,MAAM,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAExE,UAAU,wBAAwB,CAAC,MAAM,SAAS,KAAK;IACrD,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,KAAK,uCAAuC,CAAC,MAAM,SAAS,KAAK,IAC7D,kBAAkB,CAAC,MAAM,CAAC,GAC1B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAIrC,KAAK,aAAa,CAAC,CAAC,IAAI;KACrB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,gBAAgB,CAAC,SAAS,SAAS,aAAa,CAAC,SAAS,CAAC;IAC1E,gBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,EACnD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,uCAAuC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EACtE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,KACxC,IAAI,CAAC;IAEV,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,EACtD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,uCAAuC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EACtE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,KACrC,IAAI,CAAC;IAEV,kEAAkE;IAClE,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;CAC1C;AAED,qBAAa,gBAAgB,CAC3B,SAAS,SAAS,aAAa,CAAC,SAAS,CAAC,CAC1C,SAAQ,WAAW;IACnB,kBAAkB,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;CAG5E"}
@@ -0,0 +1,5 @@
1
+ export class TypedEventTarget extends EventTarget {
2
+ dispatchTypedEvent(_type, event) {
3
+ return super.dispatchEvent(event);
4
+ }
5
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypedEventTarget.js","sourceRoot":"","sources":["../../src/utilities/TypedEventTarget.ts"],"names":[],"mappings":"AAkCA,MAAM,OAAO,gBAEX,SAAQ,WAAW;IACnB,kBAAkB,CAA4B,KAAQ,EAAE,KAAmB;QACzE,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare const DEFAULT_CSP: string;
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utilities/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAOZ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_CSP = [
2
+ "default-src 'none'",
3
+ "script-src 'self' 'unsafe-inline'",
4
+ "style-src 'self' 'unsafe-inline'",
5
+ "img-src 'self' data:",
6
+ "media-src 'self' data:",
7
+ "connect-src 'none'",
8
+ ].join("; ");
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utilities/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,oBAAoB;IACpB,mCAAmC;IACnC,kCAAkC;IAClC,sBAAsB;IACtB,wBAAwB;IACxB,oBAAoB;CACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { DEFAULT_CSP } from "./constants.js";
2
+ export { invariant } from "./invariant.js";
3
+ export { promiseWithResolvers } from "./promiseWithResolvers.js";
4
+ export { Logger } from "./logger.js";
5
+ export { TypedEventTarget } from "./TypedEventTarget.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { DEFAULT_CSP } from "./constants.js";
2
+ export { invariant } from "./invariant.js";
3
+ export { promiseWithResolvers } from "./promiseWithResolvers.js";
4
+ export { Logger } from "./logger.js";
5
+ export { TypedEventTarget } from "./TypedEventTarget.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function invariant(condition: unknown, message: string): asserts condition;
2
+ //# sourceMappingURL=invariant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant.d.ts","sourceRoot":"","sources":["../../src/utilities/invariant.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CACvB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAInB"}
@@ -0,0 +1,5 @@
1
+ export function invariant(condition, message) {
2
+ if (!condition) {
3
+ throw new Error(`[@apollo/mcp-impostor-host] ${message}`);
4
+ }
5
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant.js","sourceRoot":"","sources":["../../src/utilities/invariant.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CACvB,SAAkB,EAClB,OAAe;IAEf,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ export declare namespace Logger {
2
+ interface Options {
3
+ level?: keyof typeof LEVEL | undefined;
4
+ }
5
+ }
6
+ declare const LEVEL: {
7
+ readonly debug: 0;
8
+ readonly info: 1;
9
+ readonly warn: 2;
10
+ readonly error: 3;
11
+ };
12
+ export declare namespace Logger {
13
+ type Level = keyof typeof LEVEL;
14
+ }
15
+ export declare class Logger {
16
+ #private;
17
+ constructor(options?: Logger.Options);
18
+ debug(...data: unknown[]): void;
19
+ info(...data: unknown[]): void;
20
+ warn(...data: unknown[]): void;
21
+ error(...data: unknown[]): void;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utilities/logger.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,UAAiB,OAAO;QACtB,KAAK,CAAC,EAAE,MAAM,OAAO,KAAK,GAAG,SAAS,CAAC;KACxC;CACF;AAED,QAAA,MAAM,KAAK;;;;;CAKD,CAAC;AAIX,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,KAAK,GAAG,MAAM,OAAO,KAAK,CAAC;CACxC;AAED,qBAAa,MAAM;;gBAGL,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO;IAIpC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAMxB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAMvB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAMvB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;CAKzB"}
@@ -0,0 +1,33 @@
1
+ const LEVEL = {
2
+ debug: 0,
3
+ info: 1,
4
+ warn: 2,
5
+ error: 3,
6
+ };
7
+ const PREFIX = "[@apollo/mcp-impostor-host]";
8
+ export class Logger {
9
+ #level;
10
+ constructor(options) {
11
+ this.#level = LEVEL[options?.level ?? "info"];
12
+ }
13
+ debug(...data) {
14
+ if (this.#level <= LEVEL.debug) {
15
+ console.debug(PREFIX, ...data);
16
+ }
17
+ }
18
+ info(...data) {
19
+ if (this.#level <= LEVEL.info) {
20
+ console.log(PREFIX, ...data);
21
+ }
22
+ }
23
+ warn(...data) {
24
+ if (this.#level <= LEVEL.warn) {
25
+ console.warn(PREFIX, ...data);
26
+ }
27
+ }
28
+ error(...data) {
29
+ if (this.#level <= LEVEL.error) {
30
+ console.error(PREFIX, ...data);
31
+ }
32
+ }
33
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utilities/logger.ts"],"names":[],"mappings":"AAMA,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACA,CAAC;AAEX,MAAM,MAAM,GAAG,6BAA6B,CAAC;AAM7C,MAAM,OAAO,MAAM;IACjB,MAAM,CAAS;IAEf,YAAY,OAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /** @internal */
2
+ export declare function promiseWithResolvers<T>(): {
3
+ promise: Promise<T>;
4
+ resolve: (value: T | PromiseLike<T>) => void;
5
+ reject: (reason?: unknown) => void;
6
+ };
7
+ //# sourceMappingURL=promiseWithResolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promiseWithResolvers.d.ts","sourceRoot":"","sources":["../../src/utilities/promiseWithResolvers.ts"],"names":[],"mappings":"AAMA,gBAAgB;AAChB,wBAAgB,oBAAoB,CAAC,CAAC;;qBACd,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI;sBAC1B,OAAO,KAAK,IAAI;EAQxC"}
@@ -0,0 +1,15 @@
1
+ // Polyfill for the `Promise.withResolvers` API:
2
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers
3
+ //
4
+ // Once `Promise.withResolvers` hits widely available, we should remove this
5
+ // polyfill in favor of that API.
6
+ /** @internal */
7
+ export function promiseWithResolvers() {
8
+ let resolve;
9
+ let reject;
10
+ const promise = new Promise((res, rej) => {
11
+ resolve = res;
12
+ reject = rej;
13
+ });
14
+ return { promise, resolve, reject };
15
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promiseWithResolvers.js","sourceRoot":"","sources":["../../src/utilities/promiseWithResolvers.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,yGAAyG;AACzG,EAAE;AACF,4EAA4E;AAC5E,iCAAiC;AAEjC,gBAAgB;AAChB,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAA6C,CAAC;IAClD,IAAI,MAAmC,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,OAAO,GAAG,GAAG,CAAC;QACd,MAAM,GAAG,GAAG,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,98 @@
1
+ {
2
+ "name": "@apollo/mcp-impostor-host",
3
+ "version": "0.1.0",
4
+ "description": "A test host for MCP Apps — impersonates a real MCP Apps host (e.g. Claude Desktop) for end-to-end testing",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/core/index.js",
8
+ "module": "dist/core/index.js",
9
+ "types": "dist/core/index.d.ts",
10
+ "bin": {
11
+ "serve-impostor-host": "bin/serve-impostor-host.js"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "bin"
16
+ ],
17
+ "imports": {
18
+ "#package.json": "./package.json"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/core/index.d.ts",
23
+ "default": "./dist/core/index.js"
24
+ },
25
+ "./playwright": {
26
+ "types": "./dist/playwright/index.d.ts",
27
+ "default": "./dist/playwright/index.js"
28
+ },
29
+ "./react": {
30
+ "types": "./dist/react/index.d.ts",
31
+ "default": "./dist/react/index.js"
32
+ }
33
+ },
34
+ "scripts": {
35
+ "clean": "rimraf dist",
36
+ "prebuild": "npm run clean",
37
+ "build": "npm-run-all build:*",
38
+ "build:lib": "tsc --build tsconfig.build.json",
39
+ "build:harness": "vite build --mode harness",
40
+ "build:sandbox": "vite build --mode sandbox",
41
+ "test": "playwright test",
42
+ "typecheck": "tsc --build tsconfig.json",
43
+ "format": "prettier --write .",
44
+ "format:check": "prettier --check .",
45
+ "attw": "npm run build && attw --pack . --ignore-rules cjs-resolves-to-esm --profile node16",
46
+ "lint": "eslint .",
47
+ "changeset-publish": "npm run build && changeset publish"
48
+ },
49
+ "peerDependencies": {
50
+ "@playwright/test": ">=1.40.0",
51
+ "react": "^19.0.0",
52
+ "react-dom": "^19.0.0"
53
+ },
54
+ "peerDependenciesMeta": {
55
+ "@playwright/test": {
56
+ "optional": true
57
+ },
58
+ "react": {
59
+ "optional": true
60
+ },
61
+ "react-dom": {
62
+ "optional": true
63
+ }
64
+ },
65
+ "devDependencies": {
66
+ "@arethetypeswrong/cli": "^0.18.2",
67
+ "@changesets/changelog-github": "^0.6.0",
68
+ "@changesets/cli": "^2.30.0",
69
+ "@eslint/js": "^9.39.4",
70
+ "@hono/mcp": "^0.2.5",
71
+ "@playwright/test": "^1.59.1",
72
+ "@types/node": "^25.5.2",
73
+ "@types/react": "^19.2.14",
74
+ "@types/react-dom": "^19.2.3",
75
+ "eslint": "^9.39.4",
76
+ "eslint-plugin-import": "^2.32.0",
77
+ "eslint-plugin-react-hooks": "^7.0.1",
78
+ "globals": "^17.4.0",
79
+ "npm-run-all": "^4.1.5",
80
+ "prettier": "^3.8.1",
81
+ "react": "^19.2.4",
82
+ "react-dom": "^19.2.4",
83
+ "rimraf": "^6.1.3",
84
+ "tsx": "^4.21.0",
85
+ "typescript": "^6.0.2",
86
+ "typescript-eslint": "^8.58.1",
87
+ "vite": "^8.0.7",
88
+ "vite-plugin-singlefile": "^2.3.2",
89
+ "zod": "^4.3.6"
90
+ },
91
+ "dependencies": {
92
+ "@hono/node-server": "^1.19.13",
93
+ "@mcp-ui/client": "^7.0.0",
94
+ "@modelcontextprotocol/ext-apps": "^1.3.2",
95
+ "@modelcontextprotocol/sdk": "^1.29.0",
96
+ "hono": "^4.12.12"
97
+ }
98
+ }