@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Apollo GraphQL
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/sandbox/server.js";
@@ -0,0 +1,16 @@
1
+ import { HostConnection } from "./HostConnection.js";
2
+ import { Logger } from "../utilities/index.js";
3
+ export declare namespace Host {
4
+ interface Config {
5
+ logLevel?: Logger.Level;
6
+ }
7
+ interface ConnectOptions {
8
+ url: string;
9
+ }
10
+ }
11
+ export declare class Host {
12
+ #private;
13
+ constructor(config?: Host.Config);
14
+ connect(options: Host.ConnectOptions): Promise<HostConnection>;
15
+ }
16
+ //# sourceMappingURL=Host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Host.d.ts","sourceRoot":"","sources":["../../src/core/Host.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAa,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,UAAiB,MAAM;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;KACzB;IAED,UAAiB,cAAc;QAC7B,GAAG,EAAE,MAAM,CAAC;KACb;CACF;AAED,qBAAa,IAAI;;gBAKH,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM;IAW1B,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc;CAoD3C"}
@@ -0,0 +1,56 @@
1
+ import { UI_EXTENSION_CAPABILITIES } from "@mcp-ui/client";
2
+ import { Client } from "@modelcontextprotocol/sdk/client";
3
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp";
4
+ import pkg from "#package.json" with { type: "json " };
5
+ import { HostConnection } from "./HostConnection.js";
6
+ import { invariant, Logger } from "../utilities/index.js";
7
+ export class Host {
8
+ #client;
9
+ #logger;
10
+ #connected = false;
11
+ constructor(config) {
12
+ this.#client = new Client({
13
+ name: "@apollo/mcp-impostor-host",
14
+ version: pkg.version,
15
+ }, { capabilities: { extensions: UI_EXTENSION_CAPABILITIES } });
16
+ this.#logger = new Logger({ level: config?.logLevel });
17
+ }
18
+ async connect(options) {
19
+ invariant(!this.#connected, "Host only supports one connection at a time. Call `close` on the connection before connecting again.");
20
+ const transport = new StreamableHTTPClientTransport(new URL(options.url));
21
+ await this.#client.connect(transport);
22
+ this.#connected = true;
23
+ const [tools, resources] = await Promise.all([
24
+ this.#fetchAllTools(),
25
+ this.#fetchAllResources(),
26
+ ]);
27
+ const connection = new HostConnection(this.#client, {
28
+ tools,
29
+ resources,
30
+ logger: this.#logger,
31
+ });
32
+ connection.addEventListener("close", () => {
33
+ this.#connected = false;
34
+ });
35
+ return connection;
36
+ }
37
+ async #fetchAllTools() {
38
+ const fetchTools = async (cursor) => {
39
+ const { tools, nextCursor } = await this.#client.listTools({ cursor });
40
+ return nextCursor ? tools.concat(await fetchTools(nextCursor)) : tools;
41
+ };
42
+ return fetchTools();
43
+ }
44
+ async #fetchAllResources() {
45
+ const fetchResources = async (cursor) => {
46
+ const { resources, nextCursor } = await this.#client.listResources({
47
+ cursor,
48
+ });
49
+ return nextCursor ?
50
+ resources.concat(await fetchResources(nextCursor))
51
+ : resources;
52
+ };
53
+ return fetchResources();
54
+ }
55
+ }
56
+ //# sourceMappingURL=Host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Host.js","sourceRoot":"","sources":["../../src/core/Host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAGhG,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAY1D,MAAM,OAAO,IAAI;IACf,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,UAAU,GAAG,KAAK,CAAC;IAEnB,YAAY,MAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CACvB;YACE,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,EACD,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,yBAAyB,EAAE,EAAE,CAC5D,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,SAAS,CACP,CAAC,IAAI,CAAC,UAAU,EAChB,sGAAsG,CACvG,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3C,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,kBAAkB,EAAE;SAC1B,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE;YAClD,KAAK;YACL,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC,CAAC;QAEH,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACxC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,UAAU,GAAG,KAAK,EAAE,MAAe,EAAmB,EAAE;YAC5D,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAEvE,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACzE,CAAC,CAAC;QAEF,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,cAAc,GAAG,KAAK,EAAE,MAAe,EAAuB,EAAE;YACpE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;gBACjE,MAAM;aACP,CAAC,CAAC;YAEH,OAAO,UAAU,CAAC,CAAC;gBACf,SAAS,CAAC,MAAM,CAAC,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;gBACpD,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC,CAAC;QAEF,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,71 @@
1
+ import { type McpUiResourceCsp, type McpUiResourcePermissions } from "@modelcontextprotocol/ext-apps/app-bridge";
2
+ import type { Client } from "@modelcontextprotocol/sdk/client";
3
+ import type { CallToolResult, Resource, Tool } from "@modelcontextprotocol/sdk/types";
4
+ import { Logger, TypedEventTarget } from "../utilities/index.js";
5
+ export declare namespace HostConnection {
6
+ interface Options {
7
+ tools: Tool[];
8
+ resources: Resource[];
9
+ logger: Logger;
10
+ }
11
+ interface UiResource {
12
+ html: string;
13
+ csp: McpUiResourceCsp | undefined;
14
+ permissions: McpUiResourcePermissions | undefined;
15
+ }
16
+ interface Event {
17
+ close: CustomEvent<never>;
18
+ }
19
+ interface ToolExecution {
20
+ tool: Tool;
21
+ input: Record<string, unknown> | undefined;
22
+ resultPromise: Promise<CallToolResult>;
23
+ }
24
+ }
25
+ export declare class HostConnection extends TypedEventTarget<HostConnection.Event> {
26
+ #private;
27
+ private toolsByName;
28
+ private resourcesByUri;
29
+ constructor(client: Client, options: HostConnection.Options);
30
+ /** @internal */
31
+ get client(): Client<{
32
+ method: string;
33
+ params?: {
34
+ [x: string]: unknown;
35
+ _meta?: {
36
+ [x: string]: unknown;
37
+ progressToken?: string | number | undefined;
38
+ "io.modelcontextprotocol/related-task"?: {
39
+ taskId: string;
40
+ } | undefined;
41
+ } | undefined;
42
+ } | undefined;
43
+ }, {
44
+ method: string;
45
+ params?: {
46
+ [x: string]: unknown;
47
+ _meta?: {
48
+ [x: string]: unknown;
49
+ progressToken?: string | number | undefined;
50
+ "io.modelcontextprotocol/related-task"?: {
51
+ taskId: string;
52
+ } | undefined;
53
+ } | undefined;
54
+ } | undefined;
55
+ }, {
56
+ [x: string]: unknown;
57
+ _meta?: {
58
+ [x: string]: unknown;
59
+ progressToken?: string | number | undefined;
60
+ "io.modelcontextprotocol/related-task"?: {
61
+ taskId: string;
62
+ } | undefined;
63
+ } | undefined;
64
+ }>;
65
+ get closed(): boolean;
66
+ get logger(): Logger;
67
+ callTool(name: string, args?: Record<string, unknown>): HostConnection.ToolExecution;
68
+ close(): Promise<void>;
69
+ getUiResource(uri: string): Promise<HostConnection.UiResource>;
70
+ }
71
+ //# sourceMappingURL=HostConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HostConnection.d.ts","sourceRoot":"","sources":["../../src/core/HostConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,wBAAwB,EAE9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACR,IAAI,EACL,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAa,MAAM,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE5E,MAAM,CAAC,OAAO,WAAW,cAAc,CAAC;IACtC,UAAiB,OAAO;QACtB,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,SAAS,EAAE,QAAQ,EAAE,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;KAChB;IAED,UAAiB,UAAU;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,gBAAgB,GAAG,SAAS,CAAC;QAClC,WAAW,EAAE,wBAAwB,GAAG,SAAS,CAAC;KACnD;IAED,UAAiB,KAAK;QACpB,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;KAC3B;IAED,UAAiB,aAAa;QAC5B,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;QAC3C,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;KACxC;CACF;AAED,qBAAa,cAAe,SAAQ,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC;;IAExE,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,cAAc,CAA+B;gBAKzC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO;IAc3D,gBAAgB;IAChB,IAAI,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAET;IAED,IAAI,MAAM,YAET;IAED,IAAI,MAAM,WAET;IAED,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,cAAc,CAAC,aAAa;IAazB,KAAK;IAML,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC;CA8BrE"}
@@ -0,0 +1,57 @@
1
+ import { RESOURCE_MIME_TYPE, } from "@modelcontextprotocol/ext-apps/app-bridge";
2
+ import { invariant, Logger, TypedEventTarget } from "../utilities/index.js";
3
+ export class HostConnection extends TypedEventTarget {
4
+ #client;
5
+ toolsByName = new Map();
6
+ resourcesByUri = new Map();
7
+ #logger;
8
+ #closed = false;
9
+ constructor(client, options) {
10
+ super();
11
+ this.#client = client;
12
+ this.#logger = options.logger;
13
+ for (const tool of options.tools) {
14
+ this.toolsByName.set(tool.name, tool);
15
+ }
16
+ for (const resource of options.resources) {
17
+ this.resourcesByUri.set(resource.uri, resource);
18
+ }
19
+ }
20
+ /** @internal */
21
+ get client() {
22
+ return this.#client;
23
+ }
24
+ get closed() {
25
+ return this.#closed;
26
+ }
27
+ get logger() {
28
+ return this.#logger;
29
+ }
30
+ callTool(name, args) {
31
+ const tool = this.toolsByName.get(name);
32
+ invariant(tool, `Tool not found: '${name}'.`);
33
+ const resultPromise = this.#client.callTool({
34
+ name,
35
+ arguments: args,
36
+ });
37
+ return { tool, input: args, resultPromise };
38
+ }
39
+ async close() {
40
+ await this.#client.close();
41
+ this.#closed = true;
42
+ this.dispatchTypedEvent("close", new CustomEvent("close"));
43
+ }
44
+ async getUiResource(uri) {
45
+ invariant(uri.startsWith("ui://"), `Expected a UI resource URI (ui:// scheme). Got: '${uri}'`);
46
+ const resource = await this.#client.readResource({ uri });
47
+ invariant(resource, `Resource not found: '${uri}'.`);
48
+ invariant(resource.contents.length === 1, `Expected resource to contain exactly 1 content item. Got ${resource.contents.length}.`);
49
+ const content = resource.contents[0];
50
+ invariant(content.mimeType === RESOURCE_MIME_TYPE, `Unexpected mime type for resource: '${content.mimeType}'.`);
51
+ const html = "blob" in content ? atob(content.blob) : content.text;
52
+ const resourceDef = this.resourcesByUri.get(uri);
53
+ const meta = (content._meta?.ui ?? resourceDef?._meta?.ui);
54
+ return { html, csp: meta?.csp, permissions: meta?.permissions };
55
+ }
56
+ }
57
+ //# sourceMappingURL=HostConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HostConnection.js","sourceRoot":"","sources":["../../src/core/HostConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,GACnB,MAAM,2CAA2C,CAAC;AAQnD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA0B5E,MAAM,OAAO,cAAe,SAAQ,gBAAsC;IACxE,OAAO,CAAS;IACR,WAAW,GAAG,IAAI,GAAG,EAAgB,CAAC;IACtC,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAC;IAErD,OAAO,CAAS;IAChB,OAAO,GAAG,KAAK,CAAC;IAEhB,YAAY,MAAc,EAAE,OAA+B;QACzD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,QAAQ,CACN,IAAY,EACZ,IAA8B;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAExC,SAAS,CAAC,IAAI,EAAE,oBAAoB,IAAI,IAAI,CAAC,CAAC;QAE9C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC1C,IAAI;YACJ,SAAS,EAAE,IAAI;SAChB,CAA4B,CAAC;QAE9B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,SAAS,CACP,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EACvB,oDAAoD,GAAG,GAAG,CAC3D,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1D,SAAS,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC,CAAC;QACrD,SAAS,CACP,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAC9B,4DAA4D,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CACxF,CAAC;QAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QAEtC,SAAS,CACP,OAAO,CAAC,QAAQ,KAAK,kBAAkB,EACvC,uCAAuC,OAAO,CAAC,QAAQ,IAAI,CAC5D,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACnE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,WAAW,EAAE,KAAK,EAAE,EAAE,CAE5C,CAAC;QAEd,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { Host } from "./Host.js";
2
+ export type { HostConnection } from "./HostConnection.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Host } from "./Host.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types";
2
+ import { type FrameLocator } from "@playwright/test";
3
+ import type { McpHost } from "./types.js";
4
+ import type { Host } from "../core/index.js";
5
+ declare global {
6
+ interface Window {
7
+ __mcpHost: McpHost;
8
+ }
9
+ }
10
+ export interface CallToolResponse {
11
+ result: CallToolResult;
12
+ input: Record<string, unknown> | undefined;
13
+ appFrame: FrameLocator;
14
+ }
15
+ export interface McpHostConnection {
16
+ callTool(name: string, args?: Record<string, unknown>): Promise<CallToolResponse>;
17
+ }
18
+ export interface McpHostFixture {
19
+ connect(options: Host.ConnectOptions): Promise<McpHostConnection>;
20
+ }
21
+ export declare const test: import("playwright/test").TestType<import("playwright/test").PlaywrightTestArgs & import("playwright/test").PlaywrightTestOptions & {
22
+ mcpHost: McpHostFixture;
23
+ }, import("playwright/test").PlaywrightWorkerArgs & import("playwright/test").PlaywrightWorkerOptions>;
24
+ //# sourceMappingURL=fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/playwright/fixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,kBAAkB,CAAC;AAEnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,SAAS,EAAE,OAAO,CAAC;KACpB;CACF;AAID,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnE;AAED,eAAO,MAAM,IAAI;aAA0B,cAAc;sGAmCvD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { test as base } from "@playwright/test";
2
+ const DEFAULT_HARNESS_URL = "http://localhost:8080/";
3
+ export const test = base.extend({
4
+ mcpHost: async ({ page }, use) => {
5
+ await page.goto(DEFAULT_HARNESS_URL);
6
+ const fixture = {
7
+ async connect(options) {
8
+ await page.evaluate((url) => window.__mcpHost.connect(url), options.url);
9
+ return {
10
+ async callTool(name, args) {
11
+ const response = await page.evaluate(({ name, args }) => window.__mcpHost.callTool(name, args), { name, args });
12
+ const appFrame = page
13
+ .locator("iframe")
14
+ .contentFrame()
15
+ .locator("iframe")
16
+ .contentFrame();
17
+ return { ...response, appFrame };
18
+ },
19
+ };
20
+ },
21
+ };
22
+ // eslint-disable-next-line react-hooks/rules-of-hooks
23
+ await use(fixture);
24
+ await page.evaluate(() => window.__mcpHost.teardown()).catch(() => { });
25
+ },
26
+ });
27
+ //# sourceMappingURL=fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../src/playwright/fixture.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,IAAI,IAAI,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAWnE,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAmBrD,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAA8B;IAC3D,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;QAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAErC,MAAM,OAAO,GAAmB;YAC9B,KAAK,CAAC,OAAO,CAAC,OAAO;gBACnB,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EACtC,OAAO,CAAC,GAAG,CACZ,CAAC;gBAEF,OAAO;oBACL,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI;wBACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAClC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EACzD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;wBAEF,MAAM,QAAQ,GAAG,IAAI;6BAClB,OAAO,CAAC,QAAQ,CAAC;6BACjB,YAAY,EAAE;6BACd,OAAO,CAAC,QAAQ,CAAC;6BACjB,YAAY,EAAE,CAAC;wBAElB,OAAO,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC;oBACnC,CAAC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC;QAEF,sDAAsD;QACtD,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAEnB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzE,CAAC;CACF,CAAC,CAAC"}