webclaw-mcp 0.1.0 → 0.2.1
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/dist/__tests__/cli-startup.test.js +1 -0
- package/dist/__tests__/cli-startup.test.js.map +1 -1
- package/dist/__tests__/mcp-protocol-integration.test.js +65 -97
- package/dist/__tests__/mcp-protocol-integration.test.js.map +1 -1
- package/dist/__tests__/mcp-stdio-integration.test.js +29 -17
- package/dist/__tests__/mcp-stdio-integration.test.js.map +1 -1
- package/dist/cli.js +16 -9
- package/dist/cli.js.map +1 -1
- 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/installer.d.ts.map +1 -1
- package/dist/installer.js +5 -68
- package/dist/installer.js.map +1 -1
- package/dist/server.d.ts +4 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +11 -12
- package/dist/server.js.map +1 -1
- package/dist/ws-client.d.ts +15 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +103 -0
- package/dist/ws-client.js.map +1 -0
- package/package.json +4 -2
- package/dist/__tests__/native-messaging-client.test.d.ts +0 -2
- package/dist/__tests__/native-messaging-client.test.d.ts.map +0 -1
- package/dist/__tests__/native-messaging-client.test.js +0 -196
- package/dist/__tests__/native-messaging-client.test.js.map +0 -1
- package/dist/__tests__/native-messaging-e2e.test.d.ts +0 -2
- package/dist/__tests__/native-messaging-e2e.test.d.ts.map +0 -1
- package/dist/__tests__/native-messaging-e2e.test.js +0 -280
- package/dist/__tests__/native-messaging-e2e.test.js.map +0 -1
- package/dist/native-messaging-client.d.ts +0 -29
- package/dist/native-messaging-client.d.ts.map +0 -1
- package/dist/native-messaging-client.js +0 -95
- package/dist/native-messaging-client.js.map +0 -1
|
@@ -9,6 +9,7 @@ describe('MCP Server stdio startup', () => {
|
|
|
9
9
|
const child = spawn('node', [cliPath], {
|
|
10
10
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
11
11
|
timeout: 10000,
|
|
12
|
+
env: { ...process.env, WEBCLAW_PORT: '19070' },
|
|
12
13
|
});
|
|
13
14
|
let stderr = '';
|
|
14
15
|
// Wait for the startup message or timeout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-startup.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-startup.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;AAExD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;YACrC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"cli-startup.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-startup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,41 +3,36 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Uses MCP SDK Client + InMemoryTransport to perform a real protocol
|
|
5
5
|
* handshake and tool invocations against the actual server, with a
|
|
6
|
-
* mocked
|
|
6
|
+
* mocked WebSocketClient.
|
|
7
7
|
*/
|
|
8
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
8
|
+
import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest';
|
|
9
9
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
10
10
|
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
|
|
11
|
-
import { PassThrough } from 'node:stream';
|
|
12
11
|
import { createWebClawServer } from '../server.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
messages.push(JSON.parse(data.toString('utf-8')));
|
|
38
|
-
offset += 4 + len;
|
|
39
|
-
}
|
|
40
|
-
return messages;
|
|
12
|
+
/** Create a mock WebSocketClient that resolves requests with a handler. */
|
|
13
|
+
function createMockWsClient() {
|
|
14
|
+
let handler = null;
|
|
15
|
+
const wsClient = {
|
|
16
|
+
request: vi.fn(async (method, payload = {}) => {
|
|
17
|
+
if (handler) {
|
|
18
|
+
return handler(method, payload);
|
|
19
|
+
}
|
|
20
|
+
// Default: return a response
|
|
21
|
+
return {
|
|
22
|
+
id: 'mock-id',
|
|
23
|
+
type: 'response',
|
|
24
|
+
method,
|
|
25
|
+
payload: {},
|
|
26
|
+
timestamp: Date.now(),
|
|
27
|
+
};
|
|
28
|
+
}),
|
|
29
|
+
isConnected: vi.fn(() => true),
|
|
30
|
+
close: vi.fn(async () => { }),
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
wsClient,
|
|
34
|
+
setHandler: (fn) => { handler = fn; },
|
|
35
|
+
};
|
|
41
36
|
}
|
|
42
37
|
const EXPECTED_TOOLS = [
|
|
43
38
|
'navigate_to',
|
|
@@ -51,15 +46,10 @@ const EXPECTED_TOOLS = [
|
|
|
51
46
|
];
|
|
52
47
|
describe('MCP Protocol integration (in-process)', () => {
|
|
53
48
|
let mcpClient;
|
|
54
|
-
let
|
|
55
|
-
let nativeStdout;
|
|
56
|
-
let nativeClient;
|
|
49
|
+
let mockWs;
|
|
57
50
|
beforeAll(async () => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
nativeStdout = mock.stdout;
|
|
61
|
-
nativeClient = mock.client;
|
|
62
|
-
const server = createWebClawServer({ nativeClient });
|
|
51
|
+
mockWs = createMockWsClient();
|
|
52
|
+
const server = createWebClawServer({ wsClient: mockWs.wsClient });
|
|
63
53
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
64
54
|
mcpClient = new Client({ name: 'test-client', version: '0.0.1' });
|
|
65
55
|
await server.connect(serverTransport);
|
|
@@ -67,14 +57,13 @@ describe('MCP Protocol integration (in-process)', () => {
|
|
|
67
57
|
});
|
|
68
58
|
afterAll(async () => {
|
|
69
59
|
await mcpClient.close();
|
|
70
|
-
nativeClient.disconnect();
|
|
71
60
|
});
|
|
72
61
|
// --- Handshake ---
|
|
73
62
|
it('completes initialize handshake and returns server info', () => {
|
|
74
63
|
const serverVersion = mcpClient.getServerVersion();
|
|
75
64
|
expect(serverVersion).toBeDefined();
|
|
76
65
|
expect(serverVersion.name).toBe('webclaw');
|
|
77
|
-
expect(serverVersion.version).toBe('0.1
|
|
66
|
+
expect(serverVersion.version).toBe('0.2.1');
|
|
78
67
|
});
|
|
79
68
|
// --- tools/list ---
|
|
80
69
|
it('lists all 8 tools', async () => {
|
|
@@ -140,84 +129,63 @@ describe('MCP Protocol integration (in-process)', () => {
|
|
|
140
129
|
});
|
|
141
130
|
expect(result.isError).toBe(true);
|
|
142
131
|
});
|
|
143
|
-
// --- Tool invocation with mock
|
|
144
|
-
it('navigate_to returns formatted response from
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
132
|
+
// --- Tool invocation with mock WebSocketClient ---
|
|
133
|
+
it('navigate_to returns formatted response from ws client', async () => {
|
|
134
|
+
mockWs.setHandler((method) => ({
|
|
135
|
+
id: 'mock-id',
|
|
136
|
+
type: 'response',
|
|
137
|
+
method,
|
|
138
|
+
payload: {
|
|
139
|
+
url: 'https://example.com',
|
|
140
|
+
title: 'Example Domain',
|
|
141
|
+
tabId: 1,
|
|
142
|
+
},
|
|
143
|
+
timestamp: Date.now(),
|
|
144
|
+
}));
|
|
145
|
+
const result = await mcpClient.callTool({
|
|
149
146
|
name: 'navigate_to',
|
|
150
147
|
arguments: { url: 'https://example.com' },
|
|
151
148
|
});
|
|
152
|
-
// Wait for the request to be sent through native messaging
|
|
153
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
154
|
-
const combined = Buffer.concat(chunks);
|
|
155
|
-
const sent = decodeNativeMessages(combined);
|
|
156
|
-
const req = sent.find((m) => m.method === 'navigate');
|
|
157
|
-
expect(req).toBeDefined();
|
|
158
|
-
sendNativeResponse(nativeStdin, req.id, 'navigate', {
|
|
159
|
-
url: 'https://example.com',
|
|
160
|
-
title: 'Example Domain',
|
|
161
|
-
tabId: 1,
|
|
162
|
-
});
|
|
163
|
-
const result = await toolPromise;
|
|
164
149
|
expect(result.isError).toBeFalsy();
|
|
165
150
|
const text = result.content[0].text;
|
|
166
151
|
expect(text).toContain('Example Domain');
|
|
167
152
|
expect(text).toContain('https://example.com');
|
|
168
|
-
nativeStdout.removeAllListeners('data');
|
|
169
153
|
});
|
|
170
|
-
it('page_snapshot returns formatted snapshot from
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
154
|
+
it('page_snapshot returns formatted snapshot from ws client', async () => {
|
|
155
|
+
mockWs.setHandler((method) => ({
|
|
156
|
+
id: 'mock-id',
|
|
157
|
+
type: 'response',
|
|
158
|
+
method,
|
|
159
|
+
payload: {
|
|
160
|
+
text: '[page "Test"]\n [button "Click"]',
|
|
161
|
+
snapshotId: 'snap-123',
|
|
162
|
+
url: 'https://example.com',
|
|
163
|
+
title: 'Test Page',
|
|
164
|
+
},
|
|
165
|
+
timestamp: Date.now(),
|
|
166
|
+
}));
|
|
167
|
+
const result = await mcpClient.callTool({
|
|
174
168
|
name: 'page_snapshot',
|
|
175
169
|
arguments: {},
|
|
176
170
|
});
|
|
177
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
178
|
-
const combined = Buffer.concat(chunks);
|
|
179
|
-
const sent = decodeNativeMessages(combined);
|
|
180
|
-
const req = sent.find((m) => m.method === 'snapshot');
|
|
181
|
-
expect(req).toBeDefined();
|
|
182
|
-
sendNativeResponse(nativeStdin, req.id, 'snapshot', {
|
|
183
|
-
text: '[page "Test"]\n [button "Click"]',
|
|
184
|
-
snapshotId: 'snap-123',
|
|
185
|
-
url: 'https://example.com',
|
|
186
|
-
title: 'Test Page',
|
|
187
|
-
});
|
|
188
|
-
const result = await toolPromise;
|
|
189
171
|
expect(result.isError).toBeFalsy();
|
|
190
172
|
const text = result.content[0].text;
|
|
191
173
|
expect(text).toContain('Test Page');
|
|
192
174
|
expect(text).toContain('snap-123');
|
|
193
|
-
nativeStdout.removeAllListeners('data');
|
|
194
175
|
});
|
|
195
176
|
it('tool returning error response sets isError', async () => {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
const toolPromise = mcpClient.callTool({
|
|
199
|
-
name: 'page_snapshot',
|
|
200
|
-
arguments: {},
|
|
201
|
-
});
|
|
202
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
203
|
-
const combined = Buffer.concat(chunks);
|
|
204
|
-
const sent = decodeNativeMessages(combined);
|
|
205
|
-
const req = sent.find((m) => m.method === 'snapshot');
|
|
206
|
-
// Send an error response
|
|
207
|
-
const msg = JSON.stringify({
|
|
208
|
-
id: req.id,
|
|
177
|
+
mockWs.setHandler((method) => ({
|
|
178
|
+
id: 'mock-id',
|
|
209
179
|
type: 'error',
|
|
210
|
-
method
|
|
180
|
+
method,
|
|
211
181
|
payload: { code: 'NO_TAB', message: 'No active tab' },
|
|
212
182
|
timestamp: Date.now(),
|
|
183
|
+
}));
|
|
184
|
+
const result = await mcpClient.callTool({
|
|
185
|
+
name: 'page_snapshot',
|
|
186
|
+
arguments: {},
|
|
213
187
|
});
|
|
214
|
-
const body = Buffer.from(msg, 'utf-8');
|
|
215
|
-
const header = Buffer.alloc(4);
|
|
216
|
-
header.writeUInt32LE(body.length, 0);
|
|
217
|
-
nativeStdin.write(Buffer.concat([header, body]));
|
|
218
|
-
const result = await toolPromise;
|
|
219
188
|
expect(result.isError).toBe(true);
|
|
220
|
-
nativeStdout.removeAllListeners('data');
|
|
221
189
|
});
|
|
222
190
|
});
|
|
223
191
|
//# sourceMappingURL=mcp-protocol-integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-protocol-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-protocol-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"mcp-protocol-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-protocol-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
12
12
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
13
|
const cliPath = resolve(__dirname, '../../dist/cli.js');
|
|
14
14
|
let child = null;
|
|
15
|
+
let nextPort = 19080;
|
|
15
16
|
/** Send a JSON-RPC message as NDJSON (newline-delimited JSON). */
|
|
16
17
|
function sendJsonRpc(proc, message) {
|
|
17
18
|
proc.stdin.write(JSON.stringify(message) + '\n');
|
|
@@ -42,6 +43,30 @@ function createResponseCollector(proc) {
|
|
|
42
43
|
});
|
|
43
44
|
return state;
|
|
44
45
|
}
|
|
46
|
+
/** Spawn CLI and wait for it to be fully ready (WebSocket + MCP). */
|
|
47
|
+
function spawnAndWaitReady() {
|
|
48
|
+
const port = nextPort++;
|
|
49
|
+
const proc = spawn('node', [cliPath], {
|
|
50
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
51
|
+
timeout: 15000,
|
|
52
|
+
env: { ...process.env, WEBCLAW_PORT: String(port) },
|
|
53
|
+
});
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
let stderr = '';
|
|
56
|
+
const timeout = setTimeout(() => reject(new Error('Startup timed out')), 10000);
|
|
57
|
+
proc.stderr?.on('data', (chunk) => {
|
|
58
|
+
stderr += chunk.toString();
|
|
59
|
+
if (stderr.includes('MCP Server started')) {
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
resolve(proc);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
proc.on('exit', (code) => {
|
|
65
|
+
clearTimeout(timeout);
|
|
66
|
+
reject(new Error(`Process exited with code ${code} before ready. stderr: ${stderr}`));
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
45
70
|
afterEach(() => {
|
|
46
71
|
if (child && child.exitCode === null) {
|
|
47
72
|
child.kill('SIGTERM');
|
|
@@ -50,13 +75,8 @@ afterEach(() => {
|
|
|
50
75
|
});
|
|
51
76
|
describe('MCP Server stdio integration', () => {
|
|
52
77
|
it('responds to initialize request via JSON-RPC', async () => {
|
|
53
|
-
child =
|
|
54
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
55
|
-
timeout: 15000,
|
|
56
|
-
});
|
|
78
|
+
child = await spawnAndWaitReady();
|
|
57
79
|
const collector = createResponseCollector(child);
|
|
58
|
-
// Give the server time to start
|
|
59
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
60
80
|
sendJsonRpc(child, {
|
|
61
81
|
jsonrpc: '2.0',
|
|
62
82
|
id: 1,
|
|
@@ -73,15 +93,11 @@ describe('MCP Server stdio integration', () => {
|
|
|
73
93
|
const initResponse = collector.responses.find((r) => r.id === 1 && r.result);
|
|
74
94
|
expect(initResponse).toBeDefined();
|
|
75
95
|
expect(initResponse.result.serverInfo.name).toBe('webclaw');
|
|
76
|
-
expect(initResponse.result.serverInfo.version).toBe('0.1
|
|
96
|
+
expect(initResponse.result.serverInfo.version).toBe('0.2.1');
|
|
77
97
|
}, 20000);
|
|
78
98
|
it('lists 8 tools via JSON-RPC after initialization', async () => {
|
|
79
|
-
child =
|
|
80
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
81
|
-
timeout: 15000,
|
|
82
|
-
});
|
|
99
|
+
child = await spawnAndWaitReady();
|
|
83
100
|
const collector = createResponseCollector(child);
|
|
84
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
85
101
|
// Send initialize
|
|
86
102
|
sendJsonRpc(child, {
|
|
87
103
|
jsonrpc: '2.0',
|
|
@@ -126,12 +142,8 @@ describe('MCP Server stdio integration', () => {
|
|
|
126
142
|
]);
|
|
127
143
|
}, 20000);
|
|
128
144
|
it('each tool schema from stdio has correct structure', async () => {
|
|
129
|
-
child =
|
|
130
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
131
|
-
timeout: 15000,
|
|
132
|
-
});
|
|
145
|
+
child = await spawnAndWaitReady();
|
|
133
146
|
const collector = createResponseCollector(child);
|
|
134
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
135
147
|
sendJsonRpc(child, {
|
|
136
148
|
jsonrpc: '2.0',
|
|
137
149
|
id: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-stdio-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-stdio-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;AAExD,IAAI,KAAK,GAAwB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-stdio-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-stdio-integration.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -3,26 +3,31 @@
|
|
|
3
3
|
* WebClaw CLI entry point.
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
|
-
* npx webclaw-mcp - Start the MCP server (stdio transport)
|
|
7
|
-
* npx webclaw-mcp install -
|
|
6
|
+
* npx webclaw-mcp - Start the MCP server (stdio transport + WebSocket)
|
|
7
|
+
* npx webclaw-mcp install - Output Claude Desktop config
|
|
8
8
|
* npx webclaw-mcp --help - Show usage information
|
|
9
9
|
*/
|
|
10
10
|
import { createWebClawServer } from './server.js';
|
|
11
|
+
import { WebSocketClient } from './ws-client.js';
|
|
11
12
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
12
13
|
import { install } from './installer.js';
|
|
14
|
+
import { WEBSOCKET_DEFAULT_PORT, WEBSOCKET_PORT_ENV } from 'webclaw-shared';
|
|
13
15
|
const args = process.argv.slice(2);
|
|
14
16
|
if (args.includes('--help') || args.includes('-h')) {
|
|
15
17
|
console.log(`webclaw-mcp - WebMCP-native browser agent
|
|
16
18
|
|
|
17
19
|
Usage:
|
|
18
|
-
npx webclaw-mcp Start the MCP server (stdio
|
|
19
|
-
npx webclaw-mcp install
|
|
20
|
+
npx webclaw-mcp Start the MCP server (stdio + WebSocket)
|
|
21
|
+
npx webclaw-mcp install Output Claude Desktop config
|
|
20
22
|
npx webclaw-mcp --help Show this help message
|
|
21
23
|
|
|
22
24
|
Description:
|
|
23
25
|
WebClaw enables AI assistants like Claude to interact with web pages
|
|
24
|
-
through a Chrome extension and MCP protocol.
|
|
25
|
-
|
|
26
|
+
through a Chrome extension and MCP protocol. The MCP server communicates
|
|
27
|
+
with the Chrome extension via a localhost WebSocket connection.
|
|
28
|
+
|
|
29
|
+
Environment variables:
|
|
30
|
+
${WEBSOCKET_PORT_ENV} WebSocket port (default: ${WEBSOCKET_DEFAULT_PORT})
|
|
26
31
|
|
|
27
32
|
Claude Desktop config:
|
|
28
33
|
{
|
|
@@ -38,10 +43,12 @@ else if (args[0] === 'install') {
|
|
|
38
43
|
await install();
|
|
39
44
|
}
|
|
40
45
|
else {
|
|
41
|
-
|
|
42
|
-
const
|
|
46
|
+
const port = Number(process.env[WEBSOCKET_PORT_ENV]) || WEBSOCKET_DEFAULT_PORT;
|
|
47
|
+
const wsClient = await WebSocketClient.create(port);
|
|
48
|
+
console.error(`[WebClaw] WebSocket server listening on 127.0.0.1:${port}`);
|
|
49
|
+
const server = createWebClawServer({ wsClient });
|
|
43
50
|
const transport = new StdioServerTransport();
|
|
44
51
|
await server.connect(transport);
|
|
45
|
-
console.error(
|
|
52
|
+
console.error(`[WebClaw] MCP Server started (stdio transport)`);
|
|
46
53
|
}
|
|
47
54
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;IAaV,kBAAkB,gCAAgC,sBAAsB;;;;;;;;;+CAS7B,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;IACjC,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,sBAAsB,CAAC;IAC/E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,qDAAqD,IAAI,EAAE,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/installer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AASA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7C"}
|
package/dist/installer.js
CHANGED
|
@@ -1,81 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WebClaw installer.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* Claude Desktop configuration.
|
|
4
|
+
* Outputs Claude Desktop configuration.
|
|
6
5
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import { resolve, dirname } from 'node:path';
|
|
6
|
+
import { resolve } from 'node:path';
|
|
9
7
|
import { platform, env } from 'node:process';
|
|
10
|
-
import {
|
|
11
|
-
import { NATIVE_MESSAGING_HOST } from 'webclaw-shared';
|
|
12
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
-
const __dirname = dirname(__filename);
|
|
8
|
+
import { WEBSOCKET_DEFAULT_PORT, WEBSOCKET_PORT_ENV } from 'webclaw-shared';
|
|
14
9
|
export async function install() {
|
|
15
10
|
console.log('WebClaw Installer');
|
|
16
11
|
console.log('=================\n');
|
|
17
|
-
// 1. Register Native Messaging Host
|
|
18
|
-
registerNativeMessagingHost();
|
|
19
|
-
// 2. Output Claude Desktop config
|
|
20
12
|
outputClaudeDesktopConfig();
|
|
13
|
+
console.log(`\nWebSocket port: ${WEBSOCKET_DEFAULT_PORT} (override with ${WEBSOCKET_PORT_ENV} env var)`);
|
|
21
14
|
console.log('\nInstallation complete!');
|
|
22
15
|
}
|
|
23
|
-
function registerNativeMessagingHost() {
|
|
24
|
-
const hostPath = resolve(__dirname, 'cli.js');
|
|
25
|
-
const manifest = {
|
|
26
|
-
name: NATIVE_MESSAGING_HOST,
|
|
27
|
-
description: 'WebClaw Native Messaging Bridge',
|
|
28
|
-
path: getHostWrapperPath(),
|
|
29
|
-
type: 'stdio',
|
|
30
|
-
allowed_origins: [],
|
|
31
|
-
};
|
|
32
|
-
// Create wrapper script
|
|
33
|
-
createHostWrapper(hostPath);
|
|
34
|
-
// Determine manifest location
|
|
35
|
-
const manifestDir = getNativeMessagingManifestDir();
|
|
36
|
-
const manifestPath = resolve(manifestDir, `${NATIVE_MESSAGING_HOST}.json`);
|
|
37
|
-
mkdirSync(manifestDir, { recursive: true });
|
|
38
|
-
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
39
|
-
console.log(`Native Messaging host manifest written to:\n ${manifestPath}`);
|
|
40
|
-
console.log('\nNote: Update "allowed_origins" with your extension ID after loading it.');
|
|
41
|
-
console.log(` Example: "chrome-extension://YOUR_EXTENSION_ID/"`);
|
|
42
|
-
}
|
|
43
|
-
function getNativeMessagingManifestDir() {
|
|
44
|
-
const home = env.HOME ?? env.USERPROFILE ?? '';
|
|
45
|
-
switch (platform) {
|
|
46
|
-
case 'darwin':
|
|
47
|
-
return resolve(home, 'Library/Application Support/Google/Chrome/NativeMessagingHosts');
|
|
48
|
-
case 'linux':
|
|
49
|
-
return resolve(home, '.config/google-chrome/NativeMessagingHosts');
|
|
50
|
-
case 'win32':
|
|
51
|
-
// Windows uses registry, but we put manifest alongside for reference
|
|
52
|
-
return resolve(env.LOCALAPPDATA ?? resolve(home, 'AppData/Local'), 'Google/Chrome/User Data/NativeMessagingHosts');
|
|
53
|
-
default:
|
|
54
|
-
throw new Error(`Unsupported platform: ${platform}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
function getHostWrapperPath() {
|
|
58
|
-
const home = env.HOME ?? env.USERPROFILE ?? '';
|
|
59
|
-
switch (platform) {
|
|
60
|
-
case 'win32':
|
|
61
|
-
return resolve(home, '.webclaw', 'webclaw-host.bat');
|
|
62
|
-
default:
|
|
63
|
-
return resolve(home, '.webclaw', 'webclaw-host.sh');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function createHostWrapper(hostPath) {
|
|
67
|
-
const wrapperPath = getHostWrapperPath();
|
|
68
|
-
const wrapperDir = dirname(wrapperPath);
|
|
69
|
-
mkdirSync(wrapperDir, { recursive: true });
|
|
70
|
-
if (platform === 'win32') {
|
|
71
|
-
writeFileSync(wrapperPath, `@echo off\r\nnode "${hostPath}" %*\r\n`);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
writeFileSync(wrapperPath, `#!/bin/sh\nexec node "${hostPath}" "$@"\n`);
|
|
75
|
-
chmodSync(wrapperPath, 0o755);
|
|
76
|
-
}
|
|
77
|
-
console.log(`Host wrapper script written to:\n ${wrapperPath}`);
|
|
78
|
-
}
|
|
79
16
|
function outputClaudeDesktopConfig() {
|
|
80
17
|
const config = {
|
|
81
18
|
mcpServers: {
|
|
@@ -85,7 +22,7 @@ function outputClaudeDesktopConfig() {
|
|
|
85
22
|
},
|
|
86
23
|
},
|
|
87
24
|
};
|
|
88
|
-
console.log('
|
|
25
|
+
console.log('Claude Desktop configuration:');
|
|
89
26
|
console.log('Add the following to your claude_desktop_config.json:\n');
|
|
90
27
|
console.log(JSON.stringify(config, null, 2));
|
|
91
28
|
// Determine config file location
|
package/dist/installer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,yBAAyB,EAAE,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,qBAAqB,sBAAsB,mBAAmB,kBAAkB,WAAW,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,MAAM,GAAG;QACb,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC;aAC5B;SACF;KACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7C,iCAAiC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/C,IAAI,UAAkB,CAAC;IAEvB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,UAAU,GAAG,OAAO,CAClB,IAAI,EACJ,+DAA+D,CAChE,CAAC;YACF,MAAM;QACR,KAAK,OAAO;YACV,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,2CAA2C,CAAC,CAAC;YACxE,MAAM;QACR,KAAK,OAAO;YACV,UAAU,GAAG,OAAO,CAClB,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAC/C,mCAAmC,CACpC,CAAC;YACF,MAAM;QACR;YACE,UAAU,GAAG,4BAA4B,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;AAC1D,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* WebClaw MCP Server.
|
|
3
3
|
*
|
|
4
4
|
* Exposes 8 browser interaction tools via MCP protocol (stdio transport).
|
|
5
|
-
* Communicates with the Chrome Extension via
|
|
5
|
+
* Communicates with the Chrome Extension via WebSocket.
|
|
6
6
|
*/
|
|
7
7
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
-
import {
|
|
9
|
-
export declare function createWebClawServer(options
|
|
10
|
-
|
|
8
|
+
import { WebSocketClient } from './ws-client.js';
|
|
9
|
+
export declare function createWebClawServer(options: {
|
|
10
|
+
wsClient: WebSocketClient;
|
|
11
11
|
}): McpServer;
|
|
12
12
|
//# sourceMappingURL=server.d.ts.map
|