@ejazullah/browser-mcp 0.0.61 → 0.0.62
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/lib/mcp/transport.js +5 -5
- package/lib/program.js +3 -1
- package/package.json +1 -1
package/lib/mcp/transport.js
CHANGED
|
@@ -29,7 +29,7 @@ export async function start(serverBackendFactory, options, authConfig) {
|
|
|
29
29
|
if (options.port !== undefined) {
|
|
30
30
|
const httpServer = await startHttpServer(options);
|
|
31
31
|
const auth = new AuthManager(authConfig ?? defaultAuthConfig());
|
|
32
|
-
startHttpTransport(httpServer, serverBackendFactory, auth);
|
|
32
|
+
startHttpTransport(httpServer, serverBackendFactory, auth, !!options.heartbeat);
|
|
33
33
|
}
|
|
34
34
|
else {
|
|
35
35
|
await startStdioTransport(serverBackendFactory);
|
|
@@ -157,7 +157,7 @@ function findSessionIdByCdpKey(sessionCdpKeys, sessions, cdpSessionKey) {
|
|
|
157
157
|
}
|
|
158
158
|
return undefined;
|
|
159
159
|
}
|
|
160
|
-
async function handleStreamable(serverBackendFactory, req, res, sessions, sessionCdpKeys) {
|
|
160
|
+
async function handleStreamable(serverBackendFactory, req, res, sessions, sessionCdpKeys, runHeartbeat) {
|
|
161
161
|
const cdpSessionKey = resolveClientCdpSessionKey(req);
|
|
162
162
|
const sessionId = req.headers['mcp-session-id'];
|
|
163
163
|
if (sessionId) {
|
|
@@ -222,7 +222,7 @@ async function handleStreamable(serverBackendFactory, req, res, sessions, sessio
|
|
|
222
222
|
testDebug(`create http session: ${transport.sessionId}`);
|
|
223
223
|
if (cdpSessionKey)
|
|
224
224
|
sessionCdpKeys.set(sessionId, cdpSessionKey);
|
|
225
|
-
await mcpServer.connect(serverBackendFactory, transport,
|
|
225
|
+
await mcpServer.connect(serverBackendFactory, transport, runHeartbeat);
|
|
226
226
|
sessions.set(sessionId, transport);
|
|
227
227
|
}
|
|
228
228
|
});
|
|
@@ -239,7 +239,7 @@ async function handleStreamable(serverBackendFactory, req, res, sessions, sessio
|
|
|
239
239
|
res.statusCode = 400;
|
|
240
240
|
res.end('Invalid request');
|
|
241
241
|
}
|
|
242
|
-
function startHttpTransport(httpServer, serverBackendFactory, auth) {
|
|
242
|
+
function startHttpTransport(httpServer, serverBackendFactory, auth, runHeartbeat) {
|
|
243
243
|
const sseSessions = new Map();
|
|
244
244
|
const streamableSessions = new Map();
|
|
245
245
|
const streamableSessionCdpKeys = new Map();
|
|
@@ -267,7 +267,7 @@ function startHttpTransport(httpServer, serverBackendFactory, auth) {
|
|
|
267
267
|
if (url.pathname.startsWith('/sse'))
|
|
268
268
|
await handleSSE(serverBackendFactory, req, res, url, sseSessions);
|
|
269
269
|
else
|
|
270
|
-
await handleStreamable(serverBackendFactory, req, res, streamableSessions, streamableSessionCdpKeys);
|
|
270
|
+
await handleStreamable(serverBackendFactory, req, res, streamableSessions, streamableSessionCdpKeys, runHeartbeat);
|
|
271
271
|
});
|
|
272
272
|
});
|
|
273
273
|
const url = httpAddressToString(httpServer.address());
|
package/lib/program.js
CHANGED
|
@@ -78,6 +78,8 @@ program
|
|
|
78
78
|
.option('--viewport-size <size>', 'specify browser viewport size in pixels, for example "1280, 720"')
|
|
79
79
|
.option('--mcp-logs', 'Enable verbose MCP/session transport logs in CLI output')
|
|
80
80
|
.option('--no-mcp-logs', 'Disable verbose MCP/session transport logs in CLI output')
|
|
81
|
+
.option('--mcp-heartbeat', 'Enable MCP streamable transport heartbeat (may close sessions on slow/long operations)')
|
|
82
|
+
.option('--no-mcp-heartbeat', 'Disable MCP streamable transport heartbeat (recommended for n8n item-by-item runs)')
|
|
81
83
|
.option('--mongodb-url <url>', 'MongoDB connection URL. Example: mongodb://localhost:27017')
|
|
82
84
|
.option('--mongodb-db <name>', 'MongoDB database name. Default: playwright_mcp')
|
|
83
85
|
.option('--mongodb-collection <name>', 'MongoDB collection name. Default: element_interactions')
|
|
@@ -113,7 +115,7 @@ program
|
|
|
113
115
|
factories.push(createExtensionContextFactory(config));
|
|
114
116
|
const serverBackendFactory = () => new BrowserServerBackend(config, factories);
|
|
115
117
|
const authConfig = buildAuthConfig(options);
|
|
116
|
-
await mcpTransport.start(serverBackendFactory, config.server, authConfig);
|
|
118
|
+
await mcpTransport.start(serverBackendFactory, { ...config.server, heartbeat: options.mcpHeartbeat }, authConfig);
|
|
117
119
|
if (config.saveTrace) {
|
|
118
120
|
const server = await startTraceViewerServer();
|
|
119
121
|
const urlPrefix = server.urlPrefix('human-readable');
|