Skip to main content
Glama
Sukarth
by Sukarth

VSCode Automation MCP Server

npm version License: MIT

A Model Context Protocol (MCP) server that enables AI agents to automate and control VSCode: give your AI assistant the ability to interact with the VSCode UI, execute commands, inspect the DOM, read editor content, and perform complex automation workflows.

Built on top of vscode-extension-tester, this mcp server is ideal for:

  • AI-assisted VSCode extension development - Let AI agents test and interact with your extensions

  • Automated UI testing - Build automation scripts driven by AI

  • Development workflow automation - Automate repetitive VSCode tasks

  • Extension debugging - Inspect UI state, DOM structure, and diagnostics

šŸš€ Features

  • DOM Inspection - Get the full DOM structure, UI regions, and accessibility tree for AI understanding

  • Execute VSCode Commands - Run any command from the Command Palette programmatically

  • UI Automation - Click elements, type text, navigate the UI

  • Keyboard Input - Press key combinations, shortcuts, and special keys

  • File Operations - Open files at specific lines and columns

  • Screenshots - Capture the VSCode window for debugging and verification

  • Element Inspection - Get detailed information about UI elements

  • Element Queries - Find multiple elements matching selectors with attributes

  • JavaScript Execution - Run arbitrary JS in the VSCode window (like DevTools console)

  • Diagnostics - Access errors and warnings from the Problems panel

  • Editor Content - Read and verify editor content

  • Webview Support - Interact with extension webviews

  • Wait & Synchronization - Wait for elements, text, or idle state

  • Notifications - Get, dismiss, and handle notifications

  • Dialogs - Handle InputBox, QuickPick, and confirmation dialogs

  • IntelliSense - Trigger completions, get items, select suggestions

  • Code Navigation - Go to definition, hover tooltips, signature help

  • Context Menus - Open and interact with context menus

  • Output Channels - Read from VSCode output channels and extension logs

  • Console Logs - Capture and filter browser console logs

  • Performance Metrics - Memory usage, DOM stats, timing info

šŸ“‹ Requirements

  • Node.js >= 18.0.0

  • Internet connection (for first run to download VSCode and ChromeDriver)

Note: The server automatically downloads a standalone VSCode instance and matching ChromeDriver on first run. It does NOT use your installed VSCode - this ensures consistent behavior and prevents conflicts with your main VSCode instance.

šŸ“¦ Installation

No installation required! Just add to your MCP client configuration:

{
  "mcpServers": {
    "vscode-automation": {
      "command": "npx",
      "args": ["-y", "vscode-automation-mcp@latest"]
    }
  }
}

Global Installation

npm install -g vscode-automation-mcp@latest

Then run directly:

vscode-automation-mcp

From Source

git clone https://github.com/sukarth/vscode-automation-mcp.git
cd vscode-automation-mcp
npm install
npm run build
npm start

āš™ļø Configuration

Claude Desktop

Add to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "vscode-automation": {
      "command": "npx",
      "args": ["-y", "vscode-automation-mcp@latest"]
    }
  }
}

Or if installed globally:

{
  "mcpServers": {
    "vscode-automation": {
      "command": "vscode-automation-mcp"
    }
  }
}

VSCode (GitHub Copilot / Copilot Chat)

Add to your VSCode settings.json or .vscode/mcp.json:

{
  "mcp": {
    "servers": {
      "vscode-automation": {
        "command": "npx",
        "args": ["-y", "vscode-automation-mcp@latest"]
      }
    }
  }
}

Cursor

Add to Cursor's MCP configuration:

{
  "mcpServers": {
    "vscode-automation": {
      "command": "npx",
      "args": ["-y", "vscode-automation-mcp@latest"]
    }
  }
}

Environment Variables

You can customize the server behavior using environment variables:

Variable

Description

Default

VSCODE_AUTOMATION_VERSION

VSCode version to download (e.g., 1.95.0, 1.85.0, or latest)

latest

VSCODE_AUTOMATION_STORAGE_PATH

Directory to store VSCode and ChromeDriver

System temp dir

VSCODE_AUTOMATION_OFFLINE

Set to true to use cached binaries only

false

VSCODE_AUTOMATION_LOG_LEVEL

Log level: trace, debug, info, warn, error

info

Example with environment variables:

{
  "mcpServers": {
    "vscode-automation": {
      "command": "npx",
      "args": ["-y", "vscode-automation-mcp@latest"],
      "env": {
        "VSCODE_AUTOMATION_VERSION": "1.95.0",
        "VSCODE_AUTOMATION_STORAGE_PATH": "/path/to/storage"
      }
    }
  }
}

