Skip to main content
Glama

Token Saver MCP

by jerry426
IDE_AUTOMATION_VISION.md18.7 kB
# VSCode IDE Automation Vision ## Enabling Claude Code to Drive the IDE Like a Developer ### Executive Summary This document outlines the technical possibilities for creating a VSCode extension that would allow Claude Code (or other AI assistants) to directly control and automate the Visual Studio Code IDE, simulating developer actions and providing true pair-programming capabilities where the AI can "take the wheel." Since Visual Studio Code is fully open source, we have unprecedented access to understand and extend its capabilities far beyond typical extension APIs. --- ## Table of Contents 1. [Current VSCode Extension API Capabilities](#current-vscode-extension-api-capabilities) 2. [Deep VSCode Internals Access](#deep-vscode-internals-access) 3. [Implementation Examples](#implementation-examples) 4. [Advanced Techniques](#advanced-techniques) 5. [The Ultimate Vision](#the-ultimate-vision) 6. [Technical Roadmap](#technical-roadmap) 7. [Resources and References](#resources-and-references) --- ## Current VSCode Extension API Capabilities VSCode extensions already provide powerful APIs that can control most aspects of the IDE: ### 1. Editor Control - **File Management** - Open, close, save files - Create and delete files/folders - Navigate between files - Manage multiple editor groups - **Text Editing** - Insert, delete, replace text - Apply edits across multiple files - Manage selections and cursors - Trigger formatting and refactoring - **View Management** - Switch between tabs - Split/unsplit editors - Control editor layouts - Manage diff views ### 2. UI Manipulation - **Command Execution** - Access to all VSCode commands - Command palette automation - Keyboard shortcut simulation - **Panel Control** - Show/hide terminal, output, problems panels - Control sidebar visibility - Manage activity bar - **Notifications** - Show information/warning/error messages - Create input boxes and quick picks - Display progress notifications ### 3. Debugging & Testing - **Debug Control** - Start/stop debugging sessions - Set/remove breakpoints - Step through code - Inspect variables - **Test Integration** - Run test suites - View test results - Navigate to failing tests - Generate test coverage ### 4. Terminal Control - **Terminal Management** - Create/destroy terminals - Send commands to terminals - Read terminal output (limited) - Control terminal focus ### 5. Source Control Integration - **Git Operations** - Stage/unstage files - Create commits - Switch branches - Push/pull/fetch - View diffs - Resolve conflicts ### 6. Extension & Configuration Management - **Settings Control** - Read/write user settings - Modify workspace settings - Control extension configurations - **Extension Management** - Enable/disable extensions - Install/uninstall extensions - Access extension APIs --- ## Deep VSCode Internals Access Since VSCode is built on Electron (Chromium + Node.js) and is fully open source, we can access deeper layers: ### 1. Electron Layer Access ```typescript // Access to Electron APIs const { remote, ipcRenderer } = require('electron'); // Window management remote.getCurrentWindow().maximize(); // System dialogs remote.dialog.showOpenDialog({ properties: ['openFile'] }); // Menu manipulation remote.Menu.getApplicationMenu(); ``` ### 2. Monaco Editor Direct Access Monaco is VSCode's core editor component, and we can interact with it directly: ```typescript // Get Monaco instance const monaco = require('monaco-editor'); // Custom language features monaco.languages.registerCompletionItemProvider('javascript', { provideCompletionItems: (model, position) => { // AI-powered completions } }); // Advanced decorations editor.deltaDecorations([], [{ range: new monaco.Range(1, 1, 1, 10), options: { className: 'ai-suggestion', hoverMessage: 'AI recommended change' } }]); ``` ### 3. Extension Host Process Direct access to the extension host allows for powerful integrations: ```typescript // Access internal services const { ExtHostContext } = require('vscode'); // IPC communication process.send({ type: 'custom-message', payload: data }); // Hook into internal events vscode.extensions.all.forEach(ext => { // Access extension internals }); ``` --- ## Implementation Examples ### Basic IDE Control Tools for MCP Server ```typescript import * as vscode from 'vscode'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; export function addIdeControlTools(server: McpServer) { // File and Editor Management server.registerTool('ide_open_file', { description: 'Open a file in the editor', inputSchema: { path: z.string().describe('File path to open'), preview: z.boolean().optional().describe('Open in preview mode'), viewColumn: z.enum(['active', 'beside', 'one', 'two', 'three']).optional(), selection: z.object({ start: z.object({ line: z.number(), character: z.number() }), end: z.object({ line: z.number(), character: z.number() }) }).optional().describe('Optional selection range to highlight') } }, async ({ path, preview, viewColumn, selection }) => { const uri = vscode.Uri.file(path); const doc = await vscode.workspace.openTextDocument(uri); const options: vscode.TextDocumentShowOptions = { preview: preview ?? false, viewColumn: viewColumn ? vscode.ViewColumn[viewColumn] : undefined }; if (selection) { options.selection = new vscode.Range( selection.start.line, selection.start.character, selection.end.line, selection.end.character ); } const editor = await vscode.window.showTextDocument(doc, options); return { success: true, path: editor.document.fileName }; }); // Command Execution server.registerTool('ide_run_command', { description: 'Execute any VSCode command', inputSchema: { command: z.string().describe('VSCode command ID'), args: z.any().optional().describe('Command arguments') } }, async ({ command, args }) => { try { const result = await vscode.commands.executeCommand(command, args); return { success: true, result }; } catch (error) { return { success: false, error: error.message }; } }); // Terminal Automation server.registerTool('ide_terminal_execute', { description: 'Run command in integrated terminal', inputSchema: { command: z.string().describe('Command to execute'), name: z.string().optional().describe('Terminal name'), waitForExit: z.boolean().optional().describe('Wait for command to complete') } }, async ({ command, name, waitForExit }) => { const terminal = vscode.window.createTerminal(name || 'AI Assistant'); terminal.show(); terminal.sendText(command); if (waitForExit) { // Note: Actual implementation would need terminal output capture await new Promise(resolve => setTimeout(resolve, 1000)); } return { success: true, terminalId: terminal.processId }; }); // Debugging Control server.registerTool('ide_debug_start', { description: 'Start debugging session', inputSchema: { configuration: z.string().describe('Launch configuration name'), breakpoints: z.array(z.object({ file: z.string(), line: z.number() })).optional() } }, async ({ configuration, breakpoints }) => { // Set breakpoints if provided if (breakpoints) { for (const bp of breakpoints) { const uri = vscode.Uri.file(bp.file); const location = new vscode.Location(uri, new vscode.Position(bp.line - 1, 0)); vscode.debug.addBreakpoints([ new vscode.SourceBreakpoint(location) ]); } } // Start debugging const started = await vscode.debug.startDebugging(undefined, configuration); return { success: started }; }); // Git Integration server.registerTool('ide_git_operation', { description: 'Perform git operations', inputSchema: { operation: z.enum(['stage', 'unstage', 'commit', 'push', 'pull']), files: z.array(z.string()).optional(), message: z.string().optional().describe('Commit message') } }, async ({ operation, files, message }) => { const gitExtension = vscode.extensions.getExtension('vscode.git'); if (!gitExtension) { return { success: false, error: 'Git extension not available' }; } const git = gitExtension.exports.getAPI(1); const repo = git.repositories[0]; if (!repo) { return { success: false, error: 'No git repository found' }; } switch (operation) { case 'stage': await repo.add(files || []); break; case 'unstage': await repo.revert(files || []); break; case 'commit': await repo.commit(message || 'AI-assisted commit'); break; case 'push': await repo.push(); break; case 'pull': await repo.pull(); break; } return { success: true, operation }; }); // UI Control server.registerTool('ide_show_panel', { description: 'Control IDE panels and views', inputSchema: { target: z.enum([ 'terminal', 'output', 'problems', 'debug-console', 'explorer', 'search', 'source-control', 'extensions' ]), action: z.enum(['focus', 'hide', 'toggle']).optional() } }, async ({ target, action = 'focus' }) => { const commandMap = { 'terminal': 'terminal', 'output': 'output', 'problems': 'problems', 'debug-console': 'debug.console', 'explorer': 'explorer', 'search': 'search', 'source-control': 'scm', 'extensions': 'extensions' }; const command = `workbench.${action}.${commandMap[target]}`; await vscode.commands.executeCommand(command); return { success: true, panel: target, action }; }); // Multi-file Refactoring server.registerTool('ide_refactor', { description: 'Perform multi-file refactoring', inputSchema: { type: z.enum(['rename', 'extract-function', 'extract-variable']), file: z.string(), position: z.object({ line: z.number(), character: z.number() }), newName: z.string().optional() } }, async ({ type, file, position, newName }) => { const uri = vscode.Uri.file(file); const doc = await vscode.workspace.openTextDocument(uri); const editor = await vscode.window.showTextDocument(doc); // Position cursor const vsPosition = new vscode.Position(position.line, position.character); editor.selection = new vscode.Selection(vsPosition, vsPosition); // Execute refactoring switch (type) { case 'rename': await vscode.commands.executeCommand('editor.action.rename'); // Would need to handle input box for new name break; case 'extract-function': await vscode.commands.executeCommand('editor.action.extractMethod'); break; case 'extract-variable': await vscode.commands.executeCommand('editor.action.extractVariable'); break; } return { success: true, type }; }); } ``` --- ## Advanced Techniques ### 1. Monkey-Patching VSCode Internals Since we have access to the Node.js runtime, we can modify VSCode's behavior at runtime: ```typescript // Intercept require calls const Module = require('module'); const originalRequire = Module.prototype.require; Module.prototype.require = function(id) { const module = originalRequire.apply(this, arguments); if (id === 'vscode') { // Wrap or modify VSCode API return new Proxy(module, { get(target, prop) { console.log(`VSCode API accessed: ${prop}`); return target[prop]; } }); } return module; }; ``` ### 2. Accessing Internal Services ```typescript // Access VSCode's internal services const getService = (serviceName: string) => { try { // Navigate through VSCode's require cache const cache = require.cache; for (const key in cache) { if (key.includes('workbench') && cache[key].exports[serviceName]) { return cache[key].exports[serviceName]; } } } catch (e) { console.error(`Service ${serviceName} not found`, e); } }; // Example: Access the editor service const editorService = getService('IEditorService'); ``` ### 3. Extension Host Protocol Hooking ```typescript // Hook into extension host communication const vscode = require('vscode'); const { ExtHostContext } = require('vs/workbench/api/common/extHost.protocol'); // Intercept extension host messages const originalSend = process.send; process.send = function(message) { console.log('Extension host message:', message); // Modify or block messages if (message.type === 'someType') { // Custom handling } return originalSend.apply(process, arguments); }; ``` ### 4. Direct Monaco Editor Manipulation ```typescript // Get all Monaco editor instances const getMonacoEditors = () => { const editors = []; // Find Monaco instances in the DOM document.querySelectorAll('.monaco-editor').forEach(element => { const editor = element._editor || element.getContext?.(); if (editor) { editors.push(editor); } }); return editors; }; // Inject AI suggestions directly into Monaco const injectAISuggestions = (editor) => { const model = editor.getModel(); // Add inline suggestions editor.onDidChangeCursorPosition((e) => { // AI analyzes context and suggests code const suggestion = getAISuggestion(model, e.position); // Show as ghost text editor.showInlineSuggestion(suggestion); }); }; ``` --- ## The Ultimate Vision ### AI-Driven Development Workflow 1. **Intelligent Observation Mode** - AI watches developer actions and learns patterns - Builds understanding of project structure and conventions - Identifies repetitive tasks for automation 2. **Seamless Handoff** - Developer describes high-level intent - AI takes control of IDE to implement - Developer watches and guides as needed 3. **Collaborative Editing** - Real-time pair programming with AI - AI handles boilerplate while developer focuses on logic - Automatic refactoring and optimization 4. **Full Development Lifecycle** - AI manages git workflow - Runs tests and fixes failures - Handles deployment and monitoring ### Example Interaction Flow ```yaml Developer: "Convert this class to use the repository pattern" Claude Code Actions: 1. Analyzes current class structure 2. Opens new file for repository interface 3. Generates interface definition 4. Creates repository implementation 5. Opens original class file 6. Refactors to use repository 7. Updates dependency injection 8. Runs tests to verify changes 9. Commits with descriptive message 10. Shows summary of changes ``` ### Advanced Capabilities - **Predictive Coding**: AI anticipates next steps and prepares files/tools - **Context Switching**: AI manages multiple related tasks across files - **Intelligent Debugging**: AI automatically sets breakpoints and traces issues - **Code Review Mode**: AI navigates through PR changes and suggests improvements - **Learning Mode**: AI observes developer and builds personal coding profile --- ## Technical Roadmap ### Phase 1: Foundation (Current) ✅ Basic MCP server with LSP integration ✅ Simple tool execution ✅ File reading and editing ### Phase 2: IDE Control (Next) - [ ] Implement basic IDE control tools - [ ] Add terminal integration - [ ] Enable debugging control - [ ] Integrate git operations ### Phase 3: Advanced Integration - [ ] Direct Monaco editor access - [ ] Custom UI components - [ ] Extension host hooks - [ ] Workflow automation ### Phase 4: Intelligence Layer - [ ] Pattern learning system - [ ] Predictive action system - [ ] Context-aware suggestions - [ ] Personal coding profiles ### Phase 5: Full Autonomy - [ ] Complete IDE takeover mode - [ ] Multi-step task automation - [ ] Self-healing code fixes - [ ] Autonomous development cycles --- ## Resources and References ### VSCode Source Code Structure - **API Definitions**: `/src/vs/workbench/api/` - **Extension Host**: `/src/vs/workbench/services/extensions/` - **Editor Core**: `/src/vs/editor/` - **Monaco**: `/src/vs/editor/standalone/` ### Key Documentation - [VSCode Extension API](https://code.visualstudio.com/api) - [VSCode Source Code](https://github.com/microsoft/vscode) - [Monaco Editor API](https://microsoft.github.io/monaco-editor/api/) - [Electron API](https://www.electronjs.org/docs/latest/api/app) ### Similar Projects to Study - **VSCode Remote Development**: Controls remote IDE instances - **GitHub Copilot**: Deep editor integration - **Live Share**: Collaborative editing features - **Code Tour**: Automated code navigation ### Contributing to VSCode 1. **Propose New APIs**: VSCode team accepts API proposals 2. **Submit PRs**: Add new extension points 3. **Join Discussions**: Participate in API design discussions 4. **Build Extensions**: Demonstrate use cases ### Development Tips - Use `Developer: Toggle Developer Tools` in VSCode to inspect internals - Enable `--inspect-extensions` flag for debugging - Study successful extensions for patterns - Join VSCode Extension Discord/Slack communities --- ## Security and Ethical Considerations ### Security Concerns - **Sandbox Escape**: Be careful not to break VSCode's security model - **User Consent**: Always make AI actions transparent - **Data Privacy**: Don't send sensitive code to external services - **Rate Limiting**: Prevent runaway automation ### Best Practices 1. Always show what AI is doing 2. Provide undo/rollback capabilities 3. Require confirmation for destructive actions 4. Log all automated actions 5. Respect user preferences and settings --- ## Conclusion The combination of VSCode's open-source nature, extensive APIs, and modern architecture makes it possible to create an AI assistant that can truly "drive" the IDE like a human developer. This vision represents a fundamental shift in how we think about AI-assisted development - from a tool that suggests code to a collaborative partner that can take full control when needed. The technical foundation exists today. What remains is the careful implementation of these capabilities in a way that enhances rather than replaces human creativity and decision-making in software development. --- *Last Updated: August 2025* *Version: 1.0* *Author: Token Saver MCP Project Team*

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/jerry426/token-saver-mcp'

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