@webmcp-bridge/local-mcp 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.
- package/LICENSE +21 -0
- package/dist/bridge.d.ts +31 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +120 -0
- package/dist/bridge.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +184 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +39 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +232 -0
- package/dist/client.js.map +1 -0
- package/dist/event-buffer.d.ts +22 -0
- package/dist/event-buffer.d.ts.map +1 -0
- package/dist/event-buffer.js +46 -0
- package/dist/event-buffer.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-types.d.ts +61 -0
- package/dist/mcp-types.d.ts.map +1 -0
- package/dist/mcp-types.js +6 -0
- package/dist/mcp-types.js.map +1 -0
- package/dist/protocol.d.ts +11 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +52 -0
- package/dist/protocol.js.map +1 -0
- package/dist/runtime.d.ts +30 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +154 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +189 -0
- package/dist/server.js.map +1 -0
- package/dist/sites.d.ts +22 -0
- package/dist/sites.d.ts.map +1 -0
- package/dist/sites.js +188 -0
- package/dist/sites.js.map +1 -0
- package/package.json +37 -0
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module boots a Playwright page and WebMCP gateway for one target site session.
|
|
3
|
+
* It depends on resolved site definitions and Playwright gateway APIs so local-mcp can proxy browser-side tool execution.
|
|
4
|
+
*/
|
|
5
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { createWebMcpPageGateway, } from "@webmcp-bridge/playwright";
|
|
9
|
+
import { chromium, firefox, webkit, } from "playwright";
|
|
10
|
+
function normalizeHost(value) {
|
|
11
|
+
return value.trim().toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
function matchesHostPattern(host, pattern) {
|
|
14
|
+
const normalizedHost = normalizeHost(host);
|
|
15
|
+
const normalizedPattern = normalizeHost(pattern);
|
|
16
|
+
if (!normalizedPattern) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
if (normalizedPattern.startsWith("*.")) {
|
|
20
|
+
const suffix = normalizedPattern.slice(2);
|
|
21
|
+
if (!suffix) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (normalizedHost === suffix) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return normalizedHost.endsWith(`.${suffix}`);
|
|
28
|
+
}
|
|
29
|
+
return normalizedHost === normalizedPattern;
|
|
30
|
+
}
|
|
31
|
+
export function isUrlAllowed(url, hostPatterns) {
|
|
32
|
+
let target;
|
|
33
|
+
try {
|
|
34
|
+
target = new URL(url);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (target.protocol === "about:") {
|
|
40
|
+
return target.href === "about:blank" && hostPatterns.includes("about:blank");
|
|
41
|
+
}
|
|
42
|
+
if (target.protocol !== "https:" && target.protocol !== "http:") {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return hostPatterns.some((pattern) => matchesHostPattern(target.hostname, pattern));
|
|
46
|
+
}
|
|
47
|
+
export function resolveTargetUrl(urlOverride, defaultUrl) {
|
|
48
|
+
const targetUrl = (urlOverride && urlOverride.trim()) || (defaultUrl && defaultUrl.trim()) || "";
|
|
49
|
+
if (!targetUrl) {
|
|
50
|
+
throw new Error("CONFIG_ERROR: no target url provided (missing --url and manifest.defaultUrl)");
|
|
51
|
+
}
|
|
52
|
+
return targetUrl;
|
|
53
|
+
}
|
|
54
|
+
function resolveBrowserType(browser) {
|
|
55
|
+
if (browser === "firefox") {
|
|
56
|
+
return firefox;
|
|
57
|
+
}
|
|
58
|
+
if (browser === "webkit") {
|
|
59
|
+
return webkit;
|
|
60
|
+
}
|
|
61
|
+
return chromium;
|
|
62
|
+
}
|
|
63
|
+
async function waitForPolyfillTools(pageGateway, timeoutMs = 5000, intervalMs = 200) {
|
|
64
|
+
const deadline = Date.now() + timeoutMs;
|
|
65
|
+
while (Date.now() < deadline) {
|
|
66
|
+
const tools = await pageGateway.listTools();
|
|
67
|
+
if (tools.length > 0) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function startLocalMcpRuntime(options) {
|
|
74
|
+
const site = options.siteDefinition;
|
|
75
|
+
const browserEngine = options.browser ?? "chromium";
|
|
76
|
+
const headless = options.headless ?? false;
|
|
77
|
+
const browserType = resolveBrowserType(browserEngine);
|
|
78
|
+
const targetUrl = resolveTargetUrl(options.url, site.manifest.defaultUrl);
|
|
79
|
+
if (!isUrlAllowed(targetUrl, site.manifest.hostPatterns)) {
|
|
80
|
+
throw new Error("URL_NOT_ALLOWED: target url host is not allowed by adapter hostPatterns");
|
|
81
|
+
}
|
|
82
|
+
let profileDirFromTemp = false;
|
|
83
|
+
const userDataDir = options.userDataDir ?? (await mkdtemp(join(tmpdir(), "webmcp-local-mcp-")));
|
|
84
|
+
if (!options.userDataDir) {
|
|
85
|
+
profileDirFromTemp = true;
|
|
86
|
+
}
|
|
87
|
+
let context;
|
|
88
|
+
let gatewaySession;
|
|
89
|
+
const cleanup = async () => {
|
|
90
|
+
await gatewaySession?.close().catch(() => {
|
|
91
|
+
// Cleanup should be best-effort when process is terminating.
|
|
92
|
+
});
|
|
93
|
+
await context?.close().catch(() => {
|
|
94
|
+
// Cleanup should be best-effort when process is terminating.
|
|
95
|
+
});
|
|
96
|
+
if (profileDirFromTemp) {
|
|
97
|
+
await rm(userDataDir, { recursive: true, force: true }).catch(() => {
|
|
98
|
+
// Cleanup should be best-effort when process is terminating.
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
try {
|
|
103
|
+
context = await browserType.launchPersistentContext(userDataDir, {
|
|
104
|
+
headless,
|
|
105
|
+
});
|
|
106
|
+
const page = context.pages()[0] ?? (await context.newPage());
|
|
107
|
+
await page.goto(targetUrl, { waitUntil: "domcontentloaded" });
|
|
108
|
+
const gatewayOptions = {
|
|
109
|
+
preferNative: options.preferNative ?? true,
|
|
110
|
+
};
|
|
111
|
+
const fallbackAdapterFactory = site.createFallbackAdapter;
|
|
112
|
+
if (fallbackAdapterFactory) {
|
|
113
|
+
gatewayOptions.fallbackAdapter = fallbackAdapterFactory();
|
|
114
|
+
}
|
|
115
|
+
gatewaySession = await createWebMcpPageGateway(page, gatewayOptions);
|
|
116
|
+
const pageGateway = gatewaySession;
|
|
117
|
+
if (pageGateway.mode === "polyfill") {
|
|
118
|
+
// Ensure page scripts run after modelContext polyfill injection so site tools can register.
|
|
119
|
+
await page.reload({ waitUntil: "domcontentloaded" });
|
|
120
|
+
await waitForPolyfillTools(pageGateway);
|
|
121
|
+
}
|
|
122
|
+
let closed = false;
|
|
123
|
+
const close = async () => {
|
|
124
|
+
if (closed) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
closed = true;
|
|
128
|
+
await cleanup();
|
|
129
|
+
};
|
|
130
|
+
const gateway = {
|
|
131
|
+
listTools: async () => {
|
|
132
|
+
return await pageGateway.listTools();
|
|
133
|
+
},
|
|
134
|
+
callTool: async (name, input) => {
|
|
135
|
+
return await pageGateway.callTool(name, input);
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
site: site.id,
|
|
140
|
+
siteDefinition: site,
|
|
141
|
+
targetUrl,
|
|
142
|
+
mode: gatewaySession.mode,
|
|
143
|
+
headless,
|
|
144
|
+
page,
|
|
145
|
+
gateway,
|
|
146
|
+
close,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
await cleanup();
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module implements an MCP stdio JSON-RPC server that proxies tool calls to a page WebMCP gateway.
|
|
3
|
+
* It depends on the modelcontextprotocol/sdk server and stdio transport so MCP framing and lifecycle are handled by the official implementation.
|
|
4
|
+
*/
|
|
5
|
+
import type { JsonValue } from "@webmcp-bridge/core";
|
|
6
|
+
import type { WebMcpToolDefinition } from "@webmcp-bridge/playwright";
|
|
7
|
+
import type { Readable, Writable } from "node:stream";
|
|
8
|
+
export type LocalMcpGateway = {
|
|
9
|
+
listTools: () => Promise<ReadonlyArray<WebMcpToolDefinition>>;
|
|
10
|
+
callTool: (name: string, input: Record<string, unknown>) => Promise<JsonValue>;
|
|
11
|
+
};
|
|
12
|
+
export type LocalMcpStdioServerOptions = {
|
|
13
|
+
gateway: LocalMcpGateway;
|
|
14
|
+
serviceVersion: string;
|
|
15
|
+
input?: Readable;
|
|
16
|
+
output?: Writable;
|
|
17
|
+
onError?: (error: unknown) => void;
|
|
18
|
+
};
|
|
19
|
+
export type LocalMcpStdioServer = {
|
|
20
|
+
start: () => Promise<void>;
|
|
21
|
+
close: () => Promise<void>;
|
|
22
|
+
};
|
|
23
|
+
export declare function createLocalMcpStdioServer(options: LocalMcpStdioServerOptions): LocalMcpStdioServer;
|
|
24
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9D,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,eAAe,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AA2MF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,mBAAmB,CAElG"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module implements an MCP stdio JSON-RPC server that proxies tool calls to a page WebMCP gateway.
|
|
3
|
+
* It depends on the modelcontextprotocol/sdk server and stdio transport so MCP framing and lifecycle are handled by the official implementation.
|
|
4
|
+
*/
|
|
5
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
6
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
class LocalMcpStdioServerImpl {
|
|
9
|
+
server;
|
|
10
|
+
transport;
|
|
11
|
+
started = false;
|
|
12
|
+
closed = false;
|
|
13
|
+
lastToolsSignature;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.transport = new StdioServerTransport(options.input, options.output);
|
|
16
|
+
this.transport.onerror = (error) => {
|
|
17
|
+
options.onError?.(error);
|
|
18
|
+
};
|
|
19
|
+
this.server = new Server({
|
|
20
|
+
name: "webmcp-bridge-local-mcp",
|
|
21
|
+
version: options.serviceVersion,
|
|
22
|
+
}, {
|
|
23
|
+
capabilities: {
|
|
24
|
+
tools: {
|
|
25
|
+
listChanged: true,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
30
|
+
const tools = await options.gateway.listTools();
|
|
31
|
+
this.lastToolsSignature = this.computeToolsSignature(tools);
|
|
32
|
+
return {
|
|
33
|
+
tools: tools.map((tool) => this.toMcpToolDefinition(tool)),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
37
|
+
const previousSignature = await this.ensureToolsSignature(options.gateway);
|
|
38
|
+
const args = this.normalizeToolArguments(request.params.arguments);
|
|
39
|
+
const toolResult = await options.gateway.callTool(request.params.name, args);
|
|
40
|
+
await this.notifyIfToolsChanged(options.gateway, previousSignature);
|
|
41
|
+
return this.toCallToolResult(toolResult);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async start() {
|
|
45
|
+
if (this.started) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.started = true;
|
|
49
|
+
await this.server.connect(this.transport);
|
|
50
|
+
}
|
|
51
|
+
async close() {
|
|
52
|
+
if (this.closed) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.closed = true;
|
|
56
|
+
await this.server.close();
|
|
57
|
+
}
|
|
58
|
+
toMcpToolDefinition(tool) {
|
|
59
|
+
const definition = {
|
|
60
|
+
name: tool.name,
|
|
61
|
+
};
|
|
62
|
+
if (tool.description !== undefined) {
|
|
63
|
+
definition.description = tool.description;
|
|
64
|
+
}
|
|
65
|
+
if (tool.inputSchema !== undefined) {
|
|
66
|
+
definition.inputSchema = tool.inputSchema;
|
|
67
|
+
}
|
|
68
|
+
if (tool.annotations !== undefined) {
|
|
69
|
+
definition.annotations = tool.annotations;
|
|
70
|
+
}
|
|
71
|
+
return definition;
|
|
72
|
+
}
|
|
73
|
+
normalizeToolArguments(value) {
|
|
74
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
toStructuredContent(value) {
|
|
80
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
value,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
toCallToolResult(value) {
|
|
88
|
+
if (this.isCallToolResultPayload(value)) {
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
const result = {
|
|
92
|
+
content: [],
|
|
93
|
+
structuredContent: this.toStructuredContent(value),
|
|
94
|
+
};
|
|
95
|
+
if (this.isErrorPayload(value)) {
|
|
96
|
+
result.isError = true;
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
isRecord(value) {
|
|
101
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
102
|
+
}
|
|
103
|
+
isContentArray(value) {
|
|
104
|
+
if (!Array.isArray(value)) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return value.every((item) => this.isRecord(item) && typeof item.type === "string");
|
|
108
|
+
}
|
|
109
|
+
isCallToolResultPayload(value) {
|
|
110
|
+
if (!this.isRecord(value)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
let hasKnownField = false;
|
|
114
|
+
if ("content" in value) {
|
|
115
|
+
hasKnownField = true;
|
|
116
|
+
if (!this.isContentArray(value.content)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if ("structuredContent" in value) {
|
|
121
|
+
hasKnownField = true;
|
|
122
|
+
if (!this.isRecord(value.structuredContent)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if ("isError" in value) {
|
|
127
|
+
hasKnownField = true;
|
|
128
|
+
if (typeof value.isError !== "boolean") {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return hasKnownField;
|
|
133
|
+
}
|
|
134
|
+
isErrorPayload(value) {
|
|
135
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
return "error" in value;
|
|
139
|
+
}
|
|
140
|
+
async ensureToolsSignature(gateway) {
|
|
141
|
+
if (this.lastToolsSignature !== undefined) {
|
|
142
|
+
return this.lastToolsSignature;
|
|
143
|
+
}
|
|
144
|
+
const tools = await gateway.listTools();
|
|
145
|
+
const signature = this.computeToolsSignature(tools);
|
|
146
|
+
this.lastToolsSignature = signature;
|
|
147
|
+
return signature;
|
|
148
|
+
}
|
|
149
|
+
async notifyIfToolsChanged(gateway, previousSignature) {
|
|
150
|
+
const tools = await gateway.listTools();
|
|
151
|
+
const nextSignature = this.computeToolsSignature(tools);
|
|
152
|
+
this.lastToolsSignature = nextSignature;
|
|
153
|
+
if (nextSignature === previousSignature) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
await this.server.sendToolListChanged().catch(() => {
|
|
157
|
+
// Ignore when client does not advertise listChanged support or session is not notification-ready.
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
computeToolsSignature(tools) {
|
|
161
|
+
const normalized = tools
|
|
162
|
+
.map((tool) => ({
|
|
163
|
+
annotations: this.normalizeForSignature(tool.annotations ?? {}),
|
|
164
|
+
description: tool.description ?? "",
|
|
165
|
+
inputSchema: this.normalizeForSignature(tool.inputSchema ?? { type: "object" }),
|
|
166
|
+
name: tool.name,
|
|
167
|
+
}))
|
|
168
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
169
|
+
return JSON.stringify(normalized);
|
|
170
|
+
}
|
|
171
|
+
normalizeForSignature(value) {
|
|
172
|
+
if (Array.isArray(value)) {
|
|
173
|
+
return value.map((item) => this.normalizeForSignature(item));
|
|
174
|
+
}
|
|
175
|
+
if (typeof value === "object" && value !== null) {
|
|
176
|
+
const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
|
|
177
|
+
const output = {};
|
|
178
|
+
for (const [key, item] of entries) {
|
|
179
|
+
output[key] = this.normalizeForSignature(item);
|
|
180
|
+
}
|
|
181
|
+
return output;
|
|
182
|
+
}
|
|
183
|
+
return value;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
export function createLocalMcpStdioServer(options) {
|
|
187
|
+
return new LocalMcpStdioServerImpl(options);
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/sites.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module defines built-in site presets and external adapter-module loading.
|
|
3
|
+
* It depends on adapter packages and adapter contracts so runtime startup can resolve one fallback adapter source per process.
|
|
4
|
+
*/
|
|
5
|
+
import type { AdapterManifest, SiteAdapter } from "@webmcp-bridge/playwright";
|
|
6
|
+
export type BuiltinSite = "x" | "fixture";
|
|
7
|
+
export type SiteDefinition = {
|
|
8
|
+
id: string;
|
|
9
|
+
source: "builtin" | "external" | "native";
|
|
10
|
+
manifest: AdapterManifest;
|
|
11
|
+
createFallbackAdapter?: () => SiteAdapter;
|
|
12
|
+
adapterModule?: string;
|
|
13
|
+
};
|
|
14
|
+
export type ResolveSiteSourceOptions = {
|
|
15
|
+
site?: string;
|
|
16
|
+
adapterModule?: string;
|
|
17
|
+
moduleBaseDir?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function resolveSiteDefinition(site: string): SiteDefinition;
|
|
20
|
+
export declare function createNativeSiteDefinition(url: string): SiteDefinition;
|
|
21
|
+
export declare function resolveSiteSource(options: ResolveSiteSourceOptions): Promise<SiteDefinition>;
|
|
22
|
+
//# sourceMappingURL=sites.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sites.d.ts","sourceRoot":"","sources":["../src/sites.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAEZ,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,SAAS,CAAC;AAE1C,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,QAAQ,EAAE,eAAe,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,WAAW,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAuIF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAKlE;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAwCtE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiBlG"}
|
package/dist/sites.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module defines built-in site presets and external adapter-module loading.
|
|
3
|
+
* It depends on adapter packages and adapter contracts so runtime startup can resolve one fallback adapter source per process.
|
|
4
|
+
*/
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
import { createAdapter as createFixtureAdapter, manifest as fixtureManifest, } from "@webmcp-bridge/adapter-fixture";
|
|
8
|
+
import { createAdapter as createXAdapter, manifest as xManifest, } from "@webmcp-bridge/adapter-x";
|
|
9
|
+
const BUILTIN_SITE_DEFINITIONS = {
|
|
10
|
+
x: {
|
|
11
|
+
id: "x",
|
|
12
|
+
source: "builtin",
|
|
13
|
+
manifest: xManifest,
|
|
14
|
+
createFallbackAdapter: () => createXAdapter(),
|
|
15
|
+
},
|
|
16
|
+
fixture: {
|
|
17
|
+
id: "fixture",
|
|
18
|
+
source: "builtin",
|
|
19
|
+
manifest: fixtureManifest,
|
|
20
|
+
createFallbackAdapter: () => createFixtureAdapter(),
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
function isNonEmptyString(value) {
|
|
27
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
28
|
+
}
|
|
29
|
+
function validateManifest(value) {
|
|
30
|
+
if (!isRecord(value)) {
|
|
31
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: adapter manifest must be an object");
|
|
32
|
+
}
|
|
33
|
+
const id = value.id;
|
|
34
|
+
const displayName = value.displayName;
|
|
35
|
+
const version = value.version;
|
|
36
|
+
const bridgeApiVersion = value.bridgeApiVersion;
|
|
37
|
+
const defaultUrl = value.defaultUrl;
|
|
38
|
+
const hostPatterns = value.hostPatterns;
|
|
39
|
+
const authProbeTool = value.authProbeTool;
|
|
40
|
+
if (!isNonEmptyString(id)) {
|
|
41
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.id must be a non-empty string");
|
|
42
|
+
}
|
|
43
|
+
if (!isNonEmptyString(displayName)) {
|
|
44
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.displayName must be a non-empty string");
|
|
45
|
+
}
|
|
46
|
+
if (!isNonEmptyString(version)) {
|
|
47
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.version must be a non-empty string");
|
|
48
|
+
}
|
|
49
|
+
if (!isNonEmptyString(bridgeApiVersion)) {
|
|
50
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.bridgeApiVersion must be a non-empty string");
|
|
51
|
+
}
|
|
52
|
+
if (defaultUrl !== undefined && !isNonEmptyString(defaultUrl)) {
|
|
53
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.defaultUrl must be a non-empty string when provided");
|
|
54
|
+
}
|
|
55
|
+
if (!Array.isArray(hostPatterns) || hostPatterns.length === 0) {
|
|
56
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.hostPatterns must be a non-empty string array");
|
|
57
|
+
}
|
|
58
|
+
if (!hostPatterns.every((item) => isNonEmptyString(item))) {
|
|
59
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.hostPatterns must contain non-empty strings");
|
|
60
|
+
}
|
|
61
|
+
if (authProbeTool !== undefined && !isNonEmptyString(authProbeTool)) {
|
|
62
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: manifest.authProbeTool must be a non-empty string when provided");
|
|
63
|
+
}
|
|
64
|
+
const output = {
|
|
65
|
+
id,
|
|
66
|
+
displayName,
|
|
67
|
+
version,
|
|
68
|
+
bridgeApiVersion,
|
|
69
|
+
hostPatterns,
|
|
70
|
+
};
|
|
71
|
+
if (defaultUrl !== undefined) {
|
|
72
|
+
output.defaultUrl = defaultUrl;
|
|
73
|
+
}
|
|
74
|
+
if (authProbeTool !== undefined) {
|
|
75
|
+
output.authProbeTool = authProbeTool;
|
|
76
|
+
}
|
|
77
|
+
return output;
|
|
78
|
+
}
|
|
79
|
+
function validateSiteAdapterModule(value) {
|
|
80
|
+
if (!isRecord(value)) {
|
|
81
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: adapter module must export an object");
|
|
82
|
+
}
|
|
83
|
+
const root = isRecord(value.default) ? value.default : value;
|
|
84
|
+
const createAdapter = root.createAdapter;
|
|
85
|
+
if (typeof createAdapter !== "function") {
|
|
86
|
+
throw new Error("ADAPTER_CONTRACT_ERROR: adapter module must export createAdapter()");
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
manifest: validateManifest(root.manifest),
|
|
90
|
+
createAdapter: createAdapter,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function resolveAdapterModuleSpecifier(specifier, baseDir) {
|
|
94
|
+
const trimmed = specifier.trim();
|
|
95
|
+
if (!trimmed) {
|
|
96
|
+
throw new Error("ADAPTER_LOAD_ERROR: adapter module specifier is empty");
|
|
97
|
+
}
|
|
98
|
+
if (trimmed.startsWith("file:")) {
|
|
99
|
+
return trimmed;
|
|
100
|
+
}
|
|
101
|
+
if (trimmed.startsWith(".") || trimmed.startsWith("/") || trimmed.startsWith("..")) {
|
|
102
|
+
const absolutePath = resolve(baseDir, trimmed);
|
|
103
|
+
return pathToFileURL(absolutePath).href;
|
|
104
|
+
}
|
|
105
|
+
return trimmed;
|
|
106
|
+
}
|
|
107
|
+
async function resolveExternalSiteDefinition(adapterModule, moduleBaseDir) {
|
|
108
|
+
const specifier = resolveAdapterModuleSpecifier(adapterModule, moduleBaseDir);
|
|
109
|
+
let loaded;
|
|
110
|
+
try {
|
|
111
|
+
loaded = await import(specifier);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
115
|
+
throw new Error(`ADAPTER_LOAD_ERROR: failed to import adapter module (${adapterModule}): ${message}`);
|
|
116
|
+
}
|
|
117
|
+
const adapterModuleExports = validateSiteAdapterModule(loaded);
|
|
118
|
+
return {
|
|
119
|
+
id: adapterModuleExports.manifest.id,
|
|
120
|
+
source: "external",
|
|
121
|
+
manifest: adapterModuleExports.manifest,
|
|
122
|
+
createFallbackAdapter: adapterModuleExports.createAdapter,
|
|
123
|
+
adapterModule,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function resolveSiteDefinition(site) {
|
|
127
|
+
if (site in BUILTIN_SITE_DEFINITIONS) {
|
|
128
|
+
return BUILTIN_SITE_DEFINITIONS[site];
|
|
129
|
+
}
|
|
130
|
+
throw new Error(`unsupported site: ${site}`);
|
|
131
|
+
}
|
|
132
|
+
export function createNativeSiteDefinition(url) {
|
|
133
|
+
const trimmedUrl = url.trim();
|
|
134
|
+
if (!trimmedUrl) {
|
|
135
|
+
throw new Error("CONFIG_ERROR: --url is required when --site/--adapter-module is not provided");
|
|
136
|
+
}
|
|
137
|
+
let parsed;
|
|
138
|
+
try {
|
|
139
|
+
parsed = new URL(trimmedUrl);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
throw new Error("CONFIG_ERROR: --url must be a valid absolute URL");
|
|
143
|
+
}
|
|
144
|
+
let hostPatterns;
|
|
145
|
+
let id;
|
|
146
|
+
if (parsed.protocol === "about:") {
|
|
147
|
+
if (parsed.href !== "about:blank") {
|
|
148
|
+
throw new Error("CONFIG_ERROR: url mode supports about:blank only for about: URLs");
|
|
149
|
+
}
|
|
150
|
+
hostPatterns = ["about:blank"];
|
|
151
|
+
id = "native:about-blank";
|
|
152
|
+
}
|
|
153
|
+
else if (parsed.protocol === "https:" || parsed.protocol === "http:") {
|
|
154
|
+
hostPatterns = [parsed.hostname];
|
|
155
|
+
id = `native:${parsed.hostname}`;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
throw new Error("CONFIG_ERROR: --url must use http:, https:, or about:blank");
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
id,
|
|
162
|
+
source: "native",
|
|
163
|
+
manifest: {
|
|
164
|
+
id,
|
|
165
|
+
displayName: "Native WebMCP Site",
|
|
166
|
+
version: "0.1.0",
|
|
167
|
+
bridgeApiVersion: "1.0.0",
|
|
168
|
+
defaultUrl: parsed.href,
|
|
169
|
+
hostPatterns,
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export async function resolveSiteSource(options) {
|
|
174
|
+
const site = options.site?.trim();
|
|
175
|
+
const adapterModule = options.adapterModule?.trim();
|
|
176
|
+
if (site && adapterModule) {
|
|
177
|
+
throw new Error("CONFIG_ERROR: use either --site or --adapter-module, not both");
|
|
178
|
+
}
|
|
179
|
+
if (!site && !adapterModule) {
|
|
180
|
+
throw new Error("CONFIG_ERROR: one of --site or --adapter-module is required");
|
|
181
|
+
}
|
|
182
|
+
if (site) {
|
|
183
|
+
return resolveSiteDefinition(site);
|
|
184
|
+
}
|
|
185
|
+
const moduleBaseDir = options.moduleBaseDir ?? process.cwd();
|
|
186
|
+
return await resolveExternalSiteDefinition(adapterModule, moduleBaseDir);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=sites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sites.js","sourceRoot":"","sources":["../src/sites.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webmcp-bridge/local-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"bin": {
|
|
14
|
+
"webmcp-local-mcp": "dist/cli.js"
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public",
|
|
18
|
+
"tag": "beta"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
25
|
+
"playwright": "^1.58.2",
|
|
26
|
+
"zod": "^4.3.6",
|
|
27
|
+
"@webmcp-bridge/adapter-fixture": "0.1.0",
|
|
28
|
+
"@webmcp-bridge/adapter-x": "0.1.0",
|
|
29
|
+
"@webmcp-bridge/playwright": "0.1.0",
|
|
30
|
+
"@webmcp-bridge/core": "0.1.0"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc -p tsconfig.build.json",
|
|
35
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
36
|
+
}
|
|
37
|
+
}
|