ChromeDriver Compatibility: The server automatically downloads the correct ChromeDriver version that matches the VSCode/Electron version. You don't need to manage ChromeDriver manually.

šŸ› ļø Available Tools

Command Tools

Tool

Description

vscode_execute_command

Execute any VSCode command with optional arguments

vscode_list_commands

List available VSCode commands with optional filter

UI Action Tools

Tool

Description

vscode_click_element

Click a UI element by CSS/XPath/accessibility selector

vscode_type_text

Type text into an input field or focused element

vscode_open_file

Open a file in the editor at a specific line/column

Inspection Tools

Tool

Description

vscode_take_screenshot

Capture a screenshot of the VSCode window

vscode_get_element

Get properties and text of a UI element

vscode_open_webview

Open an extension's webview panel

vscode_get_diagnostics

Get all diagnostic messages from Problems panel

DOM Inspection Tools

Tool

Description

vscode_get_dom

Get the full DOM structure of VSCode in tree, HTML, or JSON format

vscode_get_ui_structure

Get structure of specific UI regions (sidebar, editor, panel, etc.)

vscode_query_elements

Find all elements matching a CSS selector with attributes

vscode_get_accessibility_tree

Get the semantic accessibility tree with ARIA roles and labels

DOM Navigation Tools

Tool

Description

vscode_get_element_children

Get direct children or descendants of an element for incremental exploration

vscode_get_element_parents

Get the parent chain (ancestors) of an element

vscode_get_element_siblings

Get sibling elements at the same level

vscode_find_interactive_elements

Find all buttons, inputs, links, tabs within a container

vscode_search_dom

Search DOM by text, ID, class, aria-label, title, or role

vscode_dump_dom_to_file

Dump full DOM to a file for incremental exploration by AI

JavaScript Execution & DOM Query Tools

Tool

Description

vscode_execute_script

Execute arbitrary JavaScript in the VSCode window (like DevTools console)

vscode_query_selector

Direct document.querySelector() / querySelectorAll() wrapper

vscode_get_element_by_id

Get element by ID (document.getElementById wrapper)

vscode_get_elements_by_class

Get elements by class name (document.getElementsByClassName wrapper)

vscode_get_elements_by_tag

Get elements by tag name (document.getElementsByTagName wrapper)

Testing Tools

Tool

Description

vscode_get_editor_content

Get the current editor's text content

vscode_verify_element

Verify UI element presence and state

vscode_assert_text

Assert text content in editor or elements

vscode_check_file_open

Check if a specific file is open

Keyboard & Input Tools

Tool

Description

vscode_press_keys

Press keyboard keys or key combinations (Ctrl+S, Ctrl+Shift+P, Enter, Escape, etc.)

vscode_focus_element

Focus a UI element by CSS selector

vscode_scroll

Scroll an element in a direction or to top/bottom

vscode_drag_drop

Drag and drop between elements

vscode_hover

Hover over an element for a duration

Wait & Sync Tools

Tool

Description

vscode_wait_for_element

Wait for an element to appear or disappear

vscode_wait_for_text

Wait for text to appear or disappear in an element

vscode_wait_for_idle

Wait for VSCode to become idle (no pending operations)

Notification & Dialog Tools

Tool

Description

vscode_get_notifications

Get all visible notifications with type, message, and actions

vscode_dismiss_notification

Dismiss a notification by index or message text

vscode_handle_dialog

Handle modal dialogs (InputBox, QuickPick, confirmations)

vscode_get_quick_pick_items

Get items from the QuickPick/Command Palette

vscode_select_quick_pick_item

Select a QuickPick item by text or index

Extension Testing Tools

Tool

Description

vscode_trigger_hover

Trigger hover on an element and get tooltip content

vscode_open_context_menu

Open context menu (right-click) on an element

vscode_get_menu_items

Get items from visible menus

vscode_click_menu_item

Click a menu item by text

vscode_get_tooltip

Get currently visible tooltip content

vscode_trigger_completion

Trigger IntelliSense/code completion (Ctrl+Space)

vscode_get_completion_items

Get IntelliSense completion items

vscode_select_completion_item

Select and accept a completion item

vscode_get_problems_panel

Get problems from Problems panel with severity and location

vscode_go_to_definition

Trigger Go to Definition (F12)

