browser-devtools-mcp 0.0.1 → 0.0.3
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 +177 -50
- package/dist/browser.js +162 -22
- package/dist/browser.js.map +1 -1
- package/dist/config.js +46 -1
- package/dist/config.js.map +1 -1
- package/dist/context.js +72 -12
- package/dist/context.js.map +1 -1
- package/dist/index.js +77 -42
- package/dist/index.js.map +1 -1
- package/dist/otel/otel-controller.js +319 -0
- package/dist/otel/otel-controller.js.map +1 -0
- package/dist/otel/otel-initializer.bundle.js +2 -0
- package/dist/otel/otel-initializer.bundle.js.map +7 -0
- package/dist/otel/otel-proxy.js +407 -0
- package/dist/otel/otel-proxy.js.map +1 -0
- package/dist/server-info.js +48 -10
- package/dist/server-info.js.map +1 -1
- package/dist/server.js +47 -32
- package/dist/server.js.map +1 -1
- package/dist/tools/a11y/index.js +7 -0
- package/dist/tools/a11y/index.js.map +1 -0
- package/dist/tools/{content → a11y}/take-aria-snapshot.js +6 -1
- package/dist/tools/a11y/take-aria-snapshot.js.map +1 -0
- package/dist/tools/a11y/take-ax-tree-snapshot.js +850 -0
- package/dist/tools/a11y/take-ax-tree-snapshot.js.map +1 -0
- package/dist/tools/content/index.js +0 -2
- package/dist/tools/content/index.js.map +1 -1
- package/dist/tools/content/save-as-pdf.js +9 -36
- package/dist/tools/content/save-as-pdf.js.map +1 -1
- package/dist/tools/content/take-screenshot.js +14 -37
- package/dist/tools/content/take-screenshot.js.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/monitoring/get-trace-id.js +30 -0
- package/dist/tools/monitoring/get-trace-id.js.map +1 -0
- package/dist/tools/monitoring/index.js +10 -1
- package/dist/tools/monitoring/index.js.map +1 -1
- package/dist/tools/monitoring/new-trace-id.js +32 -0
- package/dist/tools/monitoring/new-trace-id.js.map +1 -0
- package/dist/tools/monitoring/set-trace-id.js +28 -0
- package/dist/tools/monitoring/set-trace-id.js.map +1 -0
- package/dist/tools/tool-executor.js +26 -4
- package/dist/tools/tool-executor.js.map +1 -1
- package/dist/utils.js +38 -0
- package/dist/utils.js.map +1 -1
- package/package.json +7 -2
- package/dist/tools/content/take-aria-snapshot.js.map +0 -1
package/dist/context.js
CHANGED
|
@@ -34,25 +34,37 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.McpSessionContext = void 0;
|
|
37
|
+
const browser_1 = require("./browser");
|
|
37
38
|
const config_1 = require("./config");
|
|
38
39
|
const logger = __importStar(require("./logger"));
|
|
40
|
+
const otel_controller_1 = require("./otel/otel-controller");
|
|
39
41
|
const types_1 = require("./types");
|
|
42
|
+
const utils_1 = require("./utils");
|
|
40
43
|
class McpSessionContext {
|
|
44
|
+
_sessionId;
|
|
45
|
+
options;
|
|
46
|
+
otelController;
|
|
41
47
|
consoleMessages = [];
|
|
42
48
|
httpRequests = [];
|
|
43
|
-
|
|
49
|
+
initialized = false;
|
|
44
50
|
closed = false;
|
|
45
|
-
|
|
51
|
+
traceId;
|
|
46
52
|
browserContext;
|
|
47
53
|
page;
|
|
48
|
-
constructor(
|
|
49
|
-
this.
|
|
50
|
-
this.browser = browser;
|
|
54
|
+
constructor(sessionId, browserContext, page, options) {
|
|
55
|
+
this._sessionId = sessionId;
|
|
51
56
|
this.browserContext = browserContext;
|
|
52
57
|
this.page = page;
|
|
53
|
-
this.
|
|
58
|
+
this.options = options;
|
|
59
|
+
this.otelController = new otel_controller_1.OTELController(this.browserContext);
|
|
54
60
|
}
|
|
55
|
-
|
|
61
|
+
async init() {
|
|
62
|
+
if (this.closed) {
|
|
63
|
+
throw new Error('Session context is already closed');
|
|
64
|
+
}
|
|
65
|
+
if (this.initialized) {
|
|
66
|
+
throw new Error('Session context is already initialized');
|
|
67
|
+
}
|
|
56
68
|
const me = this;
|
|
57
69
|
let consoleMessageSequenceNumber = 0;
|
|
58
70
|
this.page.on('console', (msg) => {
|
|
@@ -80,6 +92,13 @@ class McpSessionContext {
|
|
|
80
92
|
me.httpRequests.splice(0, me.httpRequests.length - config_1.HTTP_REQUESTS_BUFFER_SIZE);
|
|
81
93
|
}
|
|
82
94
|
});
|
|
95
|
+
if (this.options.otelEnable) {
|
|
96
|
+
this.traceId = (0, utils_1.newTraceId)();
|
|
97
|
+
await this.otelController.init({
|
|
98
|
+
traceId: this.traceId,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
this.initialized = true;
|
|
83
102
|
}
|
|
84
103
|
_toConsoleMessageLevelName(type) {
|
|
85
104
|
switch (type) {
|
|
@@ -155,6 +174,35 @@ class McpSessionContext {
|
|
|
155
174
|
sequenceNumber,
|
|
156
175
|
};
|
|
157
176
|
}
|
|
177
|
+
_isBodyLikelyPresent(status, method) {
|
|
178
|
+
if (method === 'HEAD' || method === 'OPTIONS') {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
if (status === 204 || status === 304) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
if (status >= 300 && status < 400) {
|
|
185
|
+
// redirects
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
async _safeReadResponseBody(res) {
|
|
191
|
+
try {
|
|
192
|
+
const req = res.request();
|
|
193
|
+
const method = req.method();
|
|
194
|
+
const status = res.status();
|
|
195
|
+
if (!this._isBodyLikelyPresent(status, method)) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
const buf = await res.body(); // may throw
|
|
199
|
+
return buf.toString('utf-8');
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// This is the important part: CDP can't always provide body.
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
158
206
|
async _toHttpRequest(req, sequenceNumber) {
|
|
159
207
|
const res = await req.response();
|
|
160
208
|
return {
|
|
@@ -170,7 +218,7 @@ class McpSessionContext {
|
|
|
170
218
|
status: res.status(),
|
|
171
219
|
statusText: res.statusText(),
|
|
172
220
|
headers: res.headers(),
|
|
173
|
-
body:
|
|
221
|
+
body: await this._safeReadResponseBody(res),
|
|
174
222
|
}
|
|
175
223
|
: undefined,
|
|
176
224
|
ok: res ? res.ok() : false,
|
|
@@ -179,7 +227,17 @@ class McpSessionContext {
|
|
|
179
227
|
};
|
|
180
228
|
}
|
|
181
229
|
sessionId() {
|
|
182
|
-
return this.
|
|
230
|
+
return this._sessionId;
|
|
231
|
+
}
|
|
232
|
+
async getTraceId() {
|
|
233
|
+
return this.traceId;
|
|
234
|
+
}
|
|
235
|
+
async setTraceId(traceId) {
|
|
236
|
+
if (!this.options.otelEnable) {
|
|
237
|
+
throw new Error('OTEL is not enabled');
|
|
238
|
+
}
|
|
239
|
+
this.traceId = traceId;
|
|
240
|
+
await this.otelController.setTraceId(this.page, traceId);
|
|
183
241
|
}
|
|
184
242
|
getConsoleMessages() {
|
|
185
243
|
return this.consoleMessages;
|
|
@@ -191,13 +249,15 @@ class McpSessionContext {
|
|
|
191
249
|
if (this.closed) {
|
|
192
250
|
return false;
|
|
193
251
|
}
|
|
252
|
+
logger.debug(`Closing OTEL controller of the MCP session with id ${this._sessionId} ...`);
|
|
253
|
+
await this.otelController.close();
|
|
194
254
|
// Page(s) owned by browser context are already closed by the browser context itself
|
|
195
255
|
try {
|
|
196
|
-
logger.debug(`Closing browser context of the MCP session with id ${this.
|
|
197
|
-
await this.browserContext
|
|
256
|
+
logger.debug(`Closing browser context of the MCP session with id ${this._sessionId} ...`);
|
|
257
|
+
await (0, browser_1.closeBrowserContext)(this.browserContext);
|
|
198
258
|
}
|
|
199
259
|
catch (err) {
|
|
200
|
-
logger.debug(`Error occurred while closing browser context of the MCP session with id ${this.
|
|
260
|
+
logger.debug(`Error occurred while closing browser context of the MCP session with id ${this._sessionId} ...`, err);
|
|
201
261
|
}
|
|
202
262
|
this.consoleMessages.length = 0;
|
|
203
263
|
this.httpRequests.length = 0;
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAGkB;AAClB,iDAAmC;AACnC,mCAQiB;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -96,20 +96,42 @@ function _getConfig() {
|
|
|
96
96
|
return {};
|
|
97
97
|
}
|
|
98
98
|
async function _startStdioServer() {
|
|
99
|
-
|
|
99
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
100
|
+
await (0, server_1.createServer)(transport, {
|
|
101
|
+
config: _getConfig(),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function _createSession(ctx, transport, server) {
|
|
105
|
+
// Create MCP session with MCP server
|
|
106
|
+
const session = (0, server_1.createSession)(transport, server);
|
|
107
|
+
// Register hook to close the associated MCP session on socket close
|
|
108
|
+
const socket = ctx.env.incoming.socket;
|
|
109
|
+
if (!socket._mcpRegistered) {
|
|
110
|
+
socket._mcpRegistered = true;
|
|
111
|
+
socket.on('close', async () => {
|
|
112
|
+
logger.debug(`Socket, which is for MCP session with id ${transport.sessionId}, has been closed`);
|
|
113
|
+
if (config.SESSION_CLOSE_ON_SOCKET_CLOSE) {
|
|
114
|
+
await transport.close();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Register MCP session close hook to gracefully close it
|
|
119
|
+
_registerMCPSessionClose(transport, session.server);
|
|
120
|
+
logger.debug(`Created MCP server session with id ${transport.sessionId}`);
|
|
121
|
+
return session;
|
|
100
122
|
}
|
|
101
|
-
async function
|
|
102
|
-
let session;
|
|
123
|
+
async function _createTransport(ctx) {
|
|
103
124
|
// Get MCP server config
|
|
104
125
|
const serverConfig = _getConfig();
|
|
126
|
+
const holder = {};
|
|
105
127
|
// Create new instances of MCP Server and Transport for each incoming request
|
|
106
128
|
const transport = new mcp_1.StreamableHTTPTransport({
|
|
107
129
|
// Change to `false` if you want to enable SSE in responses.
|
|
108
130
|
enableJsonResponse: true,
|
|
109
131
|
sessionIdGenerator: () => crypto_1.default.randomUUID(),
|
|
110
132
|
onsessioninitialized: async (sessionId) => {
|
|
133
|
+
const session = _createSession(ctx, transport, holder.server);
|
|
111
134
|
sessions.set(sessionId, session);
|
|
112
|
-
session.initialized = true;
|
|
113
135
|
logger.debug(`MCP session initialized with id ${sessionId}`);
|
|
114
136
|
},
|
|
115
137
|
onsessionclosed: async (sessionId) => {
|
|
@@ -118,40 +140,38 @@ async function _createMCPServerSession(ctx) {
|
|
|
118
140
|
logger.debug(`MCP session closed with id ${sessionId}`);
|
|
119
141
|
},
|
|
120
142
|
});
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (!socket._mcpRegistered) {
|
|
126
|
-
socket._mcpRegistered = true;
|
|
127
|
-
socket.on('close', async () => {
|
|
128
|
-
logger.debug(`Socket, which is for MCP session with id ${transport.sessionId}, has been closed`);
|
|
129
|
-
if (config.SESSION_CLOSE_ON_SOCKET_CLOSE) {
|
|
130
|
-
await transport.close();
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
// Register MCP session close hook to gracefully close it
|
|
135
|
-
_registerMCPSessionClose(transport, session.server);
|
|
136
|
-
logger.debug(`Created MCP server session with id ${transport.sessionId}`);
|
|
137
|
-
return session;
|
|
143
|
+
holder.server = await (0, server_1.createServer)(transport, {
|
|
144
|
+
config: serverConfig,
|
|
145
|
+
});
|
|
146
|
+
return transport;
|
|
138
147
|
}
|
|
139
|
-
async function
|
|
140
|
-
|
|
148
|
+
async function _getTransport(ctx) {
|
|
149
|
+
const sessionId = ctx.req.header('mcp-session-id');
|
|
150
|
+
if (sessionId) {
|
|
151
|
+
const session = sessions.get(sessionId);
|
|
152
|
+
if (session) {
|
|
153
|
+
logger.debug(`Reusing MCP session with id ${sessionId}`);
|
|
154
|
+
return session
|
|
155
|
+
.transport;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
141
159
|
}
|
|
142
|
-
async function
|
|
160
|
+
async function _getOrCreateTransport(ctx) {
|
|
143
161
|
const sessionId = ctx.req.header('mcp-session-id');
|
|
144
162
|
if (sessionId) {
|
|
145
163
|
const session = sessions.get(sessionId);
|
|
146
164
|
if (session) {
|
|
147
165
|
logger.debug(`Reusing MCP session with id ${sessionId}`);
|
|
166
|
+
return session
|
|
167
|
+
.transport;
|
|
148
168
|
}
|
|
149
169
|
else {
|
|
150
170
|
logger.debug(`No MCP session could be found with id ${sessionId}`);
|
|
171
|
+
return undefined;
|
|
151
172
|
}
|
|
152
|
-
return session;
|
|
153
173
|
}
|
|
154
|
-
return await
|
|
174
|
+
return await _createTransport(ctx);
|
|
155
175
|
}
|
|
156
176
|
function _registerMCPSessionClose(transport, mcpServer) {
|
|
157
177
|
let closed = false;
|
|
@@ -173,11 +193,14 @@ function _registerMCPSessionClose(transport, mcpServer) {
|
|
|
173
193
|
const session = sessions.get(transport.sessionId);
|
|
174
194
|
if (session) {
|
|
175
195
|
session.closed = true;
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
196
|
+
if (session.context) {
|
|
197
|
+
try {
|
|
198
|
+
await session.context.close();
|
|
199
|
+
logger.debug('Closed MCP session context');
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
logger.error('Error occurred while closing MCP session context', err);
|
|
203
|
+
}
|
|
181
204
|
}
|
|
182
205
|
}
|
|
183
206
|
sessions.delete(transport.sessionId);
|
|
@@ -206,6 +229,19 @@ function _scheduleIdleSessionCheck() {
|
|
|
206
229
|
};
|
|
207
230
|
setInterval(sessionCheck, config.SESSION_IDLE_CHECK_SECONDS * 1000);
|
|
208
231
|
}
|
|
232
|
+
async function _logRequest(ctx) {
|
|
233
|
+
const reqClone = ctx.req.raw.clone();
|
|
234
|
+
logger.debug(`Got request: ${await reqClone.json()}`);
|
|
235
|
+
}
|
|
236
|
+
function _markSessionAsActive(ctx) {
|
|
237
|
+
const sessionId = ctx.req.header('mcp-session-id');
|
|
238
|
+
if (sessionId) {
|
|
239
|
+
const session = sessions.get(sessionId);
|
|
240
|
+
if (session) {
|
|
241
|
+
session.lastActiveAt = Date.now();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
209
245
|
const app = new hono_1.Hono();
|
|
210
246
|
async function _startStreamableHTTPServer(port) {
|
|
211
247
|
// Global CORS
|
|
@@ -231,12 +267,15 @@ async function _startStreamableHTTPServer(port) {
|
|
|
231
267
|
// MCP Post message
|
|
232
268
|
app.post('/mcp', async (ctx) => {
|
|
233
269
|
try {
|
|
234
|
-
|
|
235
|
-
|
|
270
|
+
if (logger.isDebugEnabled()) {
|
|
271
|
+
await _logRequest(ctx);
|
|
272
|
+
}
|
|
273
|
+
const transport = await _getOrCreateTransport(ctx);
|
|
274
|
+
if (!transport) {
|
|
236
275
|
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
237
276
|
}
|
|
238
|
-
|
|
239
|
-
return await
|
|
277
|
+
_markSessionAsActive(ctx);
|
|
278
|
+
return await transport.handleRequest(ctx);
|
|
240
279
|
}
|
|
241
280
|
catch (err) {
|
|
242
281
|
logger.error('Error occurred while handling MCP request', err);
|
|
@@ -246,15 +285,11 @@ async function _startStreamableHTTPServer(port) {
|
|
|
246
285
|
// MCP Delete session
|
|
247
286
|
app.delete('/mcp', async (ctx) => {
|
|
248
287
|
try {
|
|
249
|
-
const
|
|
250
|
-
if (!
|
|
288
|
+
const transport = await _getTransport(ctx);
|
|
289
|
+
if (!transport) {
|
|
251
290
|
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
252
291
|
}
|
|
253
|
-
|
|
254
|
-
if (!mcpSession) {
|
|
255
|
-
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
256
|
-
}
|
|
257
|
-
await mcpSession.transport.close();
|
|
292
|
+
await transport.close();
|
|
258
293
|
return ctx.json({ ok: true }, 200);
|
|
259
294
|
}
|
|
260
295
|
catch (err) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,iDAAmC;AACnC,iDAAmC;AACnC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|