UNPKG

vscode-mcp-comprehensive

Version:

Comprehensive MCP server exposing all VSCode features to AI agents with 101 tools including advanced debugging and console access

156 lines 5.29 kB
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 * as vscode from 'vscode'; export class VSCodeMCPServer { constructor() { this.tools = new Map(); this.toolHandlers = new Map(); this.isRunning = false; this.server = new Server({ name: 'vscode-mcp-server', version: '1.0.0', }, { capabilities: { tools: {}, }, }); this.setupHandlers(); } setupHandlers() { // List tools handler this.server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: Array.from(this.tools.values()), }; }); // Call tool handler this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; const handler = this.toolHandlers.get(name); if (!handler) { throw new Error(`Unknown tool: ${name}`); } try { const result = await handler(args || {}); return { content: result.content, isError: result.isError, }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [ { type: 'text', text: `Error executing tool ${name}: ${errorMessage}`, }, ], isError: true, }; } }); } registerTool(name, description, inputSchema, handler) { const tool = { name, description, inputSchema, }; this.tools.set(name, tool); this.toolHandlers.set(name, handler); } async start() { if (this.isRunning) { return; } try { const transport = new StdioServerTransport(); await this.server.connect(transport); this.isRunning = true; vscode.window.showInformationMessage('VSCode MCP Server started successfully'); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); vscode.window.showErrorMessage(`Failed to start MCP Server: ${errorMessage}`); throw error; } } async stop() { if (!this.isRunning) { return; } try { await this.server.close(); this.isRunning = false; vscode.window.showInformationMessage('VSCode MCP Server stopped'); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); vscode.window.showErrorMessage(`Failed to stop MCP Server: ${errorMessage}`); throw error; } } isServerRunning() { return this.isRunning; } getRegisteredTools() { return Array.from(this.tools.keys()); } // Utility method to create standardized success responses createSuccessResponse(data, message) { return { content: [ { type: 'text', text: message || JSON.stringify(data, null, 2), }, ], }; } // Utility method to create standardized error responses createErrorResponse(error) { const errorMessage = error instanceof Error ? error.message : error; return { content: [ { type: 'text', text: `Error: ${errorMessage}`, }, ], isError: true, }; } // Utility method to validate required parameters validateRequiredParams(args, requiredParams) { for (const param of requiredParams) { if (args[param] === undefined || args[param] === null) { throw new Error(`Missing required parameter: ${param}`); } } } // Utility method to convert VSCode Position to our Position type convertPosition(position) { return { line: position.line, character: position.character, }; } // Utility method to convert VSCode Range to our Range type convertRange(range) { return { start: this.convertPosition(range.start), end: this.convertPosition(range.end), }; } // Utility method to convert our Position type to VSCode Position toVSCodePosition(position) { return new vscode.Position(position.line, position.character); } // Utility method to convert our Range type to VSCode Range toVSCodeRange(range) { return new vscode.Range(this.toVSCodePosition(range.start), this.toVSCodePosition(range.end)); } } //# sourceMappingURL=mcpServer.js.map