vscode_trigger_signature_help

Trigger signature help (Ctrl+Shift+Space)

Debug & Performance Tools

Tool

Description

vscode_get_console_logs

Get captured console logs (log, info, warn, error, debug)

vscode_clear_console

Clear captured console logs

vscode_get_output_channels

List available output channels

vscode_get_output_channel_content

Read content from an output channel

vscode_get_performance_metrics

Get performance metrics (memory, timing, DOM stats)

vscode_get_extension_logs

Get extension-related logs, optionally filtered by extension ID

vscode_get_devtools_info

Get DevTools-style window/document/navigator info

Utility Tools

Tool

Description

vscode_initialize

Pre-initialize the VSCode driver

vscode_get_status

Get the current driver status

šŸ“– Usage Examples

Execute a Command

// Save the current file
await vscode_execute_command({ commandId: "workbench.action.files.save" });

// Format the document
await vscode_execute_command({ commandId: "editor.action.formatDocument" });

// Open settings
await vscode_execute_command({ commandId: "workbench.action.openSettings" });

Click UI Elements

// Click by CSS selector
await vscode_click_element({ 
  selector: ".explorer-viewlet", 
  selectorType: "css" 
});

// Click by accessibility label
await vscode_click_element({ 
  selector: "Explorer", 
  selectorType: "accessibility" 
});

// Double-click a file
await vscode_click_element({ 
  selector: ".file-item", 
  selectorType: "css",
  doubleClick: true 
});

// Right-click for context menu
await vscode_click_element({ 
  selector: ".file-item", 
  selectorType: "css",
  rightClick: true 
});

Type Text

// Type into the focused element
await vscode_type_text({ text: "Hello, World!" });

// Type into a specific input and press Enter
await vscode_type_text({ 
  text: "search term",
  selector: "input.search-input",
  pressEnter: true 
});

// Clear and type with a delay (for autocomplete)
await vscode_type_text({ 
  text: "import React from 'react'",
  clear: true,
  delay: 50 
});

Open Files

// Open a file
await vscode_open_file({ filePath: "/path/to/file.ts" });

// Open a file at a specific line
await vscode_open_file({ 
  filePath: "src/index.ts", 
  line: 42 
});

// Open a file at a specific line and column
await vscode_open_file({ 
  filePath: "src/utils.ts", 
  line: 10, 
  column: 5 
});

Take Screenshots

// Take a screenshot with default name
await vscode_take_screenshot({});

// Take a screenshot with custom filename
await vscode_take_screenshot({ 
  filename: "test-result-screenshot" 
});

Get Diagnostics

// Get all diagnostics
await vscode_get_diagnostics({});

// Get only errors
await vscode_get_diagnostics({ severity: "error" });

// Get warnings
await vscode_get_diagnostics({ severity: "warning" });

Inspect the DOM (for AI Agents)

// Get the full page DOM as a readable tree
await vscode_get_dom({});

// Get DOM of a specific element as JSON
await vscode_get_dom({ 
  selector: ".sidebar",
  format: "json",
  depth: 5
});

// Get raw HTML of an element
await vscode_get_dom({ 
  selector: ".editor-container",
  format: "html"
});

// Get the sidebar structure
await vscode_get_ui_structure({ region: "sidebar" });

// Get the editor area structure with more depth
await vscode_get_ui_structure({ 
  region: "editor", 
  depth: 8 
});

// Find all buttons on the page
await vscode_query_elements({ selector: "button" });

// Find elements with a specific role
await vscode_query_elements({ 
  selector: "[role='tab']", 
  limit: 10 
});

// Get the accessibility tree for semantic understanding
await vscode_get_accessibility_tree({});

// Get accessibility tree of a specific region
await vscode_get_accessibility_tree({ 
  selector: ".sidebar",
  depth: 6
});

Incremental DOM Exploration (for Large DOMs)

// Step 1: Get top-level children of body
await vscode_get_element_children({ selector: "body" });

// Step 2: Drill into a specific child
await vscode_get_element_children({ 
  selector: ".workbench-container",
  depth: 2
});

// Get parent chain to understand context
await vscode_get_element_parents({ 
  selector: ".my-button",
  levels: 5
});

// Get siblings (useful for tabs, list items)
await vscode_get_element_siblings({ 
  selector: ".tab:nth-child(2)",
  direction: "all"
});

// Find all interactive elements in a region
await vscode_find_interactive_elements({ 
  selector: ".sidebar",
  types: ["button", "input", "link"]
});

