claude-chrome-parallel 2.1.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 +21 -0
- package/README.md +353 -0
- package/dist/cdp/client.d.ts +120 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +345 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/chrome/launcher.d.ts +42 -0
- package/dist/chrome/launcher.d.ts.map +1 -0
- package/dist/chrome/launcher.js +256 -0
- package/dist/chrome/launcher.js.map +1 -0
- package/dist/cli/claude-session.d.ts +11 -0
- package/dist/cli/claude-session.js +349 -0
- package/dist/cli/claude-session.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.js +562 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +16 -0
- package/dist/cli/install.js +185 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/uninstall.d.ts +7 -0
- package/dist/cli/uninstall.js +126 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/config/config-recovery.d.ts +69 -0
- package/dist/config/config-recovery.d.ts.map +1 -0
- package/dist/config/config-recovery.js +302 -0
- package/dist/config/config-recovery.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +22 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/session-isolator.d.ts +76 -0
- package/dist/config/session-isolator.d.ts.map +1 -0
- package/dist/config/session-isolator.js +268 -0
- package/dist/config/session-isolator.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +118 -0
- package/dist/index.js.map +1 -0
- package/dist/master/index.d.ts +18 -0
- package/dist/master/index.d.ts.map +1 -0
- package/dist/master/index.js +75 -0
- package/dist/master/index.js.map +1 -0
- package/dist/master/ipc-server.d.ts +21 -0
- package/dist/master/ipc-server.d.ts.map +1 -0
- package/dist/master/ipc-server.js +175 -0
- package/dist/master/ipc-server.js.map +1 -0
- package/dist/master/request-handler.d.ts +17 -0
- package/dist/master/request-handler.d.ts.map +1 -0
- package/dist/master/request-handler.js +134 -0
- package/dist/master/request-handler.js.map +1 -0
- package/dist/master/session-registry.d.ts +120 -0
- package/dist/master/session-registry.d.ts.map +1 -0
- package/dist/master/session-registry.js +247 -0
- package/dist/master/session-registry.js.map +1 -0
- package/dist/mcp-server.d.ts +69 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +301 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/session-manager.d.ts +107 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +322 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/shared/ipc-constants.d.ts +16 -0
- package/dist/shared/ipc-constants.d.ts.map +1 -0
- package/dist/shared/ipc-constants.js +66 -0
- package/dist/shared/ipc-constants.js.map +1 -0
- package/dist/shared/ipc-protocol.d.ts +33 -0
- package/dist/shared/ipc-protocol.d.ts.map +1 -0
- package/dist/shared/ipc-protocol.js +20 -0
- package/dist/shared/ipc-protocol.js.map +1 -0
- package/dist/tools/computer.d.ts +6 -0
- package/dist/tools/computer.d.ts.map +1 -0
- package/dist/tools/computer.js +426 -0
- package/dist/tools/computer.js.map +1 -0
- package/dist/tools/find.d.ts +6 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +242 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/form-input.d.ts +6 -0
- package/dist/tools/form-input.d.ts.map +1 -0
- package/dist/tools/form-input.js +181 -0
- package/dist/tools/form-input.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +26 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/javascript.d.ts +6 -0
- package/dist/tools/javascript.d.ts.map +1 -0
- package/dist/tools/javascript.js +134 -0
- package/dist/tools/javascript.js.map +1 -0
- package/dist/tools/navigate.d.ts +6 -0
- package/dist/tools/navigate.d.ts.map +1 -0
- package/dist/tools/navigate.js +155 -0
- package/dist/tools/navigate.js.map +1 -0
- package/dist/tools/read-page.d.ts +6 -0
- package/dist/tools/read-page.d.ts.map +1 -0
- package/dist/tools/read-page.js +182 -0
- package/dist/tools/read-page.js.map +1 -0
- package/dist/tools/tabs-context.d.ts +6 -0
- package/dist/tools/tabs-context.d.ts.map +1 -0
- package/dist/tools/tabs-context.js +73 -0
- package/dist/tools/tabs-context.js.map +1 -0
- package/dist/tools/tabs-create.d.ts +6 -0
- package/dist/tools/tabs-create.d.ts.map +1 -0
- package/dist/tools/tabs-create.js +49 -0
- package/dist/tools/tabs-create.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +54 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +14 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/session.d.ts +28 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +6 -0
- package/dist/types/session.js.map +1 -0
- package/dist/utils/atomic-file.d.ts +50 -0
- package/dist/utils/atomic-file.d.ts.map +1 -0
- package/dist/utils/atomic-file.js +217 -0
- package/dist/utils/atomic-file.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-validator.d.ts +40 -0
- package/dist/utils/json-validator.d.ts.map +1 -0
- package/dist/utils/json-validator.js +295 -0
- package/dist/utils/json-validator.js.map +1 -0
- package/dist/utils/ref-id-manager.d.ts +26 -0
- package/dist/utils/ref-id-manager.d.ts.map +1 -0
- package/dist/utils/ref-id-manager.js +81 -0
- package/dist/utils/ref-id-manager.js.map +1 -0
- package/dist/utils/request-queue.d.ts +37 -0
- package/dist/utils/request-queue.d.ts.map +1 -0
- package/dist/utils/request-queue.js +110 -0
- package/dist/utils/request-queue.js.map +1 -0
- package/dist/worker/auto-master.d.ts +24 -0
- package/dist/worker/auto-master.d.ts.map +1 -0
- package/dist/worker/auto-master.js +135 -0
- package/dist/worker/auto-master.js.map +1 -0
- package/dist/worker/index.d.ts +25 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +93 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/ipc-client.d.ts +26 -0
- package/dist/worker/ipc-client.d.ts.map +1 -0
- package/dist/worker/ipc-client.js +211 -0
- package/dist/worker/ipc-client.js.map +1 -0
- package/dist/worker/remote-session-manager.d.ts +114 -0
- package/dist/worker/remote-session-manager.d.ts.map +1 -0
- package/dist/worker/remote-session-manager.js +151 -0
- package/dist/worker/remote-session-manager.js.map +1 -0
- package/dist/worker/tools.d.ts +7 -0
- package/dist/worker/tools.d.ts.map +1 -0
- package/dist/worker/tools.js +340 -0
- package/dist/worker/tools.js.map +1 -0
- package/dist/worker/worker-mcp-server.d.ts +70 -0
- package/dist/worker/worker-mcp-server.d.ts.map +1 -0
- package/dist/worker/worker-mcp-server.js +295 -0
- package/dist/worker/worker-mcp-server.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Registry - Central session management for Master process
|
|
4
|
+
* Wraps the existing SessionManager to add worker tracking
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SessionRegistry = void 0;
|
|
8
|
+
const session_manager_1 = require("../session-manager");
|
|
9
|
+
const client_1 = require("../cdp/client");
|
|
10
|
+
const ref_id_manager_1 = require("../utils/ref-id-manager");
|
|
11
|
+
class SessionRegistry {
|
|
12
|
+
sessionManager;
|
|
13
|
+
workerSessions = new Map(); // workerId -> sessionIds
|
|
14
|
+
sessionWorker = new Map(); // sessionId -> workerId
|
|
15
|
+
constructor(cdpClient) {
|
|
16
|
+
this.sessionManager = new session_manager_1.SessionManager(cdpClient || (0, client_1.getCDPClient)());
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Ensure connected to Chrome
|
|
20
|
+
*/
|
|
21
|
+
async ensureConnected() {
|
|
22
|
+
await this.sessionManager.ensureConnected();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a new session for a worker
|
|
26
|
+
*/
|
|
27
|
+
async createSession(workerId, options) {
|
|
28
|
+
const session = await this.sessionManager.createSession(options);
|
|
29
|
+
// Track worker ownership
|
|
30
|
+
let workerSessionSet = this.workerSessions.get(workerId);
|
|
31
|
+
if (!workerSessionSet) {
|
|
32
|
+
workerSessionSet = new Set();
|
|
33
|
+
this.workerSessions.set(workerId, workerSessionSet);
|
|
34
|
+
}
|
|
35
|
+
workerSessionSet.add(session.id);
|
|
36
|
+
this.sessionWorker.set(session.id, workerId);
|
|
37
|
+
console.error(`[SessionRegistry] Created session ${session.id} for worker ${workerId}`);
|
|
38
|
+
return { id: session.id, name: session.name };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get session info
|
|
42
|
+
*/
|
|
43
|
+
getSession(sessionId) {
|
|
44
|
+
return this.sessionManager.getSessionInfo(sessionId);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* List all sessions
|
|
48
|
+
*/
|
|
49
|
+
listSessions() {
|
|
50
|
+
return this.sessionManager.getAllSessionInfos();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* List sessions for a specific worker
|
|
54
|
+
*/
|
|
55
|
+
listWorkerSessions(workerId) {
|
|
56
|
+
const sessionIds = this.workerSessions.get(workerId);
|
|
57
|
+
if (!sessionIds)
|
|
58
|
+
return [];
|
|
59
|
+
return Array.from(sessionIds)
|
|
60
|
+
.map(id => this.sessionManager.getSessionInfo(id))
|
|
61
|
+
.filter(info => info !== undefined);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delete a session
|
|
65
|
+
*/
|
|
66
|
+
async deleteSession(sessionId) {
|
|
67
|
+
const workerId = this.sessionWorker.get(sessionId);
|
|
68
|
+
if (workerId) {
|
|
69
|
+
const workerSessions = this.workerSessions.get(workerId);
|
|
70
|
+
if (workerSessions) {
|
|
71
|
+
workerSessions.delete(sessionId);
|
|
72
|
+
}
|
|
73
|
+
this.sessionWorker.delete(sessionId);
|
|
74
|
+
}
|
|
75
|
+
await this.sessionManager.deleteSession(sessionId);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a new target (tab) for a session
|
|
79
|
+
*/
|
|
80
|
+
async createTarget(sessionId, url) {
|
|
81
|
+
const result = await this.sessionManager.createTarget(sessionId, url);
|
|
82
|
+
return {
|
|
83
|
+
targetId: result.targetId,
|
|
84
|
+
url: result.page.url(),
|
|
85
|
+
title: await result.page.title(),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* List targets for a session
|
|
90
|
+
*/
|
|
91
|
+
async listTargets(sessionId) {
|
|
92
|
+
const pages = await this.sessionManager.getSessionPages(sessionId);
|
|
93
|
+
const targets = [];
|
|
94
|
+
for (const page of pages) {
|
|
95
|
+
const target = page.target();
|
|
96
|
+
const targetId = target._targetId;
|
|
97
|
+
targets.push({
|
|
98
|
+
targetId,
|
|
99
|
+
url: page.url(),
|
|
100
|
+
title: await page.title(),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return targets;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Close a target
|
|
107
|
+
*/
|
|
108
|
+
async closeTarget(sessionId, targetId) {
|
|
109
|
+
await this.sessionManager.removeTarget(sessionId, targetId);
|
|
110
|
+
await this.sessionManager.getCDPClient().closePage(targetId);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Navigate a page
|
|
114
|
+
*/
|
|
115
|
+
async navigate(sessionId, targetId, url, options) {
|
|
116
|
+
const page = await this.sessionManager.getPage(sessionId, targetId);
|
|
117
|
+
if (!page)
|
|
118
|
+
throw new Error(`Page not found: ${targetId}`);
|
|
119
|
+
await page.goto(url, {
|
|
120
|
+
waitUntil: options?.waitUntil || 'domcontentloaded',
|
|
121
|
+
timeout: options?.timeout || 30000,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Take a screenshot
|
|
126
|
+
*/
|
|
127
|
+
async screenshot(sessionId, targetId, options) {
|
|
128
|
+
const page = await this.sessionManager.getPage(sessionId, targetId);
|
|
129
|
+
if (!page)
|
|
130
|
+
throw new Error(`Page not found: ${targetId}`);
|
|
131
|
+
const buffer = await page.screenshot({
|
|
132
|
+
type: options?.format || 'png',
|
|
133
|
+
quality: options?.format === 'jpeg' ? (options?.quality || 80) : undefined,
|
|
134
|
+
fullPage: options?.fullPage || false,
|
|
135
|
+
encoding: 'base64',
|
|
136
|
+
});
|
|
137
|
+
return buffer;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Evaluate JavaScript
|
|
141
|
+
*/
|
|
142
|
+
async evaluate(sessionId, targetId, script) {
|
|
143
|
+
const page = await this.sessionManager.getPage(sessionId, targetId);
|
|
144
|
+
if (!page)
|
|
145
|
+
throw new Error(`Page not found: ${targetId}`);
|
|
146
|
+
return page.evaluate(script);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Click at coordinates
|
|
150
|
+
*/
|
|
151
|
+
async click(sessionId, targetId, x, y) {
|
|
152
|
+
const page = await this.sessionManager.getPage(sessionId, targetId);
|
|
153
|
+
if (!page)
|
|
154
|
+
throw new Error(`Page not found: ${targetId}`);
|
|
155
|
+
await page.mouse.click(x, y);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Type text
|
|
159
|
+
*/
|
|
160
|
+
async type(sessionId, targetId, text) {
|
|
161
|
+
const page = await this.sessionManager.getPage(sessionId, targetId);
|
|
162
|
+
if (!page)
|
|
163
|
+
throw new Error(`Page not found: ${targetId}`);
|
|
164
|
+
await page.keyboard.type(text);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Scroll
|
|
168
|
+
*/
|
|
169
|
+
async scroll(sessionId, targetId, x, y, direction, amount) {
|
|
170
|
+
const page = await this.sessionManager.getPage(sessionId, targetId);
|
|
171
|
+
if (!page)
|
|
172
|
+
throw new Error(`Page not found: ${targetId}`);
|
|
173
|
+
await page.mouse.move(x, y);
|
|
174
|
+
let deltaX = 0;
|
|
175
|
+
let deltaY = 0;
|
|
176
|
+
const scrollAmount = amount * 100;
|
|
177
|
+
switch (direction) {
|
|
178
|
+
case 'up':
|
|
179
|
+
deltaY = -scrollAmount;
|
|
180
|
+
break;
|
|
181
|
+
case 'down':
|
|
182
|
+
deltaY = scrollAmount;
|
|
183
|
+
break;
|
|
184
|
+
case 'left':
|
|
185
|
+
deltaX = -scrollAmount;
|
|
186
|
+
break;
|
|
187
|
+
case 'right':
|
|
188
|
+
deltaX = scrollAmount;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
await page.mouse.wheel({ deltaX, deltaY });
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Execute CDP command
|
|
195
|
+
*/
|
|
196
|
+
async executeCDP(sessionId, targetId, method, params) {
|
|
197
|
+
return this.sessionManager.executeCDP(sessionId, targetId, method, params);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get accessibility tree
|
|
201
|
+
*/
|
|
202
|
+
async getAccessibilityTree(sessionId, targetId) {
|
|
203
|
+
return this.sessionManager.executeCDP(sessionId, targetId, 'Accessibility.getFullAXTree');
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Clean up all sessions for a disconnected worker
|
|
207
|
+
*/
|
|
208
|
+
async cleanupWorker(workerId) {
|
|
209
|
+
const sessionIds = this.workerSessions.get(workerId);
|
|
210
|
+
if (!sessionIds)
|
|
211
|
+
return;
|
|
212
|
+
console.error(`[SessionRegistry] Cleaning up ${sessionIds.size} sessions for worker ${workerId}`);
|
|
213
|
+
for (const sessionId of sessionIds) {
|
|
214
|
+
try {
|
|
215
|
+
await this.sessionManager.deleteSession(sessionId);
|
|
216
|
+
this.sessionWorker.delete(sessionId);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error(`[SessionRegistry] Error deleting session ${sessionId}:`, error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
this.workerSessions.delete(workerId);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get ref ID manager
|
|
226
|
+
*/
|
|
227
|
+
getRefIdManager() {
|
|
228
|
+
return (0, ref_id_manager_1.getRefIdManager)();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get underlying session manager
|
|
232
|
+
*/
|
|
233
|
+
getSessionManager() {
|
|
234
|
+
return this.sessionManager;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get statistics
|
|
238
|
+
*/
|
|
239
|
+
getStats() {
|
|
240
|
+
return {
|
|
241
|
+
sessions: this.sessionManager.sessionCount,
|
|
242
|
+
workers: this.workerSessions.size,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
exports.SessionRegistry = SessionRegistry;
|
|
247
|
+
//# sourceMappingURL=session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/master/session-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server - Implements MCP protocol over stdio
|
|
3
|
+
*/
|
|
4
|
+
import { MCPRequest, MCPResponse, MCPToolDefinition, ToolHandler } from './types/mcp';
|
|
5
|
+
import { SessionManager } from './session-manager';
|
|
6
|
+
export declare class MCPServer {
|
|
7
|
+
private tools;
|
|
8
|
+
private sessionManager;
|
|
9
|
+
private rl;
|
|
10
|
+
constructor(sessionManager?: SessionManager);
|
|
11
|
+
/**
|
|
12
|
+
* Register a tool
|
|
13
|
+
*/
|
|
14
|
+
registerTool(name: string, handler: ToolHandler, definition: MCPToolDefinition): void;
|
|
15
|
+
/**
|
|
16
|
+
* Start the stdio server
|
|
17
|
+
*/
|
|
18
|
+
start(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Send response to stdout
|
|
21
|
+
*/
|
|
22
|
+
private sendResponse;
|
|
23
|
+
/**
|
|
24
|
+
* Handle incoming MCP request
|
|
25
|
+
*/
|
|
26
|
+
handleRequest(request: MCPRequest): Promise<MCPResponse>;
|
|
27
|
+
/**
|
|
28
|
+
* Handle initialize request
|
|
29
|
+
*/
|
|
30
|
+
private handleInitialize;
|
|
31
|
+
/**
|
|
32
|
+
* Handle tools/list request
|
|
33
|
+
*/
|
|
34
|
+
private handleToolsList;
|
|
35
|
+
/**
|
|
36
|
+
* Handle tools/call request
|
|
37
|
+
*/
|
|
38
|
+
private handleToolsCall;
|
|
39
|
+
/**
|
|
40
|
+
* Handle sessions/list request
|
|
41
|
+
*/
|
|
42
|
+
private handleSessionsList;
|
|
43
|
+
/**
|
|
44
|
+
* Handle sessions/create request
|
|
45
|
+
*/
|
|
46
|
+
private handleSessionsCreate;
|
|
47
|
+
/**
|
|
48
|
+
* Handle sessions/delete request
|
|
49
|
+
*/
|
|
50
|
+
private handleSessionsDelete;
|
|
51
|
+
/**
|
|
52
|
+
* Create an error response
|
|
53
|
+
*/
|
|
54
|
+
private errorResponse;
|
|
55
|
+
/**
|
|
56
|
+
* Get the session manager
|
|
57
|
+
*/
|
|
58
|
+
getSessionManager(): SessionManager;
|
|
59
|
+
/**
|
|
60
|
+
* Get registered tool names
|
|
61
|
+
*/
|
|
62
|
+
getToolNames(): string[];
|
|
63
|
+
/**
|
|
64
|
+
* Stop the server
|
|
65
|
+
*/
|
|
66
|
+
stop(): void;
|
|
67
|
+
}
|
|
68
|
+
export declare function getMCPServer(): MCPServer;
|
|
69
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,UAAU,EACV,WAAW,EAGX,iBAAiB,EACjB,WAAW,EAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAEtE,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,EAAE,CAAmC;gBAEjC,cAAc,CAAC,EAAE,cAAc;IAI3C;;OAEG;IACH,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,iBAAiB,GAC5B,IAAI;IAIP;;OAEG;IACH,KAAK,IAAI,IAAI;IAqCb;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAmD9D;;OAEG;YACW,gBAAgB;IAa9B;;OAEG;YACW,eAAe;IAQ7B;;OAEG;YACW,eAAe;IAmC7B;;OAEG;YACW,kBAAkB;IAYhC;;OAEG;YACW,oBAAoB;IA2BlC;;OAEG;YACW,oBAAoB;IAkBlC;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAInC;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;OAEG;IACH,IAAI,IAAI,IAAI;CAMb;AAKD,wBAAgB,YAAY,IAAI,SAAS,CAKxC"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server - Implements MCP protocol over stdio
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.MCPServer = void 0;
|
|
40
|
+
exports.getMCPServer = getMCPServer;
|
|
41
|
+
const readline = __importStar(require("readline"));
|
|
42
|
+
const mcp_1 = require("./types/mcp");
|
|
43
|
+
const session_manager_1 = require("./session-manager");
|
|
44
|
+
class MCPServer {
|
|
45
|
+
tools = new Map();
|
|
46
|
+
sessionManager;
|
|
47
|
+
rl = null;
|
|
48
|
+
constructor(sessionManager) {
|
|
49
|
+
this.sessionManager = sessionManager || (0, session_manager_1.getSessionManager)();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Register a tool
|
|
53
|
+
*/
|
|
54
|
+
registerTool(name, handler, definition) {
|
|
55
|
+
this.tools.set(name, { name, handler, definition });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Start the stdio server
|
|
59
|
+
*/
|
|
60
|
+
start() {
|
|
61
|
+
console.error('[MCPServer] Starting stdio server...');
|
|
62
|
+
this.rl = readline.createInterface({
|
|
63
|
+
input: process.stdin,
|
|
64
|
+
output: process.stdout,
|
|
65
|
+
terminal: false,
|
|
66
|
+
});
|
|
67
|
+
this.rl.on('line', async (line) => {
|
|
68
|
+
if (!line.trim())
|
|
69
|
+
return;
|
|
70
|
+
try {
|
|
71
|
+
const request = JSON.parse(line);
|
|
72
|
+
const response = await this.handleRequest(request);
|
|
73
|
+
this.sendResponse(response);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const errorResponse = {
|
|
77
|
+
jsonrpc: '2.0',
|
|
78
|
+
id: 0,
|
|
79
|
+
error: {
|
|
80
|
+
code: mcp_1.MCPErrorCodes.PARSE_ERROR,
|
|
81
|
+
message: error instanceof Error ? error.message : 'Parse error',
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
this.sendResponse(errorResponse);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
this.rl.on('close', () => {
|
|
88
|
+
console.error('[MCPServer] stdin closed, shutting down...');
|
|
89
|
+
process.exit(0);
|
|
90
|
+
});
|
|
91
|
+
console.error('[MCPServer] Ready, waiting for requests...');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Send response to stdout
|
|
95
|
+
*/
|
|
96
|
+
sendResponse(response) {
|
|
97
|
+
console.log(JSON.stringify(response));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Handle incoming MCP request
|
|
101
|
+
*/
|
|
102
|
+
async handleRequest(request) {
|
|
103
|
+
const { id, method, params } = request;
|
|
104
|
+
try {
|
|
105
|
+
let result;
|
|
106
|
+
switch (method) {
|
|
107
|
+
case 'initialize':
|
|
108
|
+
result = await this.handleInitialize(params);
|
|
109
|
+
break;
|
|
110
|
+
case 'initialized':
|
|
111
|
+
// Client acknowledgment, no response needed but we send confirmation
|
|
112
|
+
result = {};
|
|
113
|
+
break;
|
|
114
|
+
case 'tools/list':
|
|
115
|
+
result = await this.handleToolsList();
|
|
116
|
+
break;
|
|
117
|
+
case 'tools/call':
|
|
118
|
+
result = await this.handleToolsCall(params);
|
|
119
|
+
break;
|
|
120
|
+
case 'sessions/list':
|
|
121
|
+
result = await this.handleSessionsList();
|
|
122
|
+
break;
|
|
123
|
+
case 'sessions/create':
|
|
124
|
+
result = await this.handleSessionsCreate(params);
|
|
125
|
+
break;
|
|
126
|
+
case 'sessions/delete':
|
|
127
|
+
result = await this.handleSessionsDelete(params);
|
|
128
|
+
break;
|
|
129
|
+
default:
|
|
130
|
+
return this.errorResponse(id, mcp_1.MCPErrorCodes.METHOD_NOT_FOUND, `Unknown method: ${method}`);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
jsonrpc: '2.0',
|
|
134
|
+
id,
|
|
135
|
+
result,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
140
|
+
return this.errorResponse(id, mcp_1.MCPErrorCodes.INTERNAL_ERROR, message);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Handle initialize request
|
|
145
|
+
*/
|
|
146
|
+
async handleInitialize(_params) {
|
|
147
|
+
return {
|
|
148
|
+
protocolVersion: '2024-11-05',
|
|
149
|
+
capabilities: {
|
|
150
|
+
tools: {},
|
|
151
|
+
},
|
|
152
|
+
serverInfo: {
|
|
153
|
+
name: 'claude-chrome-parallel',
|
|
154
|
+
version: '2.0.0',
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Handle tools/list request
|
|
160
|
+
*/
|
|
161
|
+
async handleToolsList() {
|
|
162
|
+
const tools = [];
|
|
163
|
+
for (const registry of this.tools.values()) {
|
|
164
|
+
tools.push(registry.definition);
|
|
165
|
+
}
|
|
166
|
+
return { tools };
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Handle tools/call request
|
|
170
|
+
*/
|
|
171
|
+
async handleToolsCall(params) {
|
|
172
|
+
if (!params) {
|
|
173
|
+
throw new Error('Missing params for tools/call');
|
|
174
|
+
}
|
|
175
|
+
const toolName = params.name;
|
|
176
|
+
const toolArgs = (params.arguments || {});
|
|
177
|
+
const sessionId = (toolArgs.sessionId || params.sessionId);
|
|
178
|
+
if (!toolName) {
|
|
179
|
+
throw new Error('Missing tool name');
|
|
180
|
+
}
|
|
181
|
+
const tool = this.tools.get(toolName);
|
|
182
|
+
if (!tool) {
|
|
183
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
184
|
+
}
|
|
185
|
+
// Ensure session exists
|
|
186
|
+
if (sessionId) {
|
|
187
|
+
await this.sessionManager.getOrCreateSession(sessionId);
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const result = await tool.handler(sessionId, toolArgs);
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
195
|
+
return {
|
|
196
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
197
|
+
isError: true,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Handle sessions/list request
|
|
203
|
+
*/
|
|
204
|
+
async handleSessionsList() {
|
|
205
|
+
const sessions = this.sessionManager.getAllSessionInfos();
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: 'text',
|
|
210
|
+
text: JSON.stringify(sessions, null, 2),
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Handle sessions/create request
|
|
217
|
+
*/
|
|
218
|
+
async handleSessionsCreate(params) {
|
|
219
|
+
const sessionId = params?.sessionId;
|
|
220
|
+
const name = params?.name;
|
|
221
|
+
const session = await this.sessionManager.createSession({
|
|
222
|
+
id: sessionId,
|
|
223
|
+
name,
|
|
224
|
+
});
|
|
225
|
+
return {
|
|
226
|
+
content: [
|
|
227
|
+
{
|
|
228
|
+
type: 'text',
|
|
229
|
+
text: JSON.stringify({
|
|
230
|
+
sessionId: session.id,
|
|
231
|
+
name: session.name,
|
|
232
|
+
targetCount: session.targets.size,
|
|
233
|
+
}, null, 2),
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Handle sessions/delete request
|
|
240
|
+
*/
|
|
241
|
+
async handleSessionsDelete(params) {
|
|
242
|
+
const sessionId = params?.sessionId;
|
|
243
|
+
if (!sessionId) {
|
|
244
|
+
throw new Error('Missing sessionId');
|
|
245
|
+
}
|
|
246
|
+
await this.sessionManager.deleteSession(sessionId);
|
|
247
|
+
return {
|
|
248
|
+
content: [
|
|
249
|
+
{
|
|
250
|
+
type: 'text',
|
|
251
|
+
text: `Session ${sessionId} deleted`,
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create an error response
|
|
258
|
+
*/
|
|
259
|
+
errorResponse(id, code, message, data) {
|
|
260
|
+
const error = { code, message };
|
|
261
|
+
if (data !== undefined) {
|
|
262
|
+
error.data = data;
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
jsonrpc: '2.0',
|
|
266
|
+
id,
|
|
267
|
+
error,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get the session manager
|
|
272
|
+
*/
|
|
273
|
+
getSessionManager() {
|
|
274
|
+
return this.sessionManager;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get registered tool names
|
|
278
|
+
*/
|
|
279
|
+
getToolNames() {
|
|
280
|
+
return Array.from(this.tools.keys());
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Stop the server
|
|
284
|
+
*/
|
|
285
|
+
stop() {
|
|
286
|
+
if (this.rl) {
|
|
287
|
+
this.rl.close();
|
|
288
|
+
this.rl = null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.MCPServer = MCPServer;
|
|
293
|
+
// Singleton instance
|
|
294
|
+
let mcpServerInstance = null;
|
|
295
|
+
function getMCPServer() {
|
|
296
|
+
if (!mcpServerInstance) {
|
|
297
|
+
mcpServerInstance = new MCPServer();
|
|
298
|
+
}
|
|
299
|
+
return mcpServerInstance;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|