@spooky-sync/devtools-mcp 0.0.1-canary.26 → 0.0.1-canary.29
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/bridge.js +8 -8
- package/dist/index.js +3 -3
- package/dist/server.js +8 -8
- package/package.json +4 -4
package/dist/bridge.js
CHANGED
|
@@ -15,18 +15,18 @@ export class Bridge {
|
|
|
15
15
|
return Array.from(this.connectedTabs.values());
|
|
16
16
|
}
|
|
17
17
|
start() {
|
|
18
|
-
const port = parseInt(process.env.
|
|
18
|
+
const port = parseInt(process.env.SP00KY_MCP_PORT || '', 10) || BRIDGE_PORT;
|
|
19
19
|
return new Promise((resolve, reject) => {
|
|
20
20
|
this.wss = new WebSocketServer({ host: '127.0.0.1', port }, () => {
|
|
21
|
-
process.stderr.write(`[
|
|
21
|
+
process.stderr.write(`[sp00ky-mcp] Bridge listening on ws://127.0.0.1:${port}\n`);
|
|
22
22
|
resolve();
|
|
23
23
|
});
|
|
24
24
|
this.wss.on('error', (err) => {
|
|
25
|
-
process.stderr.write(`[
|
|
25
|
+
process.stderr.write(`[sp00ky-mcp] Bridge error: ${err.message}\n`);
|
|
26
26
|
reject(err);
|
|
27
27
|
});
|
|
28
28
|
this.wss.on('connection', (ws) => {
|
|
29
|
-
process.stderr.write('[
|
|
29
|
+
process.stderr.write('[sp00ky-mcp] Extension connected\n');
|
|
30
30
|
// Only allow one extension connection at a time
|
|
31
31
|
if (this.extensionSocket) {
|
|
32
32
|
this.extensionSocket.close();
|
|
@@ -40,11 +40,11 @@ export class Bridge {
|
|
|
40
40
|
this.handleMessage(msg);
|
|
41
41
|
}
|
|
42
42
|
catch (err) {
|
|
43
|
-
process.stderr.write(`[
|
|
43
|
+
process.stderr.write(`[sp00ky-mcp] Bad message: ${err}\n`);
|
|
44
44
|
}
|
|
45
45
|
});
|
|
46
46
|
ws.on('close', () => {
|
|
47
|
-
process.stderr.write('[
|
|
47
|
+
process.stderr.write('[sp00ky-mcp] Extension disconnected\n');
|
|
48
48
|
if (this.extensionSocket === ws) {
|
|
49
49
|
this.extensionSocket = null;
|
|
50
50
|
this.connectedTabs.clear();
|
|
@@ -58,7 +58,7 @@ export class Bridge {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
ws.on('error', (err) => {
|
|
61
|
-
process.stderr.write(`[
|
|
61
|
+
process.stderr.write(`[sp00ky-mcp] Socket error: ${err.message}\n`);
|
|
62
62
|
});
|
|
63
63
|
});
|
|
64
64
|
});
|
|
@@ -107,7 +107,7 @@ export class Bridge {
|
|
|
107
107
|
}
|
|
108
108
|
async request(method, params = {}, tabId) {
|
|
109
109
|
if (!this.extensionSocket || this.extensionSocket.readyState !== WebSocket.OPEN) {
|
|
110
|
-
throw new Error('No extension connected. Make sure the
|
|
110
|
+
throw new Error('No extension connected. Make sure the Sp00ky DevTools extension is running and has a page with Sp00ky open.');
|
|
111
111
|
}
|
|
112
112
|
const id = `mcp-${++this.requestCounter}`;
|
|
113
113
|
const resolvedTabId = tabId ?? this.getDefaultTabId();
|
package/dist/index.js
CHANGED
|
@@ -8,10 +8,10 @@ async function main() {
|
|
|
8
8
|
const server = createServer(bridge);
|
|
9
9
|
const transport = new StdioServerTransport();
|
|
10
10
|
await server.connect(transport);
|
|
11
|
-
process.stderr.write('[
|
|
11
|
+
process.stderr.write('[sp00ky-mcp] MCP server running on stdio\n');
|
|
12
12
|
// Graceful shutdown
|
|
13
13
|
const cleanup = async () => {
|
|
14
|
-
process.stderr.write('[
|
|
14
|
+
process.stderr.write('[sp00ky-mcp] Shutting down...\n');
|
|
15
15
|
await bridge.stop();
|
|
16
16
|
process.exit(0);
|
|
17
17
|
};
|
|
@@ -19,6 +19,6 @@ async function main() {
|
|
|
19
19
|
process.on('SIGTERM', cleanup);
|
|
20
20
|
}
|
|
21
21
|
main().catch((err) => {
|
|
22
|
-
process.stderr.write(`[
|
|
22
|
+
process.stderr.write(`[sp00ky-mcp] Fatal error: ${err.message}\n`);
|
|
23
23
|
process.exit(1);
|
|
24
24
|
});
|
package/dist/server.js
CHANGED
|
@@ -3,11 +3,11 @@ import { z } from 'zod';
|
|
|
3
3
|
import { BRIDGE_METHODS } from './protocol.js';
|
|
4
4
|
export function createServer(bridge) {
|
|
5
5
|
const server = new McpServer({
|
|
6
|
-
name: '
|
|
6
|
+
name: 'sp00ky-devtools',
|
|
7
7
|
version: '0.0.1',
|
|
8
8
|
});
|
|
9
9
|
// --- Tools ---
|
|
10
|
-
server.tool('list_connections', 'List browser tabs connected to
|
|
10
|
+
server.tool('list_connections', 'List browser tabs connected to Sp00ky DevTools', {}, async () => {
|
|
11
11
|
const tabs = bridge.getConnectedTabs();
|
|
12
12
|
return {
|
|
13
13
|
content: [
|
|
@@ -21,7 +21,7 @@ export function createServer(bridge) {
|
|
|
21
21
|
],
|
|
22
22
|
};
|
|
23
23
|
});
|
|
24
|
-
server.tool('get_state', 'Get the full
|
|
24
|
+
server.tool('get_state', 'Get the full Sp00ky DevTools state (events, queries, auth, database)', { tabId: z.number().optional().describe('Browser tab ID (uses first connected tab if omitted)') }, async ({ tabId }) => {
|
|
25
25
|
const result = await bridge.request(BRIDGE_METHODS.GET_STATE, {}, tabId);
|
|
26
26
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
27
27
|
});
|
|
@@ -92,26 +92,26 @@ export function createServer(bridge) {
|
|
|
92
92
|
return { content: [{ type: 'text', text: 'History cleared.' }] };
|
|
93
93
|
});
|
|
94
94
|
// --- Resources ---
|
|
95
|
-
server.resource('state', '
|
|
95
|
+
server.resource('state', 'sp00ky://state', { description: 'Full Sp00ky DevTools state' }, async (uri) => {
|
|
96
96
|
const state = await bridge.request(BRIDGE_METHODS.GET_STATE);
|
|
97
97
|
return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(state, null, 2) }] };
|
|
98
98
|
});
|
|
99
|
-
server.resource('tables', '
|
|
99
|
+
server.resource('tables', 'sp00ky://tables', { description: 'List of database tables' }, async (uri) => {
|
|
100
100
|
const state = (await bridge.request(BRIDGE_METHODS.GET_STATE));
|
|
101
101
|
const tables = state?.database?.tables ?? [];
|
|
102
102
|
return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(tables, null, 2) }] };
|
|
103
103
|
});
|
|
104
|
-
server.resource('table-data', new ResourceTemplate('
|
|
104
|
+
server.resource('table-data', new ResourceTemplate('sp00ky://tables/{tableName}', { list: undefined }), { description: 'Contents of a specific database table' }, async (uri, variables) => {
|
|
105
105
|
const tableName = variables.tableName;
|
|
106
106
|
const result = await bridge.request(BRIDGE_METHODS.GET_TABLE_DATA, { tableName });
|
|
107
107
|
return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(result, null, 2) }] };
|
|
108
108
|
});
|
|
109
|
-
server.resource('queries', '
|
|
109
|
+
server.resource('queries', 'sp00ky://queries', { description: 'Active live queries' }, async (uri) => {
|
|
110
110
|
const state = (await bridge.request(BRIDGE_METHODS.GET_STATE));
|
|
111
111
|
const queries = state?.activeQueries ?? [];
|
|
112
112
|
return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(queries, null, 2) }] };
|
|
113
113
|
});
|
|
114
|
-
server.resource('events', '
|
|
114
|
+
server.resource('events', 'sp00ky://events', { description: 'Event history' }, async (uri) => {
|
|
115
115
|
const state = (await bridge.request(BRIDGE_METHODS.GET_STATE));
|
|
116
116
|
const events = state?.eventsHistory ?? [];
|
|
117
117
|
return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(events, null, 2) }] };
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spooky-sync/devtools-mcp",
|
|
3
|
-
"version": "0.0.1-canary.
|
|
4
|
-
"description": "MCP server for
|
|
3
|
+
"version": "0.0.1-canary.29",
|
|
4
|
+
"description": "MCP server for Sp00ky Sync devtools",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"
|
|
8
|
+
"sp00ky-mcp": "./dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist"
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
19
|
-
"url": "https://github.com/mono424/
|
|
19
|
+
"url": "https://github.com/mono424/sp00ky.git",
|
|
20
20
|
"directory": "apps/devtools-mcp"
|
|
21
21
|
},
|
|
22
22
|
"publishConfig": {
|