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