@cjwddz/browser-server 0.1.0-alpha → 0.1.1-alpha
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.
|
@@ -5,7 +5,10 @@ export declare class McpServer {
|
|
|
5
5
|
private sessionManager;
|
|
6
6
|
private server;
|
|
7
7
|
private connectionPool;
|
|
8
|
+
/** mcpSessionId -> transport */
|
|
8
9
|
private transports;
|
|
10
|
+
/** mcpSessionId -> McpSdkServer */
|
|
11
|
+
private mcpServers;
|
|
9
12
|
constructor(config: ServerConfig, sessionManager: SessionManager);
|
|
10
13
|
start(): Promise<void>;
|
|
11
14
|
stop(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAiB;IACvC,gCAAgC;IAChC,OAAO,CAAC,UAAU,CAAyD;IAC3E,mCAAmC;IACnC,OAAO,CAAC,UAAU,CAAwC;gBAE9C,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc;IAM1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBb,aAAa;YA0Cb,yBAAyB;CAwCxC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as http from 'node:http';
|
|
2
|
+
import * as crypto from 'node:crypto';
|
|
2
3
|
import { McpServer as McpSdkServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
4
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
5
|
import { log } from '../utils/logger.js';
|
|
@@ -9,7 +10,10 @@ export class McpServer {
|
|
|
9
10
|
sessionManager;
|
|
10
11
|
server = null;
|
|
11
12
|
connectionPool;
|
|
13
|
+
/** mcpSessionId -> transport */
|
|
12
14
|
transports = new Map();
|
|
15
|
+
/** mcpSessionId -> McpSdkServer */
|
|
16
|
+
mcpServers = new Map();
|
|
13
17
|
constructor(config, sessionManager) {
|
|
14
18
|
this.config = config;
|
|
15
19
|
this.sessionManager = sessionManager;
|
|
@@ -37,6 +41,10 @@ export class McpServer {
|
|
|
37
41
|
await transport.close();
|
|
38
42
|
}
|
|
39
43
|
this.transports.clear();
|
|
44
|
+
for (const [, server] of this.mcpServers) {
|
|
45
|
+
await server.close();
|
|
46
|
+
}
|
|
47
|
+
this.mcpServers.clear();
|
|
40
48
|
await this.connectionPool.disconnectAll();
|
|
41
49
|
if (this.server) {
|
|
42
50
|
return new Promise((resolve) => {
|
|
@@ -55,42 +63,65 @@ export class McpServer {
|
|
|
55
63
|
res.end(JSON.stringify({ error: 'Not Found. Use /mcp/:sessionId' }));
|
|
56
64
|
return;
|
|
57
65
|
}
|
|
58
|
-
const
|
|
59
|
-
const session = this.sessionManager.getSession(
|
|
66
|
+
const browserSessionId = match[1];
|
|
67
|
+
const session = this.sessionManager.getSession(browserSessionId);
|
|
60
68
|
if (!session) {
|
|
61
69
|
res.writeHead(404);
|
|
62
|
-
res.end(JSON.stringify({ error: `Session ${
|
|
70
|
+
res.end(JSON.stringify({ error: `Session ${browserSessionId} not found` }));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const mcpSessionId = req.headers['mcp-session-id'];
|
|
74
|
+
if (mcpSessionId && this.transports.has(mcpSessionId)) {
|
|
75
|
+
const transport = this.transports.get(mcpSessionId);
|
|
76
|
+
req.url = '/';
|
|
77
|
+
await transport.handleRequest(req, res);
|
|
63
78
|
return;
|
|
64
79
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
80
|
+
if (!mcpSessionId) {
|
|
81
|
+
const { transport } = await this.createTransportForSession(browserSessionId, session.cdpPort);
|
|
82
|
+
req.url = '/';
|
|
83
|
+
await transport.handleRequest(req, res);
|
|
84
|
+
if (transport.sessionId && !this.transports.has(transport.sessionId)) {
|
|
85
|
+
this.transports.set(transport.sessionId, transport);
|
|
86
|
+
log.info(`[${browserSessionId}] MCP session 注册: ${transport.sessionId}`);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
69
89
|
}
|
|
70
|
-
|
|
90
|
+
res.writeHead(400);
|
|
91
|
+
res.end(JSON.stringify({ error: 'Invalid MCP session' }));
|
|
71
92
|
}
|
|
72
|
-
async createTransportForSession(
|
|
93
|
+
async createTransportForSession(browserSessionId, cdpPort) {
|
|
73
94
|
const transport = new StreamableHTTPServerTransport({
|
|
74
|
-
sessionIdGenerator:
|
|
95
|
+
sessionIdGenerator: () => crypto.randomUUID(),
|
|
75
96
|
});
|
|
76
|
-
const mcpServer = new McpSdkServer({ name: `browser-server/${
|
|
97
|
+
const mcpServer = new McpSdkServer({ name: `browser-server/${browserSessionId}`, version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
77
98
|
const tools = defineTools();
|
|
78
99
|
for (const [name, tool] of Object.entries(tools)) {
|
|
79
100
|
mcpServer.tool(name, tool.description, tool.schema, async (args) => {
|
|
80
101
|
try {
|
|
81
|
-
const conn = await this.connectionPool.getConnection(
|
|
102
|
+
const conn = await this.connectionPool.getConnection(browserSessionId, cdpPort);
|
|
82
103
|
return await tool.handler(conn, args);
|
|
83
104
|
}
|
|
84
105
|
catch (err) {
|
|
85
106
|
const msg = err instanceof Error ? err.message : String(err);
|
|
86
|
-
log.error(`[${
|
|
107
|
+
log.error(`[${browserSessionId}] 工具 ${name} 执行失败:`, msg);
|
|
87
108
|
return { content: [{ type: 'text', text: `错误: ${msg}` }], isError: true };
|
|
88
109
|
}
|
|
89
110
|
});
|
|
90
111
|
}
|
|
112
|
+
transport.onerror = (err) => {
|
|
113
|
+
log.error(`[${browserSessionId}] MCP transport 错误:`, err.message);
|
|
114
|
+
};
|
|
115
|
+
transport.onclose = () => {
|
|
116
|
+
const sid = transport.sessionId;
|
|
117
|
+
if (sid) {
|
|
118
|
+
this.transports.delete(sid);
|
|
119
|
+
this.mcpServers.delete(sid);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
91
122
|
await mcpServer.connect(transport);
|
|
92
|
-
log.info(`[${
|
|
93
|
-
return transport;
|
|
123
|
+
log.info(`[${browserSessionId}] MCP transport 已创建`);
|
|
124
|
+
return { transport, mcpServer };
|
|
94
125
|
}
|
|
95
126
|
}
|
|
96
127
|
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,MAAM,OAAO,SAAS;IACZ,MAAM,CAAe;IACrB,cAAc,CAAiB;IAC/B,MAAM,GAAuB,IAAI,CAAC;IAClC,cAAc,CAAiB;
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED