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
JavaScript
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