UNPKG

vscode-mcp-comprehensive

Version:

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

160 lines 7.8 kB
import * as assert from 'assert'; import * as vscode from 'vscode'; import { VSCodeMCPServer } from '../../mcpServer'; import { WorkspaceTools } from '../../tools/workspaceTools'; import { EditorTools } from '../../tools/editorTools'; import { LanguageTools } from '../../tools/languageTools'; import { UITools } from '../../tools/uiTools'; import { TerminalTools } from '../../tools/terminalTools'; import { DebugTools } from '../../tools/debugTools'; suite('VSCode MCP Server Extension Test Suite', () => { let mcpServer; suiteSetup(async () => { // Ensure the extension is activated const extension = vscode.extensions.getExtension('vscode-mcp.vscode-mcp-server'); if (extension && !extension.isActive) { await extension.activate(); } }); setup(() => { mcpServer = new VSCodeMCPServer(); }); teardown(async () => { if (mcpServer?.isServerRunning()) { await mcpServer.stop(); } }); test('MCP Server can be created', () => { assert.ok(mcpServer); assert.strictEqual(mcpServer.isServerRunning(), false); }); test('MCP Server can register tools', () => { const initialToolCount = mcpServer.getRegisteredTools().length; mcpServer.registerTool('test_tool', 'Test tool description', { type: 'object', properties: { param: { type: 'string' } } }, async () => ({ content: [{ type: 'text', text: 'test' }] })); const newToolCount = mcpServer.getRegisteredTools().length; assert.strictEqual(newToolCount, initialToolCount + 1); assert.ok(mcpServer.getRegisteredTools().includes('test_tool')); }); test('Workspace tools are registered', () => { new WorkspaceTools(mcpServer); const tools = mcpServer.getRegisteredTools(); assert.ok(tools.includes('workspace_get_folders')); assert.ok(tools.includes('workspace_read_file')); assert.ok(tools.includes('workspace_write_file')); assert.ok(tools.includes('workspace_get_configuration')); }); test('Editor tools are registered', () => { new EditorTools(mcpServer); const tools = mcpServer.getRegisteredTools(); assert.ok(tools.includes('editor_get_active')); assert.ok(tools.includes('editor_get_text')); assert.ok(tools.includes('editor_set_text')); assert.ok(tools.includes('editor_insert_text')); }); test('Language tools are registered', () => { new LanguageTools(mcpServer); const tools = mcpServer.getRegisteredTools(); assert.ok(tools.includes('language_get_completions')); assert.ok(tools.includes('language_get_hover')); assert.ok(tools.includes('language_get_definition')); assert.ok(tools.includes('language_get_diagnostics')); }); test('UI tools are registered', () => { new UITools(mcpServer); const tools = mcpServer.getRegisteredTools(); assert.ok(tools.includes('ui_show_information_message')); assert.ok(tools.includes('ui_show_input_box')); assert.ok(tools.includes('ui_create_status_bar_item')); }); test('Terminal tools are registered', () => { new TerminalTools(mcpServer); const tools = mcpServer.getRegisteredTools(); assert.ok(tools.includes('terminal_create')); assert.ok(tools.includes('terminal_send_text')); assert.ok(tools.includes('terminal_get_all')); }); test('Debug tools are registered', () => { new DebugTools(mcpServer); const tools = mcpServer.getRegisteredTools(); assert.ok(tools.includes('debug_start_session')); assert.ok(tools.includes('debug_add_breakpoint')); assert.ok(tools.includes('debug_console_read')); assert.ok(tools.includes('debug_get_call_stack')); assert.ok(tools.includes('devtools_console_read')); }); test('Utility methods work correctly', () => { const position = { line: 10, character: 5 }; const vscodePosition = mcpServer.toVSCodePosition(position); assert.strictEqual(vscodePosition.line, 10); assert.strictEqual(vscodePosition.character, 5); const convertedBack = mcpServer.convertPosition(vscodePosition); assert.deepStrictEqual(convertedBack, position); }); test('Error responses are created correctly', () => { const errorResponse = mcpServer.createErrorResponse('Test error'); assert.strictEqual(errorResponse.isError, true); assert.strictEqual(errorResponse.content.length, 1); assert.strictEqual(errorResponse.content[0].type, 'text'); assert.ok(errorResponse.content[0].text.includes('Test error')); }); test('Success responses are created correctly', () => { const data = { test: 'value' }; const successResponse = mcpServer.createSuccessResponse(data, 'Test message'); assert.strictEqual(successResponse.isError, undefined); assert.strictEqual(successResponse.content.length, 1); assert.strictEqual(successResponse.content[0].type, 'text'); assert.ok(successResponse.content[0].text.includes('Test message') || successResponse.content[0].text.includes(JSON.stringify(data))); }); test('Parameter validation works', () => { assert.throws(() => { mcpServer.validateRequiredParams({}, ['required_param']); }, /Missing required parameter: required_param/); assert.throws(() => { mcpServer.validateRequiredParams({ param: null }, ['param']); }, /Missing required parameter: param/); // Should not throw mcpServer.validateRequiredParams({ param: 'value' }, ['param']); mcpServer.validateRequiredParams({ param1: 'value1', param2: 'value2' }, ['param1', 'param2']); }); test('All tool categories register expected number of tools', () => { // Initialize all tool categories new WorkspaceTools(mcpServer); new EditorTools(mcpServer); new LanguageTools(mcpServer); new UITools(mcpServer); new TerminalTools(mcpServer); new DebugTools(mcpServer); const tools = mcpServer.getRegisteredTools(); // Should have 80+ tools as specified in the plan assert.ok(tools.length >= 80, `Expected at least 80 tools, got ${tools.length}`); // Check that we have tools from each category const categories = ['workspace', 'editor', 'language', 'ui', 'terminal', 'debug']; categories.forEach(category => { const categoryTools = tools.filter(tool => tool.startsWith(category + '_')); assert.ok(categoryTools.length > 0, `No tools found for category: ${category}`); }); }); test('Extension commands are registered', async () => { const commands = await vscode.commands.getCommands(); assert.ok(commands.includes('vscode-mcp-server.start')); assert.ok(commands.includes('vscode-mcp-server.stop')); assert.ok(commands.includes('vscode-mcp-server.restart')); assert.ok(commands.includes('vscode-mcp-server.status')); assert.ok(commands.includes('vscode-mcp-server.listTools')); }); test('Configuration is read correctly', () => { const config = vscode.workspace.getConfiguration('vscode-mcp-server'); // Test default values assert.strictEqual(typeof config.get('port'), 'number'); assert.strictEqual(typeof config.get('autoStart'), 'boolean'); assert.strictEqual(typeof config.get('enableDebugTools'), 'boolean'); assert.strictEqual(typeof config.get('enableDeveloperTools'), 'boolean'); }); }); //# sourceMappingURL=extension.test.js.map