localpov 0.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 +309 -0
- package/bin/localpov-mcp.js +15 -0
- package/bin/localpov.js +599 -0
- package/dashboard/index.html +909 -0
- package/dist/collectors/browser-capture.d.ts +124 -0
- package/dist/collectors/browser-capture.js +327 -0
- package/dist/collectors/browser-capture.js.map +1 -0
- package/dist/collectors/build-parser.d.ts +18 -0
- package/dist/collectors/build-parser.js +192 -0
- package/dist/collectors/build-parser.js.map +1 -0
- package/dist/collectors/docker-watcher.d.ts +42 -0
- package/dist/collectors/docker-watcher.js +101 -0
- package/dist/collectors/docker-watcher.js.map +1 -0
- package/dist/collectors/terminal.d.ts +42 -0
- package/dist/collectors/terminal.js +128 -0
- package/dist/collectors/terminal.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +466 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/utils/inject.d.ts +11 -0
- package/dist/utils/inject.js +241 -0
- package/dist/utils/inject.js.map +1 -0
- package/dist/utils/network.d.ts +7 -0
- package/dist/utils/network.js +42 -0
- package/dist/utils/network.js.map +1 -0
- package/dist/utils/proxy.d.ts +24 -0
- package/dist/utils/proxy.js +363 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/scanner.d.ts +9 -0
- package/dist/utils/scanner.js +96 -0
- package/dist/utils/scanner.js.map +1 -0
- package/dist/utils/session-manager.d.ts +109 -0
- package/dist/utils/session-manager.js +488 -0
- package/dist/utils/session-manager.js.map +1 -0
- package/dist/utils/shell-init.d.ts +26 -0
- package/dist/utils/shell-init.js +422 -0
- package/dist/utils/shell-init.js.map +1 -0
- package/dist/utils/system-info.d.ts +51 -0
- package/dist/utils/system-info.js +170 -0
- package/dist/utils/system-info.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,466 @@
|
|
|
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
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
7
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const os_1 = __importDefault(require("os"));
|
|
12
|
+
const session_manager_1 = require("./utils/session-manager");
|
|
13
|
+
const browser_capture_1 = require("./collectors/browser-capture");
|
|
14
|
+
const build_parser_1 = require("./collectors/build-parser");
|
|
15
|
+
const system_info_1 = require("./utils/system-info");
|
|
16
|
+
const docker_watcher_1 = require("./collectors/docker-watcher");
|
|
17
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'package.json'), 'utf8'));
|
|
18
|
+
// ── Instances ──
|
|
19
|
+
const sessions = new session_manager_1.SessionManager();
|
|
20
|
+
const browser = new browser_capture_1.BrowserCapture();
|
|
21
|
+
// ── Output size safety ──
|
|
22
|
+
const MAX_OUTPUT_BYTES = 50 * 1024;
|
|
23
|
+
function truncate(text, maxBytes = MAX_OUTPUT_BYTES) {
|
|
24
|
+
if (Buffer.byteLength(text) <= maxBytes)
|
|
25
|
+
return text;
|
|
26
|
+
let lo = 0, hi = text.length;
|
|
27
|
+
while (lo < hi) {
|
|
28
|
+
const mid = (lo + hi + 1) >> 1;
|
|
29
|
+
if (Buffer.byteLength(text.slice(0, mid)) <= maxBytes - 100)
|
|
30
|
+
lo = mid;
|
|
31
|
+
else
|
|
32
|
+
hi = mid - 1;
|
|
33
|
+
}
|
|
34
|
+
return text.slice(0, lo) + '\n\n[... output truncated. Use offset/limit params to paginate.]';
|
|
35
|
+
}
|
|
36
|
+
function textResult(data) {
|
|
37
|
+
const text = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
|
|
38
|
+
return { content: [{ type: 'text', text: truncate(text) }] };
|
|
39
|
+
}
|
|
40
|
+
function errorResult(msg) {
|
|
41
|
+
return { content: [{ type: 'text', text: String(msg) }], isError: true };
|
|
42
|
+
}
|
|
43
|
+
// ── MCP Server ──
|
|
44
|
+
const server = new mcp_js_1.McpServer({
|
|
45
|
+
name: 'localpov',
|
|
46
|
+
version: pkg.version,
|
|
47
|
+
});
|
|
48
|
+
// ────────────────────────────────────────────────────────────
|
|
49
|
+
// TOOL: get_diagnostics
|
|
50
|
+
// ────────────────────────────────────────────────────────────
|
|
51
|
+
server.registerTool('get_diagnostics', {
|
|
52
|
+
title: 'Development Environment Health Check',
|
|
53
|
+
description: 'Complete development environment health check. Call this FIRST to understand what is happening. Returns terminal errors, browser console errors, network failures, port status, and process health in a single response.',
|
|
54
|
+
inputSchema: zod_1.z.object({}),
|
|
55
|
+
annotations: {
|
|
56
|
+
readOnlyHint: true,
|
|
57
|
+
destructiveHint: false,
|
|
58
|
+
idempotentHint: true,
|
|
59
|
+
openWorldHint: false,
|
|
60
|
+
},
|
|
61
|
+
}, async () => {
|
|
62
|
+
const termDiag = sessions.getDiagnostics();
|
|
63
|
+
browser.loadFromDisk();
|
|
64
|
+
const browserSummary = browser.getSummary();
|
|
65
|
+
const ports = await (0, system_info_1.checkPorts)();
|
|
66
|
+
const health = (0, system_info_1.getProcessHealth)();
|
|
67
|
+
const docker = (0, docker_watcher_1.dockerSummary)();
|
|
68
|
+
const parts = [];
|
|
69
|
+
if (termDiag.errors.total > 0)
|
|
70
|
+
parts.push(`${termDiag.errors.total} terminal error(s)`);
|
|
71
|
+
if (browserSummary.console.errors > 0)
|
|
72
|
+
parts.push(`${browserSummary.console.errors} browser console error(s)`);
|
|
73
|
+
if (browserSummary.console.warnings > 0)
|
|
74
|
+
parts.push(`${browserSummary.console.warnings} browser warning(s)`);
|
|
75
|
+
if (browserSummary.network.failed > 0)
|
|
76
|
+
parts.push(`${browserSummary.network.failed} failed network request(s)`);
|
|
77
|
+
if (browserSummary.network.slow > 0)
|
|
78
|
+
parts.push(`${browserSummary.network.slow} slow request(s)`);
|
|
79
|
+
if (ports.down.length > 0)
|
|
80
|
+
parts.push(`ports down: ${ports.down.join(', ')}`);
|
|
81
|
+
if (parts.length === 0)
|
|
82
|
+
parts.push('All clear — no errors detected');
|
|
83
|
+
return textResult({
|
|
84
|
+
summary: parts.join('. ') + '.',
|
|
85
|
+
terminal: {
|
|
86
|
+
activeSessions: termDiag.sessions.active,
|
|
87
|
+
totalSessions: termDiag.sessions.total,
|
|
88
|
+
errors: termDiag.errors.items.slice(0, 10),
|
|
89
|
+
crashed: termDiag.crashed,
|
|
90
|
+
},
|
|
91
|
+
browser: browserSummary,
|
|
92
|
+
ports: { up: ports.up, down: ports.down },
|
|
93
|
+
docker: { available: docker.available, running: docker.running || 0 },
|
|
94
|
+
system: {
|
|
95
|
+
memory: health.system.memoryUsage,
|
|
96
|
+
load: health.system.loadAvg,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ────────────────────────────────────────────────────────────
|
|
101
|
+
// TOOL: list_sessions
|
|
102
|
+
// ────────────────────────────────────────────────────────────
|
|
103
|
+
server.registerTool('list_sessions', {
|
|
104
|
+
title: 'List Terminal Sessions',
|
|
105
|
+
description: 'List all captured terminal sessions. Shows PIDs, shells, working directories, and alive/dead status. Use a PID with read_terminal to see output.',
|
|
106
|
+
inputSchema: zod_1.z.object({}),
|
|
107
|
+
annotations: {
|
|
108
|
+
readOnlyHint: true,
|
|
109
|
+
destructiveHint: false,
|
|
110
|
+
idempotentHint: true,
|
|
111
|
+
openWorldHint: false,
|
|
112
|
+
},
|
|
113
|
+
}, async () => {
|
|
114
|
+
return textResult(sessions.listSessions());
|
|
115
|
+
});
|
|
116
|
+
// ────────────────────────────────────────────────────────────
|
|
117
|
+
// TOOL: read_terminal
|
|
118
|
+
// ────────────────────────────────────────────────────────────
|
|
119
|
+
server.registerTool('read_terminal', {
|
|
120
|
+
title: 'Read Terminal Output',
|
|
121
|
+
description: 'Read the last N lines of a terminal session. Use list_sessions first to get PIDs. Output is capped at 50KB — use offset to paginate large sessions.',
|
|
122
|
+
inputSchema: zod_1.z.object({
|
|
123
|
+
pid: zod_1.z.coerce.number().describe('Process ID of the terminal session'),
|
|
124
|
+
lines: zod_1.z.coerce.number().optional().default(100).describe('Number of lines to read (default: 100, max: 500)'),
|
|
125
|
+
offset: zod_1.z.coerce.number().optional().default(0).describe('Skip this many lines from end before reading (for pagination)'),
|
|
126
|
+
}),
|
|
127
|
+
annotations: {
|
|
128
|
+
readOnlyHint: true,
|
|
129
|
+
destructiveHint: false,
|
|
130
|
+
idempotentHint: true,
|
|
131
|
+
openWorldHint: false,
|
|
132
|
+
},
|
|
133
|
+
}, async ({ pid, lines, offset }) => {
|
|
134
|
+
const cappedLines = Math.min(lines || 100, 500);
|
|
135
|
+
const result = sessions.readSession(pid, { lines: cappedLines + (offset || 0) });
|
|
136
|
+
if (result.error)
|
|
137
|
+
return errorResult(result.error);
|
|
138
|
+
const outputLines = offset > 0
|
|
139
|
+
? result.lines.slice(0, -offset || undefined)
|
|
140
|
+
: result.lines;
|
|
141
|
+
return textResult({
|
|
142
|
+
pid: result.pid,
|
|
143
|
+
lineCount: outputLines.length,
|
|
144
|
+
output: outputLines.join('\n'),
|
|
145
|
+
recentCommands: result.commands.slice(-5),
|
|
146
|
+
hasMore: result.lineCount >= cappedLines + (offset || 0),
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
// ────────────────────────────────────────────────────────────
|
|
150
|
+
// TOOL: read_command
|
|
151
|
+
// ────────────────────────────────────────────────────────────
|
|
152
|
+
server.registerTool('read_command', {
|
|
153
|
+
title: 'Read Command Output',
|
|
154
|
+
description: 'Read the output of a specific command from a terminal session. Use index -1 for the last command, -2 for second-to-last, etc.',
|
|
155
|
+
inputSchema: zod_1.z.object({
|
|
156
|
+
pid: zod_1.z.coerce.number().describe('Process ID of the terminal session'),
|
|
157
|
+
index: zod_1.z.coerce.number().optional().default(-1).describe('Command index (0=first, -1=last, -2=second-to-last)'),
|
|
158
|
+
}),
|
|
159
|
+
annotations: {
|
|
160
|
+
readOnlyHint: true,
|
|
161
|
+
destructiveHint: false,
|
|
162
|
+
idempotentHint: true,
|
|
163
|
+
openWorldHint: false,
|
|
164
|
+
},
|
|
165
|
+
}, async ({ pid, index }) => {
|
|
166
|
+
const result = sessions.readCommand(pid, index);
|
|
167
|
+
if (result.error)
|
|
168
|
+
return errorResult(result.error);
|
|
169
|
+
return textResult(result);
|
|
170
|
+
});
|
|
171
|
+
// ────────────────────────────────────────────────────────────
|
|
172
|
+
// TOOL: get_errors
|
|
173
|
+
// ────────────────────────────────────────────────────────────
|
|
174
|
+
server.registerTool('get_errors', {
|
|
175
|
+
title: 'Find Terminal Errors',
|
|
176
|
+
description: 'Find errors across all captured terminal sessions. Detects JS, TS, Python, Rust, Go, and generic error patterns. Returns up to 20 most recent errors.',
|
|
177
|
+
inputSchema: zod_1.z.object({
|
|
178
|
+
since: zod_1.z.coerce.number().optional().describe('Only errors after this Unix timestamp in milliseconds'),
|
|
179
|
+
}),
|
|
180
|
+
annotations: {
|
|
181
|
+
readOnlyHint: true,
|
|
182
|
+
destructiveHint: false,
|
|
183
|
+
idempotentHint: true,
|
|
184
|
+
openWorldHint: false,
|
|
185
|
+
},
|
|
186
|
+
}, async ({ since }) => {
|
|
187
|
+
const errors = sessions.getErrors({ since });
|
|
188
|
+
return textResult({ total: errors.length, errors: errors.slice(0, 20) });
|
|
189
|
+
});
|
|
190
|
+
// ────────────────────────────────────────────────────────────
|
|
191
|
+
// TOOL: search_all
|
|
192
|
+
// ────────────────────────────────────────────────────────────
|
|
193
|
+
server.registerTool('search_all', {
|
|
194
|
+
title: 'Search Terminal Sessions',
|
|
195
|
+
description: 'Search for a regex pattern across all captured terminal sessions. Returns matching lines with context.',
|
|
196
|
+
inputSchema: zod_1.z.object({
|
|
197
|
+
pattern: zod_1.z.string().max(200).describe('Regex pattern to search for (max 200 chars)'),
|
|
198
|
+
max_results: zod_1.z.coerce.number().optional().default(20).describe('Maximum results to return (default: 20, max: 50)'),
|
|
199
|
+
}),
|
|
200
|
+
annotations: {
|
|
201
|
+
readOnlyHint: true,
|
|
202
|
+
destructiveHint: false,
|
|
203
|
+
idempotentHint: false,
|
|
204
|
+
openWorldHint: false,
|
|
205
|
+
},
|
|
206
|
+
}, async ({ pattern, max_results }) => {
|
|
207
|
+
const capped = Math.min(max_results || 20, 50);
|
|
208
|
+
const result = sessions.searchAll(pattern, { maxResults: capped });
|
|
209
|
+
if (result.error)
|
|
210
|
+
return errorResult(result.error);
|
|
211
|
+
return textResult(result);
|
|
212
|
+
});
|
|
213
|
+
// ────────────────────────────────────────────────────────────
|
|
214
|
+
// TOOL: read_browser
|
|
215
|
+
// ────────────────────────────────────────────────────────────
|
|
216
|
+
server.registerTool('read_browser', {
|
|
217
|
+
title: 'Read Browser Console & Network',
|
|
218
|
+
description: 'Read browser console logs and/or network requests captured via LocalPOV proxy injection. Requires `localpov` proxy running with a browser connected. Set source to "console" for JS errors/warnings, "network" for HTTP requests, or "all" for both.',
|
|
219
|
+
inputSchema: zod_1.z.object({
|
|
220
|
+
source: zod_1.z.enum(['console', 'network', 'all']).optional().default('all')
|
|
221
|
+
.describe('What to read: "console" (JS errors/logs), "network" (HTTP requests), or "all"'),
|
|
222
|
+
level: zod_1.z.enum(['error', 'warn', 'log', 'info', 'debug', 'all']).optional().default('all')
|
|
223
|
+
.describe('Console log level filter (only applies when source includes console)'),
|
|
224
|
+
errors_only: zod_1.z.boolean().optional().default(false)
|
|
225
|
+
.describe('Network: only show failed requests (4xx/5xx)'),
|
|
226
|
+
limit: zod_1.z.coerce.number().optional().default(50)
|
|
227
|
+
.describe('Max entries per source (default: 50, max: 200)'),
|
|
228
|
+
}),
|
|
229
|
+
annotations: {
|
|
230
|
+
readOnlyHint: true,
|
|
231
|
+
destructiveHint: false,
|
|
232
|
+
idempotentHint: true,
|
|
233
|
+
openWorldHint: false,
|
|
234
|
+
},
|
|
235
|
+
}, async ({ source, level, errors_only, limit }) => {
|
|
236
|
+
browser.loadFromDisk();
|
|
237
|
+
const cappedLimit = Math.min(limit || 50, 200);
|
|
238
|
+
const result = {};
|
|
239
|
+
if (source === 'console' || source === 'all') {
|
|
240
|
+
const options = { limit: cappedLimit };
|
|
241
|
+
if (level !== 'all') {
|
|
242
|
+
options.level = level === 'error' ? ['error'] : level === 'warn' ? ['error', 'warn'] : [level];
|
|
243
|
+
}
|
|
244
|
+
result.console = browser.getConsoleEntries(options);
|
|
245
|
+
}
|
|
246
|
+
if (source === 'network' || source === 'all') {
|
|
247
|
+
result.network = browser.getNetworkEntries({ errorsOnly: errors_only, limit: cappedLimit });
|
|
248
|
+
}
|
|
249
|
+
return textResult(result);
|
|
250
|
+
});
|
|
251
|
+
// ────────────────────────────────────────────────────────────
|
|
252
|
+
// TOOL: take_screenshot
|
|
253
|
+
// ────────────────────────────────────────────────────────────
|
|
254
|
+
server.registerTool('take_screenshot', {
|
|
255
|
+
title: 'Browser Screenshot',
|
|
256
|
+
description: 'Get a screenshot of the browser viewport. Returns the most recent screenshot captured via LocalPOV proxy. Requires proxy running and a browser connected.',
|
|
257
|
+
inputSchema: zod_1.z.object({}),
|
|
258
|
+
annotations: {
|
|
259
|
+
readOnlyHint: true,
|
|
260
|
+
destructiveHint: false,
|
|
261
|
+
idempotentHint: false,
|
|
262
|
+
openWorldHint: false,
|
|
263
|
+
},
|
|
264
|
+
}, async () => {
|
|
265
|
+
browser.loadFromDisk();
|
|
266
|
+
const existing = browser.getScreenshot();
|
|
267
|
+
if (existing && existing.age < 30000) {
|
|
268
|
+
return {
|
|
269
|
+
content: [{
|
|
270
|
+
type: 'image',
|
|
271
|
+
data: existing.data.replace(/^data:image\/\w+;base64,/, ''),
|
|
272
|
+
mimeType: 'image/jpeg',
|
|
273
|
+
}],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return errorResult('No recent screenshot available. Ensure LocalPOV proxy is running (`localpov --port 3000`) and a browser is open.');
|
|
277
|
+
});
|
|
278
|
+
// ────────────────────────────────────────────────────────────
|
|
279
|
+
// TOOL: get_build_errors
|
|
280
|
+
// ────────────────────────────────────────────────────────────
|
|
281
|
+
server.registerTool('get_build_errors', {
|
|
282
|
+
title: 'Structured Build Errors',
|
|
283
|
+
description: 'Parse structured build errors from terminal sessions. Returns {file, line, col, message} for each error. Supports TypeScript, ESLint, Webpack, Vite, Rust, Go, Python.',
|
|
284
|
+
inputSchema: zod_1.z.object({
|
|
285
|
+
pid: zod_1.z.coerce.number().optional().describe('Specific session PID (omit to scan all active sessions)'),
|
|
286
|
+
}),
|
|
287
|
+
annotations: {
|
|
288
|
+
readOnlyHint: true,
|
|
289
|
+
destructiveHint: false,
|
|
290
|
+
idempotentHint: true,
|
|
291
|
+
openWorldHint: false,
|
|
292
|
+
},
|
|
293
|
+
}, async ({ pid }) => {
|
|
294
|
+
let text = '';
|
|
295
|
+
if (pid) {
|
|
296
|
+
const result = sessions.readSession(pid, { lines: 500 });
|
|
297
|
+
if (result.error)
|
|
298
|
+
return errorResult(result.error);
|
|
299
|
+
text = result.lines.join('\n');
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
const list = sessions.listSessions().filter(s => s.alive);
|
|
303
|
+
for (const s of list) {
|
|
304
|
+
const result = sessions.readSession(s.pid, { lines: 200 });
|
|
305
|
+
if (!result.error)
|
|
306
|
+
text += result.lines.join('\n') + '\n';
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const errors = (0, build_parser_1.parse)(text);
|
|
310
|
+
return textResult({ total: errors.length, errors: errors.slice(0, 30) });
|
|
311
|
+
});
|
|
312
|
+
// ────────────────────────────────────────────────────────────
|
|
313
|
+
// TOOL: docker
|
|
314
|
+
// ────────────────────────────────────────────────────────────
|
|
315
|
+
server.registerTool('docker', {
|
|
316
|
+
title: 'Docker Containers & Logs',
|
|
317
|
+
description: 'List running Docker containers or read container logs. Omit "container" param to list all containers. Provide "container" to read its logs.',
|
|
318
|
+
inputSchema: zod_1.z.object({
|
|
319
|
+
container: zod_1.z.string().optional().describe('Container name or ID to read logs from. Omit to list all containers.'),
|
|
320
|
+
tail: zod_1.z.coerce.number().optional().default(100).describe('Number of log lines from end (default: 100, max: 500)'),
|
|
321
|
+
since: zod_1.z.string().optional().describe('Show logs since (e.g. "10m", "1h")'),
|
|
322
|
+
}),
|
|
323
|
+
annotations: {
|
|
324
|
+
readOnlyHint: true,
|
|
325
|
+
destructiveHint: false,
|
|
326
|
+
idempotentHint: true,
|
|
327
|
+
openWorldHint: false,
|
|
328
|
+
},
|
|
329
|
+
}, async ({ container, tail, since }) => {
|
|
330
|
+
if (!container) {
|
|
331
|
+
return textResult((0, docker_watcher_1.dockerSummary)());
|
|
332
|
+
}
|
|
333
|
+
const cappedTail = Math.min(tail || 100, 500);
|
|
334
|
+
const result = (0, docker_watcher_1.getContainerLogs)(container, { tail: cappedTail, since });
|
|
335
|
+
if (result.error)
|
|
336
|
+
return errorResult(result.error);
|
|
337
|
+
return textResult(result);
|
|
338
|
+
});
|
|
339
|
+
// ────────────────────────────────────────────────────────────
|
|
340
|
+
// TOOL: tail_log
|
|
341
|
+
// ────────────────────────────────────────────────────────────
|
|
342
|
+
server.registerTool('tail_log', {
|
|
343
|
+
title: 'Read Log File',
|
|
344
|
+
description: 'Read the last N lines of a log file. Restricted to files under: current working directory, ~/.localpov/, /var/log/, /tmp/. Blocks sensitive files (.ssh, .env, credentials).',
|
|
345
|
+
inputSchema: zod_1.z.object({
|
|
346
|
+
path: zod_1.z.string().describe('Absolute path to the log file'),
|
|
347
|
+
lines: zod_1.z.coerce.number().optional().default(100).describe('Number of lines from end (default: 100, max: 500)'),
|
|
348
|
+
}),
|
|
349
|
+
annotations: {
|
|
350
|
+
readOnlyHint: true,
|
|
351
|
+
destructiveHint: false,
|
|
352
|
+
idempotentHint: true,
|
|
353
|
+
openWorldHint: false,
|
|
354
|
+
},
|
|
355
|
+
}, async ({ path: filePath, lines }) => {
|
|
356
|
+
const resolved = path_1.default.resolve(filePath);
|
|
357
|
+
const normalizedLower = resolved.toLowerCase().replace(/\\/g, '/');
|
|
358
|
+
const BLOCKED = ['.ssh', '.gnupg', '.aws', '/etc/shadow', '/etc/passwd', 'credentials', 'secret', '.env'];
|
|
359
|
+
const isSensitive = BLOCKED.some(p => {
|
|
360
|
+
if (p === '.env')
|
|
361
|
+
return normalizedLower.includes(p) && !normalizedLower.endsWith('.env.example');
|
|
362
|
+
return normalizedLower.includes(p);
|
|
363
|
+
});
|
|
364
|
+
if (isSensitive)
|
|
365
|
+
return errorResult(`Blocked: '${filePath}' contains sensitive data and cannot be read.`);
|
|
366
|
+
const homeDir = os_1.default.homedir();
|
|
367
|
+
const allowed = [
|
|
368
|
+
path_1.default.resolve(process.cwd()),
|
|
369
|
+
path_1.default.resolve(path_1.default.join(homeDir, '.localpov')),
|
|
370
|
+
'/var/log',
|
|
371
|
+
'/tmp',
|
|
372
|
+
];
|
|
373
|
+
if (!allowed.some(prefix => resolved.startsWith(prefix + path_1.default.sep) || resolved === prefix)) {
|
|
374
|
+
return errorResult(`Blocked: '${filePath}' is outside allowed directories (cwd, ~/.localpov/, /var/log/, /tmp/).`);
|
|
375
|
+
}
|
|
376
|
+
const cappedLines = Math.min(lines || 100, 500);
|
|
377
|
+
const result = (0, system_info_1.tailLog)(resolved, cappedLines);
|
|
378
|
+
if (result.error)
|
|
379
|
+
return errorResult(result.error);
|
|
380
|
+
return textResult({
|
|
381
|
+
file: result.file,
|
|
382
|
+
lineCount: result.lineCount,
|
|
383
|
+
size: result.size,
|
|
384
|
+
output: result.lines.join('\n'),
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
// ────────────────────────────────────────────────────────────
|
|
388
|
+
// TOOL: check_ports
|
|
389
|
+
// ────────────────────────────────────────────────────────────
|
|
390
|
+
server.registerTool('check_ports', {
|
|
391
|
+
title: 'Check Localhost Ports',
|
|
392
|
+
description: 'Check which ports are listening on localhost. Scans common dev ports (3000, 3001, 4000, 5000, 5173, 8000, 8080, 8888) by default, or specify a custom list.',
|
|
393
|
+
inputSchema: zod_1.z.object({
|
|
394
|
+
ports: zod_1.z.array(zod_1.z.coerce.number()).optional().describe('Specific ports to check (default: common dev ports)'),
|
|
395
|
+
}),
|
|
396
|
+
annotations: {
|
|
397
|
+
readOnlyHint: true,
|
|
398
|
+
destructiveHint: false,
|
|
399
|
+
idempotentHint: true,
|
|
400
|
+
openWorldHint: false,
|
|
401
|
+
},
|
|
402
|
+
}, async ({ ports }) => {
|
|
403
|
+
return textResult(await (0, system_info_1.checkPorts)(ports));
|
|
404
|
+
});
|
|
405
|
+
// ────────────────────────────────────────────────────────────
|
|
406
|
+
// TOOL: check_env
|
|
407
|
+
// ────────────────────────────────────────────────────────────
|
|
408
|
+
server.registerTool('check_env', {
|
|
409
|
+
title: 'Check Environment Variables',
|
|
410
|
+
description: 'Check if environment variables are set. Returns ONLY existence (true/false), NEVER values — safe for secrets. Also detects .env files in the current directory.',
|
|
411
|
+
inputSchema: zod_1.z.object({
|
|
412
|
+
keys: zod_1.z.array(zod_1.z.string()).optional().describe('Env var names to check (default: DATABASE_URL, API_KEY, NODE_ENV, PORT, etc.)'),
|
|
413
|
+
check_files: zod_1.z.boolean().optional().default(true).describe('Also check for .env files in current directory'),
|
|
414
|
+
}),
|
|
415
|
+
annotations: {
|
|
416
|
+
readOnlyHint: true,
|
|
417
|
+
destructiveHint: false,
|
|
418
|
+
idempotentHint: true,
|
|
419
|
+
openWorldHint: false,
|
|
420
|
+
},
|
|
421
|
+
}, async ({ keys, check_files }) => {
|
|
422
|
+
const result = { variables: (0, system_info_1.checkEnv)(keys) };
|
|
423
|
+
if (check_files)
|
|
424
|
+
result.envFiles = (0, system_info_1.checkEnvFile)();
|
|
425
|
+
return textResult(result);
|
|
426
|
+
});
|
|
427
|
+
// ────────────────────────────────────────────────────────────
|
|
428
|
+
// TOOL: process_health
|
|
429
|
+
// ────────────────────────────────────────────────────────────
|
|
430
|
+
server.registerTool('process_health', {
|
|
431
|
+
title: 'System Resource Usage',
|
|
432
|
+
description: 'Get system resource usage: total/free memory, CPU load averages, uptime, and platform info. Useful for detecting memory leaks or resource exhaustion during development.',
|
|
433
|
+
inputSchema: zod_1.z.object({}),
|
|
434
|
+
annotations: {
|
|
435
|
+
readOnlyHint: true,
|
|
436
|
+
destructiveHint: false,
|
|
437
|
+
idempotentHint: true,
|
|
438
|
+
openWorldHint: false,
|
|
439
|
+
},
|
|
440
|
+
}, async () => {
|
|
441
|
+
return textResult((0, system_info_1.getProcessHealth)());
|
|
442
|
+
});
|
|
443
|
+
// ────────────────────────────────────────────────────────────
|
|
444
|
+
// Expose browser capture for proxy integration
|
|
445
|
+
// ────────────────────────────────────────────────────────────
|
|
446
|
+
server.browserCapture = browser;
|
|
447
|
+
// ────────────────────────────────────────────────────────────
|
|
448
|
+
// Start
|
|
449
|
+
// ────────────────────────────────────────────────────────────
|
|
450
|
+
process.on('uncaughtException', (err) => {
|
|
451
|
+
process.stderr.write(`LocalPOV MCP uncaught exception: ${err.message}\n${err.stack || ''}\n`);
|
|
452
|
+
});
|
|
453
|
+
process.on('unhandledRejection', (reason) => {
|
|
454
|
+
const msg = reason instanceof Error ? reason.message : String(reason);
|
|
455
|
+
process.stderr.write(`LocalPOV MCP unhandled rejection: ${msg}\n`);
|
|
456
|
+
});
|
|
457
|
+
async function main() {
|
|
458
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
459
|
+
await server.connect(transport);
|
|
460
|
+
sessions.cleanup();
|
|
461
|
+
}
|
|
462
|
+
main().catch((err) => {
|
|
463
|
+
process.stderr.write('LocalPOV MCP server failed to start: ' + err.message + '\n');
|
|
464
|
+
process.exit(1);
|
|
465
|
+
});
|
|
466
|
+
//# 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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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the JavaScript snippet to inject into HTML pages.
|
|
3
|
+
* This script captures:
|
|
4
|
+
* - Console output (error, warn, log, info)
|
|
5
|
+
* - Network requests (fetch + XHR) with status, timing, response bodies for errors
|
|
6
|
+
* - Unhandled errors and promise rejections
|
|
7
|
+
* - Screenshots on demand (via html2canvas or canvas capture)
|
|
8
|
+
*
|
|
9
|
+
* Sends everything to the LocalPOV server via WebSocket.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getInjectScript(wsUrl: string): string;
|