UNPKG

ai-debug-local-mcp

Version:

🎯 ENHANCED AI GUIDANCE v4.1.2: Dramatically improved tool descriptions help AI users choose the right tools instead of 'close enough' options. Ultra-fast keyboard automation (10x speed), universal recording, multi-ecosystem debugging support, and compreh

183 lines • 6.98 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { chromium } from 'playwright'; import { nanoid } from 'nanoid'; export class MinimalDebugServer { server; sessions = new Map(); constructor() { this.server = new Server({ name: 'ai-debug-local', version: '1.0.0', }); this.setupToolHandlers(); } setupToolHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: 'inject_debugging', description: 'Inject debugging into a web application', inputSchema: { type: 'object', properties: { url: { type: 'string', description: 'URL of the web application' }, headless: { type: 'boolean', description: 'Run browser in headless mode', default: false } }, required: ['url'] } }, { name: 'take_screenshot', description: 'Take a screenshot of the current page', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Debug session ID' }, fullPage: { type: 'boolean', description: 'Capture full page', default: true } }, required: ['sessionId'] } }, { name: 'close_session', description: 'Close debugging session', inputSchema: { type: 'object', properties: { sessionId: { type: 'string', description: 'Debug session ID' } }, required: ['sessionId'] } } ] }; }); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { try { switch (request.params.name) { case 'inject_debugging': return await this.injectDebugging(request.params.arguments); case 'take_screenshot': return await this.takeScreenshot(request.params.arguments); case 'close_session': return await this.closeSession(request.params.arguments); default: throw new Error(`Unknown tool: ${request.params.name}`); } } catch (error) { return { content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }] }; } }); } async injectDebugging(args) { const { url, headless = false } = args; const sessionId = nanoid(); try { const browser = await chromium.launch({ headless, devtools: !headless }); const page = await browser.newPage(); await page.goto(url, { waitUntil: 'networkidle' }); const session = { id: sessionId, browser, page, url, framework: 'unknown', startTime: new Date() }; this.sessions.set(sessionId, session); return { content: [{ type: 'text', text: `✅ Debugging session started!\n\nSession ID: ${sessionId}\nURL: ${url}\n\nThe browser is now connected. You can:\n- Take screenshots\n- Close the session when done` }] }; } catch (error) { throw new Error(`Failed to start debugging: ${error instanceof Error ? error.message : error}`); } } async takeScreenshot(args) { const { sessionId, fullPage = true } = args; const session = this.sessions.get(sessionId); if (!session) { throw new Error(`Session ${sessionId} not found`); } try { const screenshot = await session.page.screenshot({ fullPage, type: 'png' }); return { content: [{ type: 'image', data: screenshot.toString('base64'), mimeType: 'image/png' }] }; } catch (error) { throw new Error(`Failed to take screenshot: ${error instanceof Error ? error.message : error}`); } } async closeSession(args) { const { sessionId } = args; const session = this.sessions.get(sessionId); if (!session) { throw new Error(`Session ${sessionId} not found`); } try { await session.browser.close(); this.sessions.delete(sessionId); return { content: [{ type: 'text', text: `✅ Session ${sessionId} closed successfully.` }] }; } catch (error) { throw new Error(`Failed to close session: ${error instanceof Error ? error.message : error}`); } } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); } } // Start server const server = new MinimalDebugServer(); server.run().catch((error) => { console.error('Server error:', error); process.exit(1); }); //# sourceMappingURL=minimal-server.js.map