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