browser-devtools-mcp 0.1.7 → 0.2.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 +93 -21
- package/README.md +93 -16
- package/dist/cli.js +53 -1721
- package/dist/core.js +764 -0
- package/dist/daemon-server.js +1 -338
- package/dist/index.d.ts +2 -0
- package/dist/index.js +210 -80
- package/dist/otel/otel-initializer.bundle.js +0 -1
- package/dist/tools/a11y/index.d.ts +2 -0
- package/dist/tools/content/index.d.ts +2 -0
- package/dist/tools/debug/index.d.ts +2 -0
- package/dist/tools/figma/compare/index.d.ts +56 -0
- package/dist/tools/figma/compare/types.d.ts +15 -0
- package/dist/tools/figma/index.d.ts +2 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/interaction/index.d.ts +2 -0
- package/dist/tools/navigation/index.d.ts +2 -0
- package/dist/tools/o11y/index.d.ts +2 -0
- package/dist/tools/react/index.d.ts +2 -0
- package/dist/tools/run/index.d.ts +2 -0
- package/dist/tools/stub/index.d.ts +2 -0
- package/dist/tools/sync/index.d.ts +2 -0
- package/dist/tools/types.d.ts +21 -0
- package/dist/types.d.ts +78 -0
- package/package.json +11 -11
- package/dist/browser.js +0 -213
- package/dist/browser.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.js +0 -96
- package/dist/config.js.map +0 -1
- package/dist/context.js +0 -298
- package/dist/context.js.map +0 -1
- package/dist/daemon-server.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.js +0 -97
- package/dist/logger.js.map +0 -1
- package/dist/mcp-server.js +0 -401
- package/dist/mcp-server.js.map +0 -1
- package/dist/otel/otel-controller.js +0 -323
- package/dist/otel/otel-controller.js.map +0 -1
- package/dist/otel/otel-initializer.bundle.js.map +0 -7
- package/dist/otel/otel-proxy.js +0 -407
- package/dist/otel/otel-proxy.js.map +0 -1
- package/dist/server-info.js +0 -186
- package/dist/server-info.js.map +0 -1
- package/dist/tools/a11y/index.js +0 -7
- package/dist/tools/a11y/index.js.map +0 -1
- package/dist/tools/a11y/take-aria-snapshot.js +0 -54
- package/dist/tools/a11y/take-aria-snapshot.js.map +0 -1
- package/dist/tools/a11y/take-ax-tree-snapshot.js +0 -850
- package/dist/tools/a11y/take-ax-tree-snapshot.js.map +0 -1
- package/dist/tools/content/get-as-html.js +0 -164
- package/dist/tools/content/get-as-html.js.map +0 -1
- package/dist/tools/content/get-as-text.js +0 -76
- package/dist/tools/content/get-as-text.js.map +0 -1
- package/dist/tools/content/index.js +0 -14
- package/dist/tools/content/index.js.map +0 -1
- package/dist/tools/content/save-as-pdf.js +0 -119
- package/dist/tools/content/save-as-pdf.js.map +0 -1
- package/dist/tools/content/take-screenshot.js +0 -297
- package/dist/tools/content/take-screenshot.js.map +0 -1
- package/dist/tools/figma/compare/compare-image-embedding.js +0 -159
- package/dist/tools/figma/compare/compare-image-embedding.js.map +0 -1
- package/dist/tools/figma/compare/compare-mssim.js +0 -98
- package/dist/tools/figma/compare/compare-mssim.js.map +0 -1
- package/dist/tools/figma/compare/compare-text-embedding.js +0 -291
- package/dist/tools/figma/compare/compare-text-embedding.js.map +0 -1
- package/dist/tools/figma/compare/index.js +0 -139
- package/dist/tools/figma/compare/index.js.map +0 -1
- package/dist/tools/figma/compare/types.js +0 -3
- package/dist/tools/figma/compare/types.js.map +0 -1
- package/dist/tools/figma/compare/vector.js +0 -46
- package/dist/tools/figma/compare/vector.js.map +0 -1
- package/dist/tools/figma/compare-page-with-design.js +0 -240
- package/dist/tools/figma/compare-page-with-design.js.map +0 -1
- package/dist/tools/figma/figma-service.js +0 -134
- package/dist/tools/figma/figma-service.js.map +0 -1
- package/dist/tools/figma/index.js +0 -6
- package/dist/tools/figma/index.js.map +0 -1
- package/dist/tools/index.js +0 -41
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interaction/click.js +0 -29
- package/dist/tools/interaction/click.js.map +0 -1
- package/dist/tools/interaction/drag.js +0 -41
- package/dist/tools/interaction/drag.js.map +0 -1
- package/dist/tools/interaction/fill.js +0 -28
- package/dist/tools/interaction/fill.js.map +0 -1
- package/dist/tools/interaction/hover.js +0 -29
- package/dist/tools/interaction/hover.js.map +0 -1
- package/dist/tools/interaction/index.js +0 -24
- package/dist/tools/interaction/index.js.map +0 -1
- package/dist/tools/interaction/press-key.js +0 -99
- package/dist/tools/interaction/press-key.js.map +0 -1
- package/dist/tools/interaction/resize-viewport.js +0 -110
- package/dist/tools/interaction/resize-viewport.js.map +0 -1
- package/dist/tools/interaction/resize-window.js +0 -261
- package/dist/tools/interaction/resize-window.js.map +0 -1
- package/dist/tools/interaction/scroll.js +0 -304
- package/dist/tools/interaction/scroll.js.map +0 -1
- package/dist/tools/interaction/select.js +0 -30
- package/dist/tools/interaction/select.js.map +0 -1
- package/dist/tools/navigation/go-back.js +0 -76
- package/dist/tools/navigation/go-back.js.map +0 -1
- package/dist/tools/navigation/go-forward.js +0 -76
- package/dist/tools/navigation/go-forward.js.map +0 -1
- package/dist/tools/navigation/go-to.js +0 -80
- package/dist/tools/navigation/go-to.js.map +0 -1
- package/dist/tools/navigation/index.js +0 -14
- package/dist/tools/navigation/index.js.map +0 -1
- package/dist/tools/navigation/reload.js +0 -76
- package/dist/tools/navigation/reload.js.map +0 -1
- package/dist/tools/o11y/get-console-messages.js +0 -151
- package/dist/tools/o11y/get-console-messages.js.map +0 -1
- package/dist/tools/o11y/get-http-requests.js +0 -216
- package/dist/tools/o11y/get-http-requests.js.map +0 -1
- package/dist/tools/o11y/get-trace-id.js +0 -30
- package/dist/tools/o11y/get-trace-id.js.map +0 -1
- package/dist/tools/o11y/get-web-vitals.js +0 -595
- package/dist/tools/o11y/get-web-vitals.js.map +0 -1
- package/dist/tools/o11y/index.js +0 -18
- package/dist/tools/o11y/index.js.map +0 -1
- package/dist/tools/o11y/new-trace-id.js +0 -32
- package/dist/tools/o11y/new-trace-id.js.map +0 -1
- package/dist/tools/o11y/set-trace-id.js +0 -28
- package/dist/tools/o11y/set-trace-id.js.map +0 -1
- package/dist/tools/react/get-component-for-element.js +0 -941
- package/dist/tools/react/get-component-for-element.js.map +0 -1
- package/dist/tools/react/get-element-for-component.js +0 -1190
- package/dist/tools/react/get-element-for-component.js.map +0 -1
- package/dist/tools/react/index.js +0 -10
- package/dist/tools/react/index.js.map +0 -1
- package/dist/tools/run/index.js +0 -7
- package/dist/tools/run/index.js.map +0 -1
- package/dist/tools/run/js-in-browser.js +0 -51
- package/dist/tools/run/js-in-browser.js.map +0 -1
- package/dist/tools/run/js-in-sandbox.js +0 -175
- package/dist/tools/run/js-in-sandbox.js.map +0 -1
- package/dist/tools/stub/clear.js +0 -41
- package/dist/tools/stub/clear.js.map +0 -1
- package/dist/tools/stub/index.js +0 -14
- package/dist/tools/stub/index.js.map +0 -1
- package/dist/tools/stub/intercept-http-request.js +0 -112
- package/dist/tools/stub/intercept-http-request.js.map +0 -1
- package/dist/tools/stub/list.js +0 -75
- package/dist/tools/stub/list.js.map +0 -1
- package/dist/tools/stub/mock-http-response.js +0 -152
- package/dist/tools/stub/mock-http-response.js.map +0 -1
- package/dist/tools/stub/stub-controller.js +0 -284
- package/dist/tools/stub/stub-controller.js.map +0 -1
- package/dist/tools/sync/index.js +0 -6
- package/dist/tools/sync/index.js.map +0 -1
- package/dist/tools/sync/wait-for-network-idle.js +0 -152
- package/dist/tools/sync/wait-for-network-idle.js.map +0 -1
- package/dist/tools/tool-executor.js +0 -79
- package/dist/tools/tool-executor.js.map +0 -1
- package/dist/tools/types.js +0 -3
- package/dist/tools/types.js.map +0 -1
- package/dist/types.js +0 -55
- package/dist/types.js.map +0 -1
- package/dist/utils/cli-utils.js +0 -253
- package/dist/utils/cli-utils.js.map +0 -1
- package/dist/utils.js +0 -85
- package/dist/utils.js.map +0 -1
package/dist/mcp-server.js
DELETED
|
@@ -1,401 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.startStdioServer = startStdioServer;
|
|
40
|
-
exports.startStreamableHTTPServer = startStreamableHTTPServer;
|
|
41
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
42
|
-
const config = __importStar(require("./config"));
|
|
43
|
-
const logger = __importStar(require("./logger"));
|
|
44
|
-
const server_info_1 = require("./server-info");
|
|
45
|
-
const tools_1 = require("./tools");
|
|
46
|
-
const mcp_1 = require("@hono/mcp");
|
|
47
|
-
const node_server_1 = require("@hono/node-server");
|
|
48
|
-
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
49
|
-
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
50
|
-
const hono_1 = require("hono");
|
|
51
|
-
const cors_1 = require("hono/cors");
|
|
52
|
-
const MCP_TEMPLATE = {
|
|
53
|
-
jsonrpc: '2.0',
|
|
54
|
-
error: {
|
|
55
|
-
code: 0,
|
|
56
|
-
message: 'N/A',
|
|
57
|
-
},
|
|
58
|
-
id: null,
|
|
59
|
-
};
|
|
60
|
-
const MCP_ERRORS = {
|
|
61
|
-
get sessionNotFound() {
|
|
62
|
-
return _buildMCPErrorResponse(-32001, 'Session Not Found');
|
|
63
|
-
},
|
|
64
|
-
get unauthorized() {
|
|
65
|
-
return _buildMCPErrorResponse(-32001, 'Unauthorized');
|
|
66
|
-
},
|
|
67
|
-
get internalServerError() {
|
|
68
|
-
return _buildMCPErrorResponse(-32603, 'Internal Server Error');
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
const sessions = new Map();
|
|
72
|
-
function _buildMCPErrorResponse(code, message) {
|
|
73
|
-
const result = { ...MCP_TEMPLATE };
|
|
74
|
-
result.error.code = code;
|
|
75
|
-
result.error.message = message;
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
function _getImage(response) {
|
|
79
|
-
if ('image' in response &&
|
|
80
|
-
response.image !== null &&
|
|
81
|
-
typeof response.image === 'object' &&
|
|
82
|
-
'data' in response.image &&
|
|
83
|
-
'mimeType' in response.image &&
|
|
84
|
-
Buffer.isBuffer(response.image.data) &&
|
|
85
|
-
typeof response.image.mimeType === 'string') {
|
|
86
|
-
const image = response.image;
|
|
87
|
-
delete response.image;
|
|
88
|
-
return image;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
function _toResponse(response) {
|
|
92
|
-
const image = _getImage(response);
|
|
93
|
-
const contents = [];
|
|
94
|
-
contents.push({
|
|
95
|
-
type: 'text',
|
|
96
|
-
text: JSON.stringify(response, null, 2),
|
|
97
|
-
});
|
|
98
|
-
if (image) {
|
|
99
|
-
if (image.mimeType === 'image/svg+xml') {
|
|
100
|
-
contents.push({
|
|
101
|
-
type: 'text',
|
|
102
|
-
text: image.data.toString(),
|
|
103
|
-
mimeType: image.mimeType,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
contents.push({
|
|
108
|
-
type: 'image',
|
|
109
|
-
data: image.data.toString('base64'),
|
|
110
|
-
mimeType: image.mimeType,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
content: contents,
|
|
116
|
-
structuredContent: response,
|
|
117
|
-
isError: false,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
function _createServer(opts) {
|
|
121
|
-
const server = new mcp_js_1.McpServer({
|
|
122
|
-
name: server_info_1.SERVER_NAME,
|
|
123
|
-
version: server_info_1.SERVER_VERSION,
|
|
124
|
-
}, {
|
|
125
|
-
capabilities: {
|
|
126
|
-
resources: {},
|
|
127
|
-
tools: {},
|
|
128
|
-
},
|
|
129
|
-
instructions: (0, server_info_1.getServerInstructions)(),
|
|
130
|
-
});
|
|
131
|
-
const messages = [];
|
|
132
|
-
messages.push({
|
|
133
|
-
role: 'user',
|
|
134
|
-
content: {
|
|
135
|
-
type: 'text',
|
|
136
|
-
text: server_info_1.UI_DEBUGGING_POLICY,
|
|
137
|
-
},
|
|
138
|
-
});
|
|
139
|
-
server.registerPrompt('default_system', {
|
|
140
|
-
title: 'Default System Prompt',
|
|
141
|
-
description: 'General behavior for the AI assistant',
|
|
142
|
-
}, async () => ({
|
|
143
|
-
description: "Defines the assistant's general reasoning and tool usage rules.",
|
|
144
|
-
messages,
|
|
145
|
-
}));
|
|
146
|
-
const toolExecutor = new tools_1.ToolExecutor(() => opts.sessionIdProvider ? opts.sessionIdProvider() : '');
|
|
147
|
-
const createToolCallback = (tool) => {
|
|
148
|
-
return async (args) => {
|
|
149
|
-
try {
|
|
150
|
-
const response = await toolExecutor.executeTool(tool, args);
|
|
151
|
-
return _toResponse(response);
|
|
152
|
-
}
|
|
153
|
-
catch (error) {
|
|
154
|
-
return {
|
|
155
|
-
content: [
|
|
156
|
-
{ type: 'text', text: `Error: ${error.message}` },
|
|
157
|
-
],
|
|
158
|
-
isError: true,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
};
|
|
163
|
-
tools_1.tools.forEach((t) => {
|
|
164
|
-
logger.debug(`Registering tool ${t.name()} ...`);
|
|
165
|
-
server.registerTool(t.name(), {
|
|
166
|
-
description: t.description(),
|
|
167
|
-
inputSchema: t.inputSchema(),
|
|
168
|
-
outputSchema: t.outputSchema(),
|
|
169
|
-
}, createToolCallback(t));
|
|
170
|
-
});
|
|
171
|
-
return server;
|
|
172
|
-
}
|
|
173
|
-
async function _createAndConnectServer(transport, opts) {
|
|
174
|
-
const server = _createServer({
|
|
175
|
-
config: opts.config,
|
|
176
|
-
sessionIdProvider: () => transport.sessionId,
|
|
177
|
-
});
|
|
178
|
-
await server.connect(transport);
|
|
179
|
-
return server;
|
|
180
|
-
}
|
|
181
|
-
function _getConfig() {
|
|
182
|
-
return {};
|
|
183
|
-
}
|
|
184
|
-
function _createSession(ctx, transport, server) {
|
|
185
|
-
// Create MCP session with MCP server
|
|
186
|
-
const session = {
|
|
187
|
-
transport,
|
|
188
|
-
server,
|
|
189
|
-
closed: false,
|
|
190
|
-
lastActiveAt: Date.now(),
|
|
191
|
-
};
|
|
192
|
-
// Register hook to close the associated MCP session on socket close
|
|
193
|
-
const socket = ctx.env.incoming.socket;
|
|
194
|
-
if (!socket._mcpRegistered) {
|
|
195
|
-
socket._mcpRegistered = true;
|
|
196
|
-
socket.on('close', async () => {
|
|
197
|
-
logger.debug(`Socket, which is for MCP session with id ${transport.sessionId}, has been closed`);
|
|
198
|
-
if (config.SESSION_CLOSE_ON_SOCKET_CLOSE) {
|
|
199
|
-
await transport.close();
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
// Register MCP session close hook to gracefully close it
|
|
204
|
-
_registerMCPSessionClose(transport, session.server);
|
|
205
|
-
logger.debug(`Created MCP server session with id ${transport.sessionId}`);
|
|
206
|
-
return session;
|
|
207
|
-
}
|
|
208
|
-
async function _createTransport(ctx) {
|
|
209
|
-
// Get MCP server config
|
|
210
|
-
const serverConfig = _getConfig();
|
|
211
|
-
const holder = {};
|
|
212
|
-
// Create new instances of MCP Server and Transport for each incoming request
|
|
213
|
-
const transport = new mcp_1.StreamableHTTPTransport({
|
|
214
|
-
// Change to `false` if you want to enable SSE in responses.
|
|
215
|
-
enableJsonResponse: true,
|
|
216
|
-
sessionIdGenerator: () => crypto_1.default.randomUUID(),
|
|
217
|
-
onsessioninitialized: async (sessionId) => {
|
|
218
|
-
const session = _createSession(ctx, transport, holder.server);
|
|
219
|
-
sessions.set(sessionId, session);
|
|
220
|
-
logger.debug(`MCP session initialized with id ${sessionId}`);
|
|
221
|
-
},
|
|
222
|
-
onsessionclosed: async (sessionId) => {
|
|
223
|
-
logger.debug(`Closing MCP session closed with id ${sessionId} ...`);
|
|
224
|
-
await transport.close();
|
|
225
|
-
logger.debug(`MCP session closed with id ${sessionId}`);
|
|
226
|
-
},
|
|
227
|
-
});
|
|
228
|
-
holder.server = await _createAndConnectServer(transport, {
|
|
229
|
-
config: serverConfig,
|
|
230
|
-
});
|
|
231
|
-
return transport;
|
|
232
|
-
}
|
|
233
|
-
async function _getTransport(ctx) {
|
|
234
|
-
const sessionId = ctx.req.header('mcp-session-id');
|
|
235
|
-
if (sessionId) {
|
|
236
|
-
const session = sessions.get(sessionId);
|
|
237
|
-
if (session) {
|
|
238
|
-
logger.debug(`Reusing MCP session with id ${sessionId}`);
|
|
239
|
-
return session
|
|
240
|
-
.transport;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return undefined;
|
|
244
|
-
}
|
|
245
|
-
async function _getOrCreateTransport(ctx) {
|
|
246
|
-
const sessionId = ctx.req.header('mcp-session-id');
|
|
247
|
-
if (sessionId) {
|
|
248
|
-
const session = sessions.get(sessionId);
|
|
249
|
-
if (session) {
|
|
250
|
-
logger.debug(`Reusing MCP session with id ${sessionId}`);
|
|
251
|
-
return session
|
|
252
|
-
.transport;
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
logger.debug(`No MCP session could be found with id ${sessionId}`);
|
|
256
|
-
return undefined;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return await _createTransport(ctx);
|
|
260
|
-
}
|
|
261
|
-
function _registerMCPSessionClose(transport, mcpServer) {
|
|
262
|
-
let closed = false;
|
|
263
|
-
transport.onclose = async () => {
|
|
264
|
-
logger.debug(`Closing MCP session with id ${transport.sessionId} ...`);
|
|
265
|
-
if (closed) {
|
|
266
|
-
logger.debug(`MCP session with id ${transport.sessionId} has already been closed`);
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
closed = true;
|
|
270
|
-
try {
|
|
271
|
-
await mcpServer.close();
|
|
272
|
-
logger.debug('Closed MCP server');
|
|
273
|
-
}
|
|
274
|
-
catch (err) {
|
|
275
|
-
logger.error('Error occurred while closing MCP server', err);
|
|
276
|
-
}
|
|
277
|
-
if (transport.sessionId) {
|
|
278
|
-
const session = sessions.get(transport.sessionId);
|
|
279
|
-
if (session) {
|
|
280
|
-
session.closed = true;
|
|
281
|
-
if (session.context) {
|
|
282
|
-
try {
|
|
283
|
-
await session.context.close();
|
|
284
|
-
logger.debug('Closed MCP session context');
|
|
285
|
-
}
|
|
286
|
-
catch (err) {
|
|
287
|
-
logger.error('Error occurred while closing MCP session context', err);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
sessions.delete(transport.sessionId);
|
|
292
|
-
}
|
|
293
|
-
logger.debug(`Closing MCP session with id ${transport.sessionId} ...`);
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
function _scheduleIdleSessionCheck() {
|
|
297
|
-
const sessionCheck = () => {
|
|
298
|
-
const currentTime = Date.now();
|
|
299
|
-
for (const [sessionId, session] of sessions) {
|
|
300
|
-
logger.debug(`Checking whether session with id ${sessionId} is idle or not ...`);
|
|
301
|
-
if (currentTime - session.lastActiveAt >
|
|
302
|
-
config.SESSION_IDLE_SECONDS * 1000) {
|
|
303
|
-
logger.debug(`Session with id ${sessionId} is idle, so it will be closing ...`);
|
|
304
|
-
session.transport
|
|
305
|
-
.close()
|
|
306
|
-
.then(() => {
|
|
307
|
-
logger.debug(`Session with id ${sessionId} was idle, so it has been closed`);
|
|
308
|
-
})
|
|
309
|
-
.catch((err) => {
|
|
310
|
-
logger.error(`Unable to delete idle session with id ${sessionId}`, err);
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
};
|
|
315
|
-
setInterval(sessionCheck, config.SESSION_IDLE_CHECK_SECONDS * 1000);
|
|
316
|
-
}
|
|
317
|
-
async function _logRequest(ctx) {
|
|
318
|
-
const reqClone = ctx.req.raw.clone();
|
|
319
|
-
logger.debug(`Got request: ${await reqClone.json()}`);
|
|
320
|
-
}
|
|
321
|
-
function _markSessionAsActive(ctx) {
|
|
322
|
-
const sessionId = ctx.req.header('mcp-session-id');
|
|
323
|
-
if (sessionId) {
|
|
324
|
-
const session = sessions.get(sessionId);
|
|
325
|
-
if (session) {
|
|
326
|
-
session.lastActiveAt = Date.now();
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
async function startStdioServer() {
|
|
331
|
-
const transport = new stdio_js_1.StdioServerTransport();
|
|
332
|
-
await _createAndConnectServer(transport, {
|
|
333
|
-
config: _getConfig(),
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
const app = new hono_1.Hono();
|
|
337
|
-
async function startStreamableHTTPServer(port) {
|
|
338
|
-
// Global CORS
|
|
339
|
-
app.use('*', (0, cors_1.cors)({
|
|
340
|
-
origin: '*',
|
|
341
|
-
allowMethods: ['GET', 'POST', 'OPTIONS'],
|
|
342
|
-
allowHeaders: [
|
|
343
|
-
'Content-Type',
|
|
344
|
-
'Authorization',
|
|
345
|
-
'MCP-Protocol-Version',
|
|
346
|
-
],
|
|
347
|
-
}));
|
|
348
|
-
// MCP Health
|
|
349
|
-
app.get('/health', (ctx) => ctx.json({ status: 'ok' }));
|
|
350
|
-
// MCP Ping
|
|
351
|
-
app.get('/ping', (ctx) => ctx.json({ status: 'ok', message: 'pong' }));
|
|
352
|
-
// MCP Get info
|
|
353
|
-
app.get('/mcp', (ctx) => ctx.json({
|
|
354
|
-
status: 'ok',
|
|
355
|
-
protocol: 'model-context-protocol',
|
|
356
|
-
version: '1.0',
|
|
357
|
-
}));
|
|
358
|
-
// MCP Post message
|
|
359
|
-
app.post('/mcp', async (ctx) => {
|
|
360
|
-
try {
|
|
361
|
-
if (logger.isDebugEnabled()) {
|
|
362
|
-
await _logRequest(ctx);
|
|
363
|
-
}
|
|
364
|
-
const transport = await _getOrCreateTransport(ctx);
|
|
365
|
-
if (!transport) {
|
|
366
|
-
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
367
|
-
}
|
|
368
|
-
_markSessionAsActive(ctx);
|
|
369
|
-
return await transport.handleRequest(ctx);
|
|
370
|
-
}
|
|
371
|
-
catch (err) {
|
|
372
|
-
logger.error('Error occurred while handling MCP request', err);
|
|
373
|
-
return ctx.json(MCP_ERRORS.internalServerError, 500);
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
// MCP Delete session
|
|
377
|
-
app.delete('/mcp', async (ctx) => {
|
|
378
|
-
try {
|
|
379
|
-
const transport = await _getTransport(ctx);
|
|
380
|
-
if (!transport) {
|
|
381
|
-
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
382
|
-
}
|
|
383
|
-
await transport.close();
|
|
384
|
-
return ctx.json({ ok: true }, 200);
|
|
385
|
-
}
|
|
386
|
-
catch (err) {
|
|
387
|
-
logger.error('Error occurred while deleting MCP session', err);
|
|
388
|
-
return ctx.json(MCP_ERRORS.internalServerError, 500);
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
// 404
|
|
392
|
-
app.notFound((ctx) => ctx.json({ error: 'Not Found', status: 404 }, 404));
|
|
393
|
-
// Listener for Node
|
|
394
|
-
(0, node_server_1.serve)({
|
|
395
|
-
fetch: app.fetch,
|
|
396
|
-
port,
|
|
397
|
-
}, () => logger.info(`Listening on port ${port}`));
|
|
398
|
-
// Schedule background task to check (and remove) idle sessions
|
|
399
|
-
_scheduleIdleSessionCheck();
|
|
400
|
-
}
|
|
401
|
-
//# sourceMappingURL=mcp-server.js.map
|
package/dist/mcp-server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|