// Search for elements by text/label
await vscode_search_dom({ 
  query: "Explorer",
  searchIn: ["text", "aria-label", "title"]
});

// For very large DOMs: dump to file and read incrementally
await vscode_dump_dom_to_file({ 
  filePath: "/tmp/vscode-dom.json",
  format: "json",
  depth: 15
});
// Then use file reading tools to explore sections

Execute JavaScript (DevTools Console Style)

// Get the document title
await vscode_execute_script({ 
  script: "return document.title" 
});

// Get Monaco editor models (VSCode internals)
await vscode_execute_script({ 
  script: "return window.monaco?.editor?.getModels()?.map(m => m.uri.toString())" 
});

// Click an element programmatically
await vscode_execute_script({ 
  script: "document.querySelector('.my-button')?.click(); return 'clicked'",
  returnType: "string"
});

// Run complex DOM manipulation
await vscode_execute_script({ 
  script: `
    const editors = document.querySelectorAll('.editor-instance');
    return Array.from(editors).map(e => ({
      id: e.id,
      visible: e.offsetWidth > 0
    }));
  `
});

// Access VSCode's internal APIs (if available)
await vscode_execute_script({ 
  script: "return typeof acquireVsCodeApi !== 'undefined'"
});

Simple DOM Queries (querySelector style)

// Find a single element
await vscode_query_selector({ selector: ".my-button" });

// Find all matching elements
await vscode_query_selector({ selector: "button", all: true });

// Extract specific properties
await vscode_query_selector({ 
  selector: "input",
  all: true,
  properties: ["value", "placeholder", "type", "name"]
});

// Get element by ID
await vscode_get_element_by_id({ id: "workbench.parts.editor" });

// Get all elements with a class
await vscode_get_elements_by_class({ 
  className: "editor-container",
  limit: 10
});

// Get all buttons
await vscode_get_elements_by_tag({ 
  tagName: "button",
  properties: ["textContent", "aria-label", "disabled"]
});

// Get all inputs with their values
await vscode_get_elements_by_tag({ 
  tagName: "input",
  properties: ["type", "value", "placeholder", "name"]
});

Keyboard & Input

// Press keyboard shortcuts
await vscode_press_keys({ keys: "ctrl+s" }); // Save file
await vscode_press_keys({ keys: "ctrl+shift+p" }); // Command Palette
await vscode_press_keys({ keys: "ctrl+/" }); // Toggle comment

// Press keys multiple times
await vscode_press_keys({ keys: "ArrowDown", count: 5 });

// Focus on a specific element first
await vscode_press_keys({ 
  keys: "Enter",
  selector: ".my-button"
});

// Scroll within an element
await vscode_scroll({ direction: "down", amount: 500 });
await vscode_scroll({ selector: ".sidebar", direction: "bottom" });

// Drag and drop
await vscode_drag_drop({
  sourceSelector: ".file-item:nth-child(2)",
  targetSelector: ".folder-item"
});

// Hover over element
await vscode_hover({ 
  selector: ".status-item", 
  duration: 1000 
});

Waiting & Synchronization

// Wait for an element to appear
await vscode_wait_for_element({ 
  selector: ".notification",
  timeout: 5000
});

// Wait for element to disappear
await vscode_wait_for_element({ 
  selector: ".loading-spinner",
  present: false,
  timeout: 10000
});

// Wait for specific text
await vscode_wait_for_text({ 
  text: "Build succeeded",
  selector: ".terminal",
  timeout: 30000
});

// Wait for VSCode to be idle
await vscode_wait_for_idle({ timeout: 5000 });

Notifications & Dialogs

// Get all notifications
await vscode_get_notifications({});

// Dismiss a notification by message
await vscode_dismiss_notification({ 
  messageContains: "Extension installed" 
});

// Handle input dialog
await vscode_handle_dialog({ 
  text: "my-new-file.ts",
  action: "accept"
});

// Get QuickPick items (Command Palette)
await vscode_press_keys({ keys: "ctrl+shift+p" });
await vscode_get_quick_pick_items({});

// Select a QuickPick item
await vscode_select_quick_pick_item({ 
  text: "Format Document" 
});

IntelliSense & Code Navigation

// Trigger completion
await vscode_trigger_completion({});

// Get completion items
await vscode_get_completion_items({ limit: 20 });

// Select a completion item
await vscode_select_completion_item({ 
  itemLabel: "console.log" 
});

