real-browser-mcp-server 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/lib/cjs/index.d.ts +2 -13
- package/dist/lib/cjs/index.d.ts.map +1 -1
- package/dist/lib/cjs/index.js.map +1 -1
- package/dist/lib/esm/index.d.mjs +2 -9
- package/dist/src/mcp/handlers/browser.d.ts +1 -1
- package/dist/src/mcp/handlers/browser.d.ts.map +1 -1
- package/dist/src/mcp/handlers/browser.js +62 -109
- package/dist/src/mcp/handlers/browser.js.map +1 -1
- package/dist/src/mcp/handlers/dom.d.ts +1 -1
- package/dist/src/mcp/handlers/dom.d.ts.map +1 -1
- package/dist/src/mcp/handlers/dom.js +90 -11
- package/dist/src/mcp/handlers/dom.js.map +1 -1
- package/dist/src/mcp/handlers/index.d.ts +2 -2
- package/dist/src/mcp/handlers/index.d.ts.map +1 -1
- package/dist/src/mcp/handlers/index.js +1 -14
- package/dist/src/mcp/handlers/index.js.map +1 -1
- package/dist/src/mcp/handlers/network.d.ts.map +1 -1
- package/dist/src/mcp/handlers/network.js +16 -3
- package/dist/src/mcp/handlers/network.js.map +1 -1
- package/dist/src/mcp/handlers/state.d.ts +0 -2
- package/dist/src/mcp/handlers/state.d.ts.map +1 -1
- package/dist/src/mcp/handlers/state.js +1 -8
- package/dist/src/mcp/handlers/state.js.map +1 -1
- package/dist/src/mcp/handlers/utility-handlers.d.ts +1 -4
- package/dist/src/mcp/handlers/utility-handlers.d.ts.map +1 -1
- package/dist/src/mcp/handlers/utility-handlers.js +12 -2
- package/dist/src/mcp/handlers/utility-handlers.js.map +1 -1
- package/dist/src/shared/activity-logger.d.ts +1 -2
- package/dist/src/shared/activity-logger.d.ts.map +1 -1
- package/dist/src/shared/activity-logger.js +1 -2
- package/dist/src/shared/activity-logger.js.map +1 -1
- package/dist/src/shared/lib-core.d.ts +18 -11
- package/dist/src/shared/lib-core.d.ts.map +1 -1
- package/dist/src/shared/lib-core.js +14 -34
- package/dist/src/shared/lib-core.js.map +1 -1
- package/dist/src/types.d.ts +8 -89
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +5 -7
- package/dist/src/shared/cache-manager.d.ts +0 -78
- package/dist/src/shared/cache-manager.d.ts.map +0 -1
- package/dist/src/shared/cache-manager.js +0 -219
- package/dist/src/shared/cache-manager.js.map +0 -1
- package/dist/test/cjs/test.d.ts +0 -11
- package/dist/test/cjs/test.d.ts.map +0 -1
- package/dist/test/cjs/test.js +0 -242
- package/dist/test/cjs/test.js.map +0 -1
- package/dist/test/mcp/smoke-test.d.ts +0 -29
- package/dist/test/mcp/smoke-test.d.ts.map +0 -1
- package/dist/test/mcp/smoke-test.js +0 -144
- package/dist/test/mcp/smoke-test.js.map +0 -1
- package/dist/test/unit/handler-test.d.ts +0 -3
- package/dist/test/unit/handler-test.d.ts.map +0 -1
- package/dist/test/unit/handler-test.js +0 -133
- package/dist/test/unit/handler-test.js.map +0 -1
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
// @ts-nocheck
|
|
4
|
-
/**
|
|
5
|
-
* MCP Smoke Test — network-independent, fast.
|
|
6
|
-
*
|
|
7
|
-
* Spawns the MCP server over STDIO exactly like a real client (Cline/Claude),
|
|
8
|
-
* performs the JSON-RPC handshake, and verifies:
|
|
9
|
-
* 1. STDOUT carries ONLY clean JSON-RPC (no banner/log contamination)
|
|
10
|
-
* 2. `initialize` returns valid serverInfo (name + version from package.json)
|
|
11
|
-
* 3. `tools/list` returns all expected tools with valid schemas
|
|
12
|
-
* 4. Tool definitions match src/shared/tools.js (count + names)
|
|
13
|
-
* 5. Every tool in the registry has a handler implementation
|
|
14
|
-
*
|
|
15
|
-
* This does NOT launch a browser, so it runs in milliseconds and in CI.
|
|
16
|
-
* Exit code 0 = all pass, 1 = failure.
|
|
17
|
-
*/
|
|
18
|
-
const { spawn } = require('child_process');
|
|
19
|
-
const path = require('path');
|
|
20
|
-
const assert = require('assert');
|
|
21
|
-
const ROOT = path.join(__dirname, '..', '..');
|
|
22
|
-
const SERVER = require('fs').existsSync(path.join(ROOT, 'dist', 'src', 'index.js'))
|
|
23
|
-
? path.join(ROOT, 'dist', 'src', 'index.js')
|
|
24
|
-
: path.join(ROOT, 'src', 'index.js');
|
|
25
|
-
const { TOOLS } = require(require('fs').existsSync(path.join(ROOT, 'dist', 'src', 'shared', 'tools.js'))
|
|
26
|
-
? path.join(ROOT, 'dist', 'src', 'shared', 'tools.js')
|
|
27
|
-
: path.join(ROOT, 'src', 'shared', 'tools.js'));
|
|
28
|
-
const { handlers } = require(require('fs').existsSync(path.join(ROOT, 'dist', 'src', 'mcp', 'handlers', 'index.js'))
|
|
29
|
-
? path.join(ROOT, 'dist', 'src', 'mcp', 'handlers', 'index.js')
|
|
30
|
-
: path.join(ROOT, 'src', 'mcp', 'handlers', 'index.js'));
|
|
31
|
-
let PKG;
|
|
32
|
-
try {
|
|
33
|
-
PKG = require(path.join(ROOT, 'package.json'));
|
|
34
|
-
}
|
|
35
|
-
catch (e) {
|
|
36
|
-
PKG = require(path.join(ROOT, '..', 'package.json'));
|
|
37
|
-
}
|
|
38
|
-
let passed = 0;
|
|
39
|
-
let failed = 0;
|
|
40
|
-
function check(name, fn) {
|
|
41
|
-
try {
|
|
42
|
-
fn();
|
|
43
|
-
console.log(` \u2705 ${name}`);
|
|
44
|
-
passed++;
|
|
45
|
-
}
|
|
46
|
-
catch (e) {
|
|
47
|
-
console.log(` \u274c ${name}\n ${e.message}`);
|
|
48
|
-
failed++;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function rpc(child, obj) {
|
|
52
|
-
child.stdin.write(JSON.stringify(obj) + '\n');
|
|
53
|
-
}
|
|
54
|
-
async function main() {
|
|
55
|
-
console.log('\n\ud83e\uddea MCP Smoke Test (no browser)\n');
|
|
56
|
-
// --- Static checks (no spawn needed) ---
|
|
57
|
-
console.log('Static checks:');
|
|
58
|
-
check('every registered tool has a handler', () => {
|
|
59
|
-
const missing = TOOLS.filter((t) => typeof handlers[t.name] !== 'function').map((t) => t.name);
|
|
60
|
-
assert.strictEqual(missing.length, 0, `missing handlers: ${missing.join(', ')}`);
|
|
61
|
-
});
|
|
62
|
-
check('every tool has name + inputSchema', () => {
|
|
63
|
-
const bad = TOOLS.filter((t) => !t.name || !t.inputSchema || t.inputSchema.type !== 'object');
|
|
64
|
-
assert.strictEqual(bad.length, 0, `invalid tool defs: ${bad.map(t => t.name).join(', ')}`);
|
|
65
|
-
});
|
|
66
|
-
check('no duplicate tool names', () => {
|
|
67
|
-
const names = TOOLS.map((t) => t.name);
|
|
68
|
-
const dupes = names.filter((n, i) => names.indexOf(n) !== i);
|
|
69
|
-
assert.strictEqual(dupes.length, 0, `duplicates: ${dupes.join(', ')}`);
|
|
70
|
-
});
|
|
71
|
-
// --- Live STDIO handshake ---
|
|
72
|
-
console.log('\nLive STDIO handshake:');
|
|
73
|
-
const child = spawn('node', [SERVER], {
|
|
74
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
75
|
-
env: { ...process.env, HEADLESS: 'true' },
|
|
76
|
-
});
|
|
77
|
-
const responses = {};
|
|
78
|
-
let stdoutBuf = '';
|
|
79
|
-
let nonJsonLines = 0;
|
|
80
|
-
child.stdout.on('data', (d) => {
|
|
81
|
-
stdoutBuf += d.toString();
|
|
82
|
-
let idx;
|
|
83
|
-
while ((idx = stdoutBuf.indexOf('\n')) >= 0) {
|
|
84
|
-
const line = stdoutBuf.slice(0, idx).trim();
|
|
85
|
-
stdoutBuf = stdoutBuf.slice(idx + 1);
|
|
86
|
-
if (!line)
|
|
87
|
-
continue;
|
|
88
|
-
try {
|
|
89
|
-
const msg = JSON.parse(line);
|
|
90
|
-
if (msg.id !== undefined)
|
|
91
|
-
responses[msg.id] = msg;
|
|
92
|
-
}
|
|
93
|
-
catch (e) {
|
|
94
|
-
nonJsonLines++;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
const wait = (ms) => new Promise(r => setTimeout(r, ms));
|
|
99
|
-
await wait(1200);
|
|
100
|
-
rpc(child, {
|
|
101
|
-
jsonrpc: '2.0', id: 1, method: 'initialize',
|
|
102
|
-
params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'smoke-test', version: '1.0.0' } },
|
|
103
|
-
});
|
|
104
|
-
await wait(1200);
|
|
105
|
-
rpc(child, { jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} });
|
|
106
|
-
await wait(1500);
|
|
107
|
-
child.kill();
|
|
108
|
-
check('STDOUT had zero non-JSON lines (clean JSON-RPC stream)', () => {
|
|
109
|
-
assert.strictEqual(nonJsonLines, 0, `${nonJsonLines} non-JSON line(s) leaked to STDOUT`);
|
|
110
|
-
});
|
|
111
|
-
check('initialize responded', () => {
|
|
112
|
-
assert.ok(responses[1], 'no response for id=1');
|
|
113
|
-
assert.ok(responses[1].result, 'initialize has no result');
|
|
114
|
-
});
|
|
115
|
-
check('serverInfo.name is correct', () => {
|
|
116
|
-
assert.strictEqual(responses[1].result.serverInfo.name, 'real-browser-mcp-server');
|
|
117
|
-
});
|
|
118
|
-
check('serverInfo.version matches package.json', () => {
|
|
119
|
-
assert.strictEqual(responses[1].result.serverInfo.version, PKG.version, `server reported ${responses[1].result.serverInfo.version}, package.json is ${PKG.version}`);
|
|
120
|
-
});
|
|
121
|
-
check('tools/list responded', () => {
|
|
122
|
-
assert.ok(responses[2], 'no response for id=2');
|
|
123
|
-
assert.ok(Array.isArray(responses[2].result.tools), 'tools is not an array');
|
|
124
|
-
});
|
|
125
|
-
check(`tools/list returns ${TOOLS.length} tools`, () => {
|
|
126
|
-
assert.strictEqual(responses[2].result.tools.length, TOOLS.length);
|
|
127
|
-
});
|
|
128
|
-
check('tools/list names match registry', () => {
|
|
129
|
-
const live = responses[2].result.tools.map((t) => t.name).sort();
|
|
130
|
-
const reg = TOOLS.map((t) => t.name).sort();
|
|
131
|
-
assert.deepStrictEqual(live, reg);
|
|
132
|
-
});
|
|
133
|
-
check('every live tool has an inputSchema', () => {
|
|
134
|
-
const bad = responses[2].result.tools.filter((t) => !t.inputSchema);
|
|
135
|
-
assert.strictEqual(bad.length, 0, `missing inputSchema: ${bad.map(t => t.name).join(', ')}`);
|
|
136
|
-
});
|
|
137
|
-
console.log(`\n\u2139 passed ${passed}, failed ${failed}\n`);
|
|
138
|
-
process.exit(failed === 0 ? 0 : 1);
|
|
139
|
-
}
|
|
140
|
-
main().catch((e) => {
|
|
141
|
-
console.error('Smoke test crashed:', e);
|
|
142
|
-
process.exit(1);
|
|
143
|
-
});
|
|
144
|
-
//# sourceMappingURL=smoke-test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke-test.js","sourceRoot":"","sources":["../../../test/mcp/smoke-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler-test.d.ts","sourceRoot":"","sources":["../../../test/unit/handler-test.ts"],"names":[],"mappings":"AACA,QAAA,MAAM,IAAI,KAAuB,CAAC;AAClC,QAAA,MAAM,MAAM,KAAyB,CAAC"}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// @ts-nocheck
|
|
3
|
-
const test = require('node:test');
|
|
4
|
-
const assert = require('node:assert');
|
|
5
|
-
test('tools registry has 21 tools with valid schemas', () => {
|
|
6
|
-
const { TOOLS } = require('../../src/shared/tools');
|
|
7
|
-
assert.strictEqual(TOOLS.length, 21, `Expected 21 tools, got ${TOOLS.length}`);
|
|
8
|
-
for (const tool of TOOLS) {
|
|
9
|
-
assert.ok(tool.name, 'Tool must have a name');
|
|
10
|
-
assert.ok(tool.description, `${tool.name} must have a description`);
|
|
11
|
-
assert.ok(tool.inputSchema, `${tool.name} must have inputSchema`);
|
|
12
|
-
assert.ok(tool.inputSchema.properties, `${tool.name} must have inputSchema.properties`);
|
|
13
|
-
assert.ok(tool.category, `${tool.name} must have a category`);
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
test('tools have no duplicate names', () => {
|
|
17
|
-
const { TOOLS } = require('../../src/shared/tools');
|
|
18
|
-
const names = TOOLS.map((t) => t.name);
|
|
19
|
-
const unique = new Set(names);
|
|
20
|
-
assert.strictEqual(names.length, unique.size, 'Duplicate tool names found');
|
|
21
|
-
});
|
|
22
|
-
test('solve_captcha does NOT advertise recaptcha/hcaptcha', () => {
|
|
23
|
-
const { TOOLS } = require('../../src/shared/tools');
|
|
24
|
-
const captcha = TOOLS.find((t) => t.name === 'solve_captcha');
|
|
25
|
-
assert.ok(captcha, 'solve_captcha tool must exist');
|
|
26
|
-
const enumValues = captcha.inputSchema.properties.type.enum;
|
|
27
|
-
assert.ok(!enumValues.includes('recaptcha'), 'Must not include recaptcha');
|
|
28
|
-
assert.ok(!enumValues.includes('hcaptcha'), 'Must not include hcaptcha');
|
|
29
|
-
assert.ok(enumValues.includes('turnstile'), 'Must include turnstile');
|
|
30
|
-
assert.ok(enumValues.includes('text'), 'Must include text');
|
|
31
|
-
assert.ok(enumValues.includes('auto'), 'Must include auto');
|
|
32
|
-
});
|
|
33
|
-
test('browser_init turnstile default matches code (false)', () => {
|
|
34
|
-
const { TOOLS } = require('../../src/shared/tools');
|
|
35
|
-
const init = TOOLS.find((t) => t.name === 'browser_init');
|
|
36
|
-
assert.strictEqual(init.inputSchema.properties.turnstile.default, false);
|
|
37
|
-
});
|
|
38
|
-
test('wait tool has no smart type', () => {
|
|
39
|
-
const { TOOLS } = require('../../src/shared/tools');
|
|
40
|
-
const wait = TOOLS.find((t) => t.name === 'wait');
|
|
41
|
-
assert.ok(!wait.inputSchema.properties.type.enum.includes('smart'), 'Must not include smart');
|
|
42
|
-
});
|
|
43
|
-
test('state module exports correct interface', () => {
|
|
44
|
-
const state = require('../../src/mcp/handlers/state');
|
|
45
|
-
assert.ok(state.state, 'Must export state');
|
|
46
|
-
assert.ok(state.requireBrowser, 'Must export requireBrowser');
|
|
47
|
-
assert.ok(state.notifyProgress, 'Must export notifyProgress');
|
|
48
|
-
assert.ok(state.getHeadlessFromEnv, 'Must export getHeadlessFromEnv');
|
|
49
|
-
assert.ok(state.resolveWaitUntil, 'Must export resolveWaitUntil');
|
|
50
|
-
assert.ok(state.globalCache, 'Must export globalCache');
|
|
51
|
-
assert.ok(state.decoders, 'Must export decoders');
|
|
52
|
-
assert.ok(state.setProgressCallback, 'Must export setProgressCallback');
|
|
53
|
-
});
|
|
54
|
-
test('decoders work correctly', () => {
|
|
55
|
-
const { decoders } = require('../../src/mcp/handlers/state');
|
|
56
|
-
const urlResult = decoders.urlDecode('hello%20world');
|
|
57
|
-
assert.ok(urlResult.success);
|
|
58
|
-
assert.strictEqual(urlResult.decoded, 'hello world');
|
|
59
|
-
const b64Result = decoders.base64Decode(Buffer.from('test data').toString('base64'));
|
|
60
|
-
assert.ok(b64Result.success);
|
|
61
|
-
assert.strictEqual(b64Result.decoded, 'test data');
|
|
62
|
-
});
|
|
63
|
-
test('getHeadlessFromEnv respects HEADLESS env var', () => {
|
|
64
|
-
const { getHeadlessFromEnv } = require('../../src/mcp/handlers/state');
|
|
65
|
-
const orig = process.env.HEADLESS;
|
|
66
|
-
process.env.HEADLESS = 'true';
|
|
67
|
-
assert.strictEqual(getHeadlessFromEnv(), true);
|
|
68
|
-
process.env.HEADLESS = 'false';
|
|
69
|
-
assert.strictEqual(getHeadlessFromEnv(), false);
|
|
70
|
-
delete process.env.HEADLESS;
|
|
71
|
-
});
|
|
72
|
-
test('resolveWaitUntil validates correctly', () => {
|
|
73
|
-
const { resolveWaitUntil } = require('../../src/mcp/handlers/state');
|
|
74
|
-
assert.strictEqual(resolveWaitUntil('load'), 'load');
|
|
75
|
-
assert.strictEqual(resolveWaitUntil('domcontentloaded'), 'domcontentloaded');
|
|
76
|
-
assert.strictEqual(resolveWaitUntil('networkidle'), 'networkidle');
|
|
77
|
-
assert.strictEqual(resolveWaitUntil('commit'), 'commit');
|
|
78
|
-
assert.strictEqual(resolveWaitUntil('invalid'), 'networkidle');
|
|
79
|
-
assert.strictEqual(resolveWaitUntil('smart'), 'networkidle');
|
|
80
|
-
});
|
|
81
|
-
test('handlers index has all 21 tool handlers', () => {
|
|
82
|
-
const { handlers } = require('../../src/mcp/handlers/index');
|
|
83
|
-
const { TOOLS } = require('../../src/shared/tools');
|
|
84
|
-
for (const tool of TOOLS) {
|
|
85
|
-
assert.ok(typeof handlers[tool.name] === 'function', `Handler for ${tool.name} must be a function`);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
test('executeTool returns error for unknown tool', async () => {
|
|
89
|
-
const { executeTool } = require('../../src/mcp/handlers/index');
|
|
90
|
-
const result = await executeTool('nonexistent_tool', {});
|
|
91
|
-
assert.strictEqual(result.success, false);
|
|
92
|
-
assert.ok(result.error.includes('not implemented'));
|
|
93
|
-
});
|
|
94
|
-
test('activity logger records tool calls', () => {
|
|
95
|
-
const { activityLogger } = require('../../src/shared/activity-logger');
|
|
96
|
-
assert.ok(typeof activityLogger.record === 'function');
|
|
97
|
-
assert.ok(typeof activityLogger.sanitizeArgs === 'function');
|
|
98
|
-
assert.ok(typeof activityLogger.destroy === 'function');
|
|
99
|
-
});
|
|
100
|
-
test('cache manager works correctly', () => {
|
|
101
|
-
const { CacheManager } = require('../../src/shared/cache-manager');
|
|
102
|
-
const cache = new CacheManager({ cacheDir: require('path').join(require('os').tmpdir(), 'test-cache-' + Date.now()) });
|
|
103
|
-
cache.set('test-key', { value: 42 });
|
|
104
|
-
assert.deepStrictEqual(cache.get('test-key'), { value: 42 });
|
|
105
|
-
cache.set('test-key', null);
|
|
106
|
-
assert.strictEqual(cache.get('test-key'), null);
|
|
107
|
-
});
|
|
108
|
-
test('colors module exports all color codes', () => {
|
|
109
|
-
const { colors } = require('../../src/shared/colors');
|
|
110
|
-
assert.ok(colors.reset, 'Must have reset');
|
|
111
|
-
assert.ok(colors.red, 'Must have red');
|
|
112
|
-
assert.ok(colors.green, 'Must have green');
|
|
113
|
-
assert.ok(colors.yellow, 'Must have yellow');
|
|
114
|
-
assert.ok(colors.cyan, 'Must have cyan');
|
|
115
|
-
});
|
|
116
|
-
test('lib-core exports createConnect and setupRealPage', () => {
|
|
117
|
-
const libCore = require('../../src/shared/lib-core');
|
|
118
|
-
assert.ok(typeof libCore.createConnect === 'function', 'Must export createConnect');
|
|
119
|
-
assert.ok(typeof libCore.setupRealPage === 'function', 'Must export setupRealPage');
|
|
120
|
-
assert.ok(typeof libCore.getDefaultHeadless === 'function', 'Must export getDefaultHeadless');
|
|
121
|
-
});
|
|
122
|
-
test('connect returns correct shape (browser, page, blocker, setupPage)', async () => {
|
|
123
|
-
const libCore = require('../../src/shared/lib-core');
|
|
124
|
-
const connect = libCore.createConnect(async ({ page }) => page);
|
|
125
|
-
assert.ok(typeof connect === 'function', 'createConnect must return a function');
|
|
126
|
-
});
|
|
127
|
-
test('browser_close respects saveSession param', () => {
|
|
128
|
-
const { TOOLS } = require('../../src/shared/tools');
|
|
129
|
-
const close = TOOLS.find((t) => t.name === 'browser_close');
|
|
130
|
-
assert.ok(close.inputSchema.properties.saveSession, 'Must have saveSession param');
|
|
131
|
-
assert.strictEqual(close.inputSchema.properties.saveSession.default, false);
|
|
132
|
-
});
|
|
133
|
-
//# sourceMappingURL=handler-test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler-test.js","sourceRoot":"","sources":["../../../test/unit/handler-test.ts"],"names":[],"mappings":"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"}
|