axhub-mcp-bridge 1.0.34 → 1.0.36
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/dist/cli.js +0 -0
- package/dist/constant/index.d.ts +1 -1
- package/dist/constant/index.js +4 -2
- package/dist/constant/index.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-server-stdio.js +7 -3
- package/dist/mcp/mcp-server-stdio.js.map +1 -1
- package/dist/mcp/register-tools.js +8 -0
- package/dist/mcp/register-tools.js.map +1 -1
- package/dist/native-messaging-host.d.ts +38 -1
- package/dist/native-messaging-host.js +272 -9
- package/dist/native-messaging-host.js.map +1 -1
- package/dist/run_host.sh +0 -0
- package/dist/scripts/constant.js +2 -2
- package/dist/server/index.d.ts +30 -0
- package/dist/server/index.js +199 -12
- package/dist/server/index.js.map +1 -1
- package/dist/server/websocket-bridge.d.ts +92 -0
- package/dist/server/websocket-bridge.js +311 -0
- package/dist/server/websocket-bridge.js.map +1 -0
- package/dist/shared.d.ts +14 -2
- package/dist/shared.js +70 -22
- package/dist/shared.js.map +1 -1
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.js +85 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +10 -5
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebSocketBridge = void 0;
|
|
7
|
+
const ws_1 = require("ws");
|
|
8
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
9
|
+
class WebSocketBridge {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.wss = null;
|
|
12
|
+
this.clients = new Map();
|
|
13
|
+
this.heartbeatInterval = null;
|
|
14
|
+
this.onFigmaMessageCallback = null;
|
|
15
|
+
this.onClientConnectCallback = null;
|
|
16
|
+
this.onClientDisconnectCallback = null;
|
|
17
|
+
logger_1.default.log('[WS Bridge] Initializing WebSocket Bridge');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initialize WebSocket server on existing HTTP server
|
|
21
|
+
*/
|
|
22
|
+
initialize(server) {
|
|
23
|
+
this.wss = new ws_1.WebSocketServer({
|
|
24
|
+
server,
|
|
25
|
+
path: '/ws'
|
|
26
|
+
});
|
|
27
|
+
this.wss.on('connection', (ws, req) => {
|
|
28
|
+
this.handleConnection(ws, req);
|
|
29
|
+
});
|
|
30
|
+
// Start heartbeat
|
|
31
|
+
this.startHeartbeat();
|
|
32
|
+
logger_1.default.log('[WS Bridge] WebSocket server initialized on /ws');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Handle new WebSocket connection
|
|
36
|
+
* All WebSocket connections are from Figma plugin
|
|
37
|
+
*/
|
|
38
|
+
handleConnection(ws, req) {
|
|
39
|
+
const clientId = this.generateClientId();
|
|
40
|
+
// All WebSocket connections are from Figma plugin
|
|
41
|
+
const clientType = 'figma';
|
|
42
|
+
logger_1.default.log('[WS Bridge] New connection from Figma plugin', { clientId, url: req.url, host: req.headers.host });
|
|
43
|
+
const clientInfo = {
|
|
44
|
+
ws,
|
|
45
|
+
id: clientId,
|
|
46
|
+
type: clientType,
|
|
47
|
+
alive: true,
|
|
48
|
+
};
|
|
49
|
+
this.clients.set(clientId, clientInfo);
|
|
50
|
+
// Send connection confirmation
|
|
51
|
+
this.sendToClient(clientId, {
|
|
52
|
+
type: 'ws:connected',
|
|
53
|
+
payload: { clientId, clientType: clientInfo.type }
|
|
54
|
+
});
|
|
55
|
+
logger_1.default.log('[WS Bridge] Client registered', {
|
|
56
|
+
clientId,
|
|
57
|
+
type: clientInfo.type,
|
|
58
|
+
totalClients: this.clients.size,
|
|
59
|
+
url: req.url,
|
|
60
|
+
host: req.headers.host,
|
|
61
|
+
allClientTypes: Array.from(this.clients.values()).map(c => ({ id: c.id, type: c.type }))
|
|
62
|
+
});
|
|
63
|
+
// Notify extension about client connection
|
|
64
|
+
if (this.onClientConnectCallback) {
|
|
65
|
+
const stats = this.getStats();
|
|
66
|
+
this.onClientConnectCallback(clientId, { total: stats.total, figma: stats.figma });
|
|
67
|
+
}
|
|
68
|
+
// Handle messages
|
|
69
|
+
ws.on('message', (data) => {
|
|
70
|
+
this.handleMessage(clientId, data);
|
|
71
|
+
});
|
|
72
|
+
// Handle pong (heartbeat response)
|
|
73
|
+
ws.on('pong', () => {
|
|
74
|
+
const client = this.clients.get(clientId);
|
|
75
|
+
if (client) {
|
|
76
|
+
client.alive = true;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Handle close
|
|
80
|
+
ws.on('close', () => {
|
|
81
|
+
logger_1.default.log('[WS Bridge] Client disconnected', { clientId });
|
|
82
|
+
const stats = this.getStats();
|
|
83
|
+
this.clients.delete(clientId);
|
|
84
|
+
// Notify extension about client disconnection
|
|
85
|
+
if (this.onClientDisconnectCallback) {
|
|
86
|
+
const newStats = this.getStats();
|
|
87
|
+
this.onClientDisconnectCallback(clientId, { total: newStats.total, figma: newStats.figma });
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// Handle errors
|
|
91
|
+
ws.on('error', (error) => {
|
|
92
|
+
logger_1.default.error('[WS Bridge] Client error', { clientId, error: error.message });
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Handle incoming message from client
|
|
97
|
+
*/
|
|
98
|
+
handleMessage(fromClientId, data) {
|
|
99
|
+
var _a;
|
|
100
|
+
try {
|
|
101
|
+
const message = JSON.parse(data.toString());
|
|
102
|
+
const fromClient = this.clients.get(fromClientId);
|
|
103
|
+
if (!fromClient) {
|
|
104
|
+
logger_1.default.warn('[WS Bridge] Message from unknown client', { fromClientId });
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
logger_1.default.log('[WS Bridge] Received message', {
|
|
108
|
+
from: fromClient.type,
|
|
109
|
+
clientId: fromClientId,
|
|
110
|
+
type: message.type,
|
|
111
|
+
target: message.target,
|
|
112
|
+
hasRequestId: !!message.___requestId
|
|
113
|
+
});
|
|
114
|
+
// Handle special message types
|
|
115
|
+
if (message.type === 'ws:register') {
|
|
116
|
+
// Update client type
|
|
117
|
+
const newType = (_a = message.payload) === null || _a === void 0 ? void 0 : _a.clientType;
|
|
118
|
+
if (newType === 'figma' || newType === 'extension') {
|
|
119
|
+
fromClient.type = newType;
|
|
120
|
+
logger_1.default.log('[WS Bridge] Client type updated', { clientId: fromClientId, type: newType });
|
|
121
|
+
this.sendToClient(fromClientId, {
|
|
122
|
+
type: 'ws:registered',
|
|
123
|
+
payload: { clientId: fromClientId, clientType: newType }
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Route message based on target
|
|
129
|
+
this.routeMessage(fromClient, message);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
logger_1.default.error('[WS Bridge] Failed to parse message', {
|
|
133
|
+
fromClientId,
|
|
134
|
+
error: error.message
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Register callback for Figma messages
|
|
140
|
+
* This allows native-messaging-host to receive messages from Figma plugin
|
|
141
|
+
*/
|
|
142
|
+
onFigmaMessage(callback) {
|
|
143
|
+
this.onFigmaMessageCallback = callback;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Register callback for client connection events
|
|
147
|
+
*/
|
|
148
|
+
onClientConnect(callback) {
|
|
149
|
+
this.onClientConnectCallback = callback;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Register callback for client disconnection events
|
|
153
|
+
*/
|
|
154
|
+
onClientDisconnect(callback) {
|
|
155
|
+
this.onClientDisconnectCallback = callback;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Route message from Figma plugin
|
|
159
|
+
* Messages from Figma should be forwarded to Extension via Native Messaging
|
|
160
|
+
*/
|
|
161
|
+
routeMessage(fromClient, message) {
|
|
162
|
+
// All WebSocket clients are Figma plugins
|
|
163
|
+
// Messages from Figma should be forwarded to Extension via Native Messaging
|
|
164
|
+
logger_1.default.log('[WS Bridge] Message from Figma plugin', {
|
|
165
|
+
clientId: fromClient.id,
|
|
166
|
+
messageType: message.type
|
|
167
|
+
});
|
|
168
|
+
// If target is 'broadcast', send to all other Figma clients
|
|
169
|
+
if (message.target === 'broadcast') {
|
|
170
|
+
this.broadcastMessage(fromClient.id, message);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Forward to Extension via Native Messaging callback
|
|
174
|
+
if (this.onFigmaMessageCallback) {
|
|
175
|
+
this.onFigmaMessageCallback(message);
|
|
176
|
+
logger_1.default.log('[WS Bridge] Message forwarded to Extension via Native Messaging');
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
logger_1.default.warn('[WS Bridge] No callback registered for Figma messages');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Broadcast message to all clients except sender
|
|
184
|
+
*/
|
|
185
|
+
broadcastMessage(exceptClientId, message) {
|
|
186
|
+
let sent = 0;
|
|
187
|
+
for (const [clientId, client] of this.clients.entries()) {
|
|
188
|
+
if (clientId !== exceptClientId) {
|
|
189
|
+
this.sendToClient(clientId, message);
|
|
190
|
+
sent++;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
logger_1.default.log('[WS Bridge] Broadcast message', { type: message.type, recipients: sent });
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Send message to specific client
|
|
197
|
+
*/
|
|
198
|
+
sendToClient(clientId, message) {
|
|
199
|
+
const client = this.clients.get(clientId);
|
|
200
|
+
if (!client) {
|
|
201
|
+
logger_1.default.warn('[WS Bridge] Cannot send to unknown client', { clientId });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (client.ws.readyState === ws_1.WebSocket.OPEN) {
|
|
205
|
+
try {
|
|
206
|
+
client.ws.send(JSON.stringify(message));
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
logger_1.default.error('[WS Bridge] Failed to send message', {
|
|
210
|
+
clientId,
|
|
211
|
+
error: error.message
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Start heartbeat to detect dead connections
|
|
218
|
+
*/
|
|
219
|
+
startHeartbeat() {
|
|
220
|
+
this.heartbeatInterval = setInterval(() => {
|
|
221
|
+
for (const [clientId, client] of this.clients.entries()) {
|
|
222
|
+
if (!client.alive) {
|
|
223
|
+
logger_1.default.log('[WS Bridge] Terminating dead connection', { clientId });
|
|
224
|
+
client.ws.terminate();
|
|
225
|
+
this.clients.delete(clientId);
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
client.alive = false;
|
|
229
|
+
client.ws.ping();
|
|
230
|
+
}
|
|
231
|
+
}, 30000); // 30 seconds
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Stop heartbeat
|
|
235
|
+
*/
|
|
236
|
+
stopHeartbeat() {
|
|
237
|
+
if (this.heartbeatInterval) {
|
|
238
|
+
clearInterval(this.heartbeatInterval);
|
|
239
|
+
this.heartbeatInterval = null;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Generate unique client ID
|
|
244
|
+
*/
|
|
245
|
+
generateClientId() {
|
|
246
|
+
return `client_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get connection stats
|
|
250
|
+
* All WebSocket clients are Figma plugins
|
|
251
|
+
*/
|
|
252
|
+
getStats() {
|
|
253
|
+
const details = [];
|
|
254
|
+
for (const [clientId, client] of this.clients.entries()) {
|
|
255
|
+
details.push({
|
|
256
|
+
id: clientId,
|
|
257
|
+
type: client.type,
|
|
258
|
+
alive: client.alive,
|
|
259
|
+
readyState: client.ws.readyState
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
logger_1.default.log('[WS Bridge] Stats calculated', {
|
|
263
|
+
total: this.clients.size,
|
|
264
|
+
figma: this.clients.size,
|
|
265
|
+
details
|
|
266
|
+
});
|
|
267
|
+
return {
|
|
268
|
+
total: this.clients.size,
|
|
269
|
+
figma: this.clients.size,
|
|
270
|
+
details
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Send message to all Figma clients
|
|
275
|
+
* All WebSocket clients are Figma plugins
|
|
276
|
+
*/
|
|
277
|
+
sendToClientType(type, message) {
|
|
278
|
+
let sent = 0;
|
|
279
|
+
logger_1.default.log('[WS Bridge] Sending message to Figma clients', { messageType: message.type, clientCount: this.clients.size });
|
|
280
|
+
for (const [clientId, client] of this.clients.entries()) {
|
|
281
|
+
// All clients are figma type
|
|
282
|
+
logger_1.default.log('[WS Bridge] Sending to client', { clientId, clientType: client.type, messageType: message.type });
|
|
283
|
+
this.sendToClient(clientId, message);
|
|
284
|
+
sent++;
|
|
285
|
+
}
|
|
286
|
+
if (sent === 0) {
|
|
287
|
+
logger_1.default.warn('[WS Bridge] No Figma clients connected', { totalClients: this.clients.size });
|
|
288
|
+
}
|
|
289
|
+
return sent;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Cleanup
|
|
293
|
+
*/
|
|
294
|
+
destroy() {
|
|
295
|
+
this.stopHeartbeat();
|
|
296
|
+
// Close all client connections
|
|
297
|
+
for (const client of this.clients.values()) {
|
|
298
|
+
client.ws.close();
|
|
299
|
+
}
|
|
300
|
+
this.clients.clear();
|
|
301
|
+
if (this.wss) {
|
|
302
|
+
this.wss.close();
|
|
303
|
+
this.wss = null;
|
|
304
|
+
}
|
|
305
|
+
logger_1.default.log('[WS Bridge] WebSocket bridge destroyed');
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
exports.WebSocketBridge = WebSocketBridge;
|
|
309
|
+
const websocketBridge = new WebSocketBridge();
|
|
310
|
+
exports.default = websocketBridge;
|
|
311
|
+
//# sourceMappingURL=websocket-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-bridge.js","sourceRoot":"","sources":["../../src/server/websocket-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/shared.d.ts
CHANGED
|
@@ -15,7 +15,17 @@ export declare enum NativeMessageType {
|
|
|
15
15
|
ERROR_FROM_NATIVE_HOST = "error_from_native_host",
|
|
16
16
|
CONNECT_NATIVE = "connectNative",
|
|
17
17
|
PING_NATIVE = "ping_native",
|
|
18
|
-
DISCONNECT_NATIVE = "disconnect_native"
|
|
18
|
+
DISCONNECT_NATIVE = "disconnect_native",
|
|
19
|
+
START_WEBSOCKET = "start_websocket",
|
|
20
|
+
STOP_WEBSOCKET = "stop_websocket",
|
|
21
|
+
WEBSOCKET_STARTED = "websocket_started",
|
|
22
|
+
WEBSOCKET_STOPPED = "websocket_stopped",
|
|
23
|
+
WEBSOCKET_STATUS = "websocket_status",
|
|
24
|
+
FIGMA_MESSAGE = "figma_message",
|
|
25
|
+
FIGMA_REQUEST = "figma_request",
|
|
26
|
+
FIGMA_RESPONSE = "figma_response",
|
|
27
|
+
WEBSOCKET_CLIENT_CONNECTED = "websocket_client_connected",
|
|
28
|
+
WEBSOCKET_CLIENT_DISCONNECTED = "websocket_client_disconnected"
|
|
19
29
|
}
|
|
20
30
|
export interface NativeMessage<P = any, E = any> {
|
|
21
31
|
type?: NativeMessageType;
|
|
@@ -25,13 +35,15 @@ export interface NativeMessage<P = any, E = any> {
|
|
|
25
35
|
}
|
|
26
36
|
export declare const TOOL_NAMES: {
|
|
27
37
|
BROWSER: {
|
|
28
|
-
NAVIGATE: string;
|
|
29
38
|
SEARCH_AXURE_PROTOTYPE: string;
|
|
30
39
|
GET_AXURE_SITEMAP: string;
|
|
31
40
|
GET_AXURE_PAGE_SCREENSHOT: string;
|
|
32
41
|
GET_AXURE_HTML: string;
|
|
33
42
|
GET_AXURE_INTERACTIONS: string;
|
|
34
43
|
GET_AXURE_PAGE_TEXT: string;
|
|
44
|
+
GET_AXURE_IMAGE: string;
|
|
45
|
+
GET_PAGE_THEME: string;
|
|
46
|
+
DOWNLOAD_PAGE_DATA: string;
|
|
35
47
|
};
|
|
36
48
|
};
|
|
37
49
|
import { type Tool } from '@modelcontextprotocol/sdk/types.js';
|
package/dist/shared.js
CHANGED
|
@@ -23,42 +23,36 @@ var NativeMessageType;
|
|
|
23
23
|
NativeMessageType["CONNECT_NATIVE"] = "connectNative";
|
|
24
24
|
NativeMessageType["PING_NATIVE"] = "ping_native";
|
|
25
25
|
NativeMessageType["DISCONNECT_NATIVE"] = "disconnect_native";
|
|
26
|
+
// WebSocket server control
|
|
27
|
+
NativeMessageType["START_WEBSOCKET"] = "start_websocket";
|
|
28
|
+
NativeMessageType["STOP_WEBSOCKET"] = "stop_websocket";
|
|
29
|
+
NativeMessageType["WEBSOCKET_STARTED"] = "websocket_started";
|
|
30
|
+
NativeMessageType["WEBSOCKET_STOPPED"] = "websocket_stopped";
|
|
31
|
+
NativeMessageType["WEBSOCKET_STATUS"] = "websocket_status";
|
|
32
|
+
// Figma bridge messages (relayed through native host)
|
|
33
|
+
NativeMessageType["FIGMA_MESSAGE"] = "figma_message";
|
|
34
|
+
NativeMessageType["FIGMA_REQUEST"] = "figma_request";
|
|
35
|
+
NativeMessageType["FIGMA_RESPONSE"] = "figma_response";
|
|
36
|
+
// WebSocket client connection events
|
|
37
|
+
NativeMessageType["WEBSOCKET_CLIENT_CONNECTED"] = "websocket_client_connected";
|
|
38
|
+
NativeMessageType["WEBSOCKET_CLIENT_DISCONNECTED"] = "websocket_client_disconnected";
|
|
26
39
|
})(NativeMessageType || (exports.NativeMessageType = NativeMessageType = {}));
|
|
27
40
|
// export const DEFAULT_SERVER_PORT = 12308;
|
|
28
41
|
// export const HOST_NAME = 'com.axhub.nativehost';
|
|
29
42
|
exports.TOOL_NAMES = {
|
|
30
43
|
BROWSER: {
|
|
31
|
-
NAVIGATE: 'chrome_navigate',
|
|
32
44
|
SEARCH_AXURE_PROTOTYPE: 'search_axure',
|
|
33
45
|
GET_AXURE_SITEMAP: 'get_axure_sitemap',
|
|
34
46
|
GET_AXURE_PAGE_SCREENSHOT: 'get_axure_screenshot',
|
|
35
47
|
GET_AXURE_HTML: 'get_axure_html',
|
|
36
48
|
GET_AXURE_INTERACTIONS: 'get_axure_interactions',
|
|
37
49
|
GET_AXURE_PAGE_TEXT: 'get_axure_text',
|
|
50
|
+
GET_AXURE_IMAGE: 'get_axure_image',
|
|
51
|
+
GET_PAGE_THEME: 'get_page_theme',
|
|
52
|
+
DOWNLOAD_PAGE_DATA: 'download_page_data',
|
|
38
53
|
},
|
|
39
54
|
};
|
|
40
55
|
exports.TOOL_SCHEMAS = [
|
|
41
|
-
{
|
|
42
|
-
name: exports.TOOL_NAMES.BROWSER.NAVIGATE,
|
|
43
|
-
description: 'Navigate to a URL or refresh the current tab',
|
|
44
|
-
inputSchema: {
|
|
45
|
-
type: 'object',
|
|
46
|
-
properties: {
|
|
47
|
-
url: { type: 'string', description: 'URL to navigate to the website specified' },
|
|
48
|
-
newWindow: {
|
|
49
|
-
type: 'boolean',
|
|
50
|
-
description: 'Create a new window to navigate to the URL or not. Defaults to false',
|
|
51
|
-
},
|
|
52
|
-
width: { type: 'number', description: 'Viewport width in pixels (default: 1280)' },
|
|
53
|
-
height: { type: 'number', description: 'Viewport height in pixels (default: 720)' },
|
|
54
|
-
refresh: {
|
|
55
|
-
type: 'boolean',
|
|
56
|
-
description: 'Refresh the current active tab instead of navigating to a URL. When true, the url parameter is ignored. Defaults to false',
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
required: [],
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
56
|
{
|
|
63
57
|
name: exports.TOOL_NAMES.BROWSER.SEARCH_AXURE_PROTOTYPE,
|
|
64
58
|
description: 'Search and find content within Axure prototype projects using semantic search',
|
|
@@ -183,5 +177,59 @@ exports.TOOL_SCHEMAS = [
|
|
|
183
177
|
required: ['pageUrl'],
|
|
184
178
|
},
|
|
185
179
|
},
|
|
180
|
+
{
|
|
181
|
+
name: exports.TOOL_NAMES.BROWSER.GET_AXURE_IMAGE,
|
|
182
|
+
description: 'Download images from Axure prototype projects, supporting both absolute and relative image URLs',
|
|
183
|
+
inputSchema: {
|
|
184
|
+
type: 'object',
|
|
185
|
+
properties: {
|
|
186
|
+
projectUrl: {
|
|
187
|
+
type: 'string',
|
|
188
|
+
description: 'URL of the Axure project (required when imageUrl is a relative path)',
|
|
189
|
+
},
|
|
190
|
+
imageUrl: {
|
|
191
|
+
type: 'string',
|
|
192
|
+
description: 'URL of the image to download. Can be absolute or relative path (e.g., "images/logo.png")',
|
|
193
|
+
},
|
|
194
|
+
storeBase64: {
|
|
195
|
+
type: 'boolean',
|
|
196
|
+
description: 'Return image in base64 format instead of downloading (default: false)',
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
required: ['imageUrl'],
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: exports.TOOL_NAMES.BROWSER.GET_PAGE_THEME,
|
|
204
|
+
description: 'Extract design theme tokens from any web page including colors, typography, spacing, radius, line widths, and shadows. Works with any webpage, not limited to Axure prototypes.',
|
|
205
|
+
inputSchema: {
|
|
206
|
+
type: 'object',
|
|
207
|
+
properties: {
|
|
208
|
+
url: {
|
|
209
|
+
type: 'string',
|
|
210
|
+
description: 'URL of the page to extract theme from (optional, uses current active tab if not provided)',
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
required: [],
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
name: exports.TOOL_NAMES.BROWSER.DOWNLOAD_PAGE_DATA,
|
|
218
|
+
description: 'Download complete page data package (including theme, DOM structure, styles, screenshot, and images) as a zip file and return the local file path. This tool is useful for AI to analyze page structure and design.',
|
|
219
|
+
inputSchema: {
|
|
220
|
+
type: 'object',
|
|
221
|
+
properties: {
|
|
222
|
+
url: {
|
|
223
|
+
type: 'string',
|
|
224
|
+
description: 'URL of the page to download data from (optional, uses current active tab if not provided)',
|
|
225
|
+
},
|
|
226
|
+
filename: {
|
|
227
|
+
type: 'string',
|
|
228
|
+
description: 'Custom filename for the downloaded zip file (optional, default: cursor-export-{timestamp}.zip)',
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
required: [],
|
|
232
|
+
},
|
|
233
|
+
},
|
|
186
234
|
];
|
|
187
235
|
//# sourceMappingURL=shared.js.map
|
package/dist/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":";AAAA,qDAAqD;AACrD,sEAAsE;;;AAEtE,IAAY,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":";AAAA,qDAAqD;AACrD,sEAAsE;;;AAEtE,IAAY,iBAgCX;AAhCD,WAAY,iBAAiB;IAC3B,oCAAe,CAAA;IACf,wCAAmB,CAAA;IACnB,kCAAa,CAAA;IACb,wCAAmB,CAAA;IACnB,kCAAa,CAAA;IACb,kCAAa,CAAA;IACb,oCAAe,CAAA;IACf,kDAA6B,CAAA;IAC7B,oEAA+C,CAAA;IAC/C,4CAAuB,CAAA;IACvB,8DAAyC,CAAA;IACzC,oDAAoD;IACpD,sDAAiC,CAAA;IACjC,sDAAiC,CAAA;IACjC,sEAAiD,CAAA;IACjD,qDAAgC,CAAA;IAChC,gDAA2B,CAAA;IAC3B,4DAAuC,CAAA;IACvC,2BAA2B;IAC3B,wDAAmC,CAAA;IACnC,sDAAiC,CAAA;IACjC,4DAAuC,CAAA;IACvC,4DAAuC,CAAA;IACvC,0DAAqC,CAAA;IACrC,sDAAsD;IACtD,oDAA+B,CAAA;IAC/B,oDAA+B,CAAA;IAC/B,sDAAiC,CAAA;IACjC,qCAAqC;IACrC,8EAAyD,CAAA;IACzD,oFAA+D,CAAA;AACjE,CAAC,EAhCW,iBAAiB,iCAAjB,iBAAiB,QAgC5B;AASD,4CAA4C;AAC5C,mDAAmD;AAEtC,QAAA,UAAU,GAAG;IACxB,OAAO,EAAE;QACP,sBAAsB,EAAE,cAAc;QACtC,iBAAiB,EAAE,mBAAmB;QACtC,yBAAyB,EAAE,sBAAsB;QACjD,cAAc,EAAE,gBAAgB;QAChC,sBAAsB,EAAE,wBAAwB;QAChD,mBAAmB,EAAE,gBAAgB;QACrC,eAAe,EAAE,iBAAiB;QAClC,cAAc,EAAE,gBAAgB;QAChC,kBAAkB,EAAE,oBAAoB;KACzC;CACF,CAAC;AAKW,QAAA,YAAY,GAAW;IAClC;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,sBAAsB;QAC/C,WAAW,EAAE,+EAA+E;QAC5F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iDAAiD;iBAC/D;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yDAAyD;iBACvE;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;SAClC;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,iBAAiB;QAC1C,WAAW,EAAE,2EAA2E;QACxF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qGAAqG;iBACnH;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,yBAAyB;QAClD,WAAW,EAAE,gFAAgF;QAC7F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8CAA8C;iBAC5D;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2FAA2F;iBACzG;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2EAA2E;iBACzF;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4EAA4E;iBAC1F;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,qDAAqD;iBACnE;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,cAAc;QACvC,WAAW,EAAE,4FAA4F;QACzG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uDAAuD;iBACrE;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iHAAiH;iBAC/H;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,sBAAsB;QAC/C,WAAW,EAAE,yEAAyE;QACtF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gDAAgD;iBAC9D;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,mBAAmB;QAC5C,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qDAAqD;iBACnE;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,eAAe;QACxC,WAAW,EAAE,iGAAiG;QAC9G,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sEAAsE;iBACpF;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0FAA0F;iBACxG;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,uEAAuE;iBACrF;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,cAAc;QACvC,WAAW,EAAE,iLAAiL;QAC9L,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2FAA2F;iBACzG;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,kBAAkB;QAC3C,WAAW,EAAE,qNAAqN;QAClO,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2FAA2F;iBACzG;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gGAAgG;iBAC9G;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare class Logger {
|
|
2
|
+
private logFilePath;
|
|
3
|
+
constructor();
|
|
4
|
+
private formatMessage;
|
|
5
|
+
log(message: string, data?: any): void;
|
|
6
|
+
error(message: string, data?: any): void;
|
|
7
|
+
warn(message: string, data?: any): void;
|
|
8
|
+
debug(message: string, data?: any): void;
|
|
9
|
+
close(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const logger: Logger;
|
|
12
|
+
export default logger;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logger = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
class Logger {
|
|
10
|
+
constructor() {
|
|
11
|
+
// Determine log directory - use dist/logs in production, src/logs in development
|
|
12
|
+
const isDist = __dirname.includes('/dist/');
|
|
13
|
+
const baseDir = isDist
|
|
14
|
+
? path_1.default.join(__dirname, '..', '..')
|
|
15
|
+
: path_1.default.join(__dirname, '..');
|
|
16
|
+
const logDir = path_1.default.join(baseDir, 'dist', 'logs');
|
|
17
|
+
// Create log directory if it doesn't exist
|
|
18
|
+
if (!fs_1.default.existsSync(logDir)) {
|
|
19
|
+
fs_1.default.mkdirSync(logDir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
// Generate log file name with timestamp
|
|
22
|
+
const timestamp = new Date()
|
|
23
|
+
.toISOString()
|
|
24
|
+
.replace(/:/g, '')
|
|
25
|
+
.replace(/\./g, '_')
|
|
26
|
+
.replace(/T/, '_')
|
|
27
|
+
.slice(0, 15); // Format: YYYYMMDD_HHMMSS
|
|
28
|
+
const logFileName = `native_host_${timestamp}.log`;
|
|
29
|
+
this.logFilePath = path_1.default.join(logDir, logFileName);
|
|
30
|
+
this.log('Logger initialized', { logFile: this.logFilePath });
|
|
31
|
+
}
|
|
32
|
+
formatMessage(level, message, data) {
|
|
33
|
+
const timestamp = new Date().toISOString();
|
|
34
|
+
let formattedMessage = `[${timestamp}] [${level}] ${message}`;
|
|
35
|
+
if (data !== undefined) {
|
|
36
|
+
try {
|
|
37
|
+
formattedMessage += ' ' + JSON.stringify(data, null, 2);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
formattedMessage += ' [Unable to stringify data]';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return formattedMessage + '\n';
|
|
44
|
+
}
|
|
45
|
+
log(message, data) {
|
|
46
|
+
try {
|
|
47
|
+
// Use synchronous write to ensure logs are immediately written
|
|
48
|
+
fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('INFO', message, data));
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// Silently fail to avoid breaking the application
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
error(message, data) {
|
|
55
|
+
try {
|
|
56
|
+
fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('ERROR', message, data));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Silently fail
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
warn(message, data) {
|
|
63
|
+
try {
|
|
64
|
+
fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('WARN', message, data));
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
// Silently fail
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
debug(message, data) {
|
|
71
|
+
try {
|
|
72
|
+
fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('DEBUG', message, data));
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// Silently fail
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
close() {
|
|
79
|
+
// No-op for sync logging
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Export singleton instance
|
|
83
|
+
exports.logger = new Logger();
|
|
84
|
+
exports.default = exports.logger;
|
|
85
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "axhub-mcp-bridge",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.36",
|
|
4
4
|
"description": "Chrome Native-Messaging host (Node)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -16,7 +16,10 @@
|
|
|
16
16
|
"lint:fix": "eslint 'src/**/*.{js,ts}' --fix",
|
|
17
17
|
"format": "prettier --write 'src/**/*.{js,ts,json}'",
|
|
18
18
|
"register:dev": "node dist/scripts/register-dev.js",
|
|
19
|
-
"postinstall": "node dist/scripts/postinstall.js"
|
|
19
|
+
"postinstall": "node dist/scripts/postinstall.js",
|
|
20
|
+
"inspector": "npx -y @modelcontextprotocol/inspector@latest node dist/mcp/mcp-server-stdio.js",
|
|
21
|
+
"inspector:cli": "npx -y @modelcontextprotocol/inspector@latest --cli node dist/mcp/mcp-server-stdio.js",
|
|
22
|
+
"inspector:http": "npx -y @modelcontextprotocol/inspector@latest http://127.0.0.1:12307/mcp"
|
|
20
23
|
},
|
|
21
24
|
"files": [
|
|
22
25
|
"dist"
|
|
@@ -33,7 +36,8 @@
|
|
|
33
36
|
"fastify": "^5.3.2",
|
|
34
37
|
"is-admin": "^4.0.0",
|
|
35
38
|
"pino": "^9.6.0",
|
|
36
|
-
"uuid": "^11.1.0"
|
|
39
|
+
"uuid": "^11.1.0",
|
|
40
|
+
"ws": "^8.18.3"
|
|
37
41
|
},
|
|
38
42
|
"devDependencies": {
|
|
39
43
|
"@jest/globals": "^29.7.0",
|
|
@@ -41,6 +45,7 @@
|
|
|
41
45
|
"@types/jest": "^29.5.14",
|
|
42
46
|
"@types/node": "^22.15.3",
|
|
43
47
|
"@types/supertest": "^6.0.3",
|
|
48
|
+
"@types/ws": "^8.18.1",
|
|
44
49
|
"@typescript-eslint/parser": "^8.31.1",
|
|
45
50
|
"cross-env": "^7.0.3",
|
|
46
51
|
"husky": "^9.1.7",
|
|
@@ -59,7 +64,7 @@
|
|
|
59
64
|
}
|
|
60
65
|
},
|
|
61
66
|
"lint-staged": {
|
|
62
|
-
"*.{js,ts}": [
|
|
67
|
+
"*.{js,ts}": [
|
|
63
68
|
"eslint --fix",
|
|
64
69
|
"prettier --write"
|
|
65
70
|
],
|
|
@@ -67,4 +72,4 @@
|
|
|
67
72
|
"prettier --write"
|
|
68
73
|
]
|
|
69
74
|
}
|
|
70
|
-
}
|
|
75
|
+
}
|