// Go to definition
await vscode_go_to_definition({});

// Trigger signature help
await vscode_trigger_signature_help({});

// Trigger hover and get tooltip
await vscode_trigger_hover({ 
  selector: ".view-line span" 
});

// Open context menu
await vscode_open_context_menu({ 
  selector: ".file-item" 
});

// Get and click menu items
await vscode_get_menu_items({});
await vscode_click_menu_item({ itemText: "Rename" });

Debug & Performance

// Get console logs
await vscode_get_console_logs({ level: "error" });

// Get all recent logs
await vscode_get_console_logs({ limit: 50 });

// Clear console logs
await vscode_clear_console({});

// Get output channels
await vscode_get_output_channels({});

// Read from an output channel
await vscode_get_output_channel_content({ 
  channelName: "Extension Host" 
});

// Get extension logs
await vscode_get_extension_logs({ 
  extensionId: "my.extension" 
});

// Get performance metrics
await vscode_get_performance_metrics({});

// Get DevTools info
await vscode_get_devtools_info({});

Verify UI State

// Check if an element exists and is visible
await vscode_verify_element({ 
  selector: ".explorer-viewlet",
  selectorType: "css",
  shouldBeVisible: true 
});

// Check if element contains specific text
await vscode_verify_element({ 
  selector: ".statusbar",
  selectorType: "css",
  containsText: "TypeScript" 
});

Get Editor Content

// Get the content of the active editor
const result = await vscode_get_editor_content({});
// Returns: { content: "...", editor: { fileName: "...", lineCount: ... } }

šŸ”§ Common Command IDs

Here are some frequently used VSCode command IDs:

File Operations

  • workbench.action.files.save - Save file

  • workbench.action.files.saveAll - Save all files

  • workbench.action.files.newUntitledFile - New file

  • workbench.action.closeActiveEditor - Close editor

Navigation

  • workbench.action.quickOpen - Quick Open (Ctrl+P)

  • workbench.action.gotoLine - Go to Line

  • editor.action.revealDefinition - Go to Definition

View

  • workbench.action.toggleSidebarVisibility - Toggle Sidebar

  • workbench.action.togglePanel - Toggle Panel

  • workbench.action.terminal.toggleTerminal - Toggle Terminal

Editor

  • editor.action.formatDocument - Format Document

  • editor.action.commentLine - Toggle Line Comment

Git

  • git.commit - Git Commit

  • git.push - Git Push

  • git.pull - Git Pull

🧪 Testing the MCP Server

Manual Testing

  1. Build the project:

    npm run build
    npm run validate
  2. Test with MCP Inspector (recommended):

    npx @modelcontextprotocol/inspector node dist/index.js

    This opens a web UI where you can call each tool interactively.

  3. Test with Claude Desktop:

    • Add the server to your Claude Desktop config (see Configuration section)

    • Restart Claude Desktop

    • Ask Claude to use the vscode_automation tools

  4. Test basic functionality:

    # Start the server manually to check for startup errors
    node dist/index.js

    The server communicates via stdio, so you won't see output unless there are errors.

What Gets Tested

  • vscode_get_status - Always works, returns server state

  • vscode_initialize - Launches VSCode with WebDriver (requires display)

  • All other tools - Require vscode_initialize to be called first

Notes on Testing

  • The server uses vscode-extension-tester which launches a real VSCode instance

  • First run may take time to download ChromeDriver

  • VSCode must be installed on the system

  • Requires a display (or virtual display on Linux)

šŸ› Troubleshooting

VSCode Not Found

Make sure VSCode is installed and accessible from the command line:

code --version

ChromeDriver Issues

The server uses ChromeDriver to automate VSCode. If you encounter issues:

  1. Make sure Chrome/Chromium is installed

  2. The correct ChromeDriver version will be downloaded automatically

  3. Check that no other automation tools are conflicting

Timeout Errors

If operations are timing out:

  1. Increase the timeout in the tool options

  2. Make sure VSCode has finished loading

  3. Call vscode_initialize before other operations

Element Not Found

If selectors aren't finding elements:

  1. Use vscode_take_screenshot to see the current state

  2. Try different selector types (css, xpath, accessibility, text)

  3. Check if the element is in a webview (requires different handling)

šŸ¤ Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository

  2. Create your feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add some amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

šŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

šŸ™ Acknowledgments


Built with ā¤ļø by Sukarth

-
security - not tested
A
license - permissive license
-
quality - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Sukarth/vscode-automation-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server