Claude Code, but with your IDE's eyes.
A WebSocket bridge that connects Claude Code to VS Code (and Windsurf, Cursor) so Claude can see what your IDE sees: live diagnostics, go-to-definition, find references, hover types, open files, breakpoints, debugger state. Not file access β actual IDE context, the same signals a developer reads while working.
Install the companion extension, start the bridge, open Claude. That's it. Claude can now navigate your codebase the way you do, run tests, check diagnostics, commit, and create PRs β without you copy-pasting anything.
Claude Code ββββ bridge ββββ VS Code extension ββββ your editor state
Works from your phone. SSH into your dev machine, send a message, watch Claude fix bugs and run tests on your home machine while you're away.
| I want to⦠| Go to |
|---|---|
| Get started (5 min setup) | Quick Start |
| Understand what tools are available | Platform Docs |
| Run two IDEs in parallel | Multi-IDE Orchestrator |
| Access from remote / phone | Remote Access |
| Deploy to a VPS | Deploy |
| Write a plugin | Plugin Authoring |
| Use with Claude Desktop / Dispatch | Session Continuity |
| Use with claude.ai web | Custom Connector |
Prerequisites: Claude Code CLI, Node.js β₯ 20
npm install -g claude-ide-bridge
cd /your/project
claude-ide-bridge initinit does four things:
- Installs the companion VS Code/Windsurf/Cursor extension
- Appends a
## Claude IDE Bridgesection to yourCLAUDE.md(creating it if needed) - Writes
.claude/rules/bridge-tools.mdβ a rules file that directs Claude to call MCP tools instead of shell equivalents (runTestsinstead ofnpm test,getDiagnosticsinstead oftsc,gitCommitinstead ofgit commit,searchWorkspaceinstead ofgrep) - Registers the bridge as a global MCP server in
~/.claude.jsonso bridge tools appear in everyclaudesession, any directory
The rules file is loaded automatically via @import in CLAUDE.md on every session. No extra flags or configuration needed.
Then start the bridge and open Claude:
claude-ide-bridge --watch # terminal 1 β keeps running, auto-restarts on crash
claude --ide # terminal 2 β Claude Code with IDE tools active
--watchrestarts the bridge automatically if it crashes, with exponential backoff (2s β 30s). Safe for long-running sessions.
Type /mcp in Claude to confirm the server is connected, then /ide to see open files, diagnostics, and editor state.
One bridge per workspace. Each project needs its own bridge instance on its own port. If you work across multiple repos, start a separate
claude-ide-bridge --watchin each directory.
Why
~/.claude.jsonand not.mcp.json? When VS Code, Windsurf, or Cursor launches Claude Code, it injects--mcp-configwhich overrides any project.mcp.json. Only~/.claude.jsonis loaded in every session regardless of how Claude Code is started.initwrites there by design β you don't need to touch.mcp.json.
Adding the bridge to an existing project (without re-running full init):
claude-ide-bridge gen-claude-md --writeThis appends the bridge section to your existing CLAUDE.md and writes .claude/rules/bridge-tools.md. Run it once per project.
Tools not showing up? See the troubleshooting guide.
By default, the bridge starts in slim mode β 48 IDE-exclusive tools that Claude can't replicate with its built-in Read/Write/Bash tools: LSP intelligence, debugger, editor decorations, diagnostics, refactoring, impact analysis, and editor state. This is the right default for most workflows because Claude already has file editing and shell access built in.
If you need Claude to use the bridge's git, terminal, file ops, HTTP client, or GitHub tools instead of its built-in equivalents, start in full mode:
claude-ide-bridge --watch --full # all ~130 toolsOr set it permanently in your config file (claude-ide-bridge.config.json):
{
"fullMode": true
}When to use --full:
- You're running headless/CI and want structured git/GitHub tools instead of raw
gitcommands - You want Claude to use
runTests(with framework detection and structured output) instead ofnpm test - You need
sendHttpRequestwith SSRF protection, orgithubCreatePRwith template support - You're using automation hooks (
--automation) that need terminal or git tools
When slim mode is enough (most users):
- You're working in VS Code/Cursor/Windsurf and want Claude to see your IDE state
- Claude's built-in
Read/Write/Bashtools handle file ops and git fine - You want a smaller tool list for faster responses and less token overhead
See MCP Tools below for the full tool breakdown by category.
With the bridge connected, try these prompts in Claude:
- "Explain the function at src/server.ts:140" β uses
explainSymbolto get type info, docs, callers, and references in one call - "Preview what renaming
handleRequesttoprocessRequestwould change" β usesrefactorPreviewto show affected files without applying - "Review this file and highlight issues inline" β Claude uses
setEditorDecorationsto annotate your editor with findings - "Fix all errors in open files" β uses
getDiagnosticsto find errors, theneditTextto fix them - "Show me who calls this function" β uses
getCallHierarchyto trace callers and callees - "Run the tests and fix failures" β uses
runTestsorrunCommandto execute tests, reads output, and applies fixes - "Create a PR for these changes" β uses
getGitDiff,gitCommit, andgithubCreatePRto commit and open a pull request
When to use this: Large projects (50k+ lines) where a single Claude session runs out of context mid-task, or where you're running genuinely parallel workstreams β one agent implementing while another reviews, or one exploring the backend while another works on the frontend. For most projects, a single bridge is sufficient.
Run two bridges simultaneously β one per IDE window β with a meta-orchestrator routing between them. Each agent gets a completely independent context (separate LSP cache, open files, terminal history), so their work doesn't interfere.
Claude Code
β
Meta-Orchestrator (port 4746)
βββ Bridge A (port 55000) β e.g. backend work, active changes
βββ Bridge B (port 55001) β e.g. frontend work, or clean reviewer
Setup (each IDE needs a fixed port):
In each VS Code/Windsurf workspace settings, set claudeIdeBridge.port to 55000 and 55001 respectively. Then:
claude-ide-bridge orchestrator --port 4746
claude --ide # auto-discovers orchestrator, exposes both workspaces' toolsUse switchWorkspace ws1 / switchWorkspace ws2 in Claude to pin to a specific IDE. Tools from both are available; conflicting names get a __<IDE>_<port> suffix.
Concrete use cases where it pays off:
- Large monorepo: database layer in one IDE, API layer in another β each agent stays focused without context bleed
- Implement + review: one agent writes, the other reviews the diff with fresh eyes (no anchoring bias)
- Self-hosting dev loop: modify the bridge itself in IDE A, validate through IDE B without downtime
Where it's not worth the overhead: projects under ~50k lines, tasks that need to touch both workspaces frequently (handoff cost dominates), or anything a single runClaudeTask subprocess handles adequately.
See docs/multi-ide-review.md for the staged review workflow.
These guides are essential for setup and deployment β not optional reading. Each covers a specific scenario you'll encounter when running the bridge beyond localhost.
| Guide | What it covers |
|---|---|
| Troubleshooting | Tools not showing up, wrong config file, WSL/Windows PATH, port conflicts |
| Remote Access | Production reverse proxy setup (Caddy/nginx), TLS, Streamable HTTP transport |
| SSH Resilience | Surviving SSH drops, tmux strategies, phone-to-VPS workflows |
| IP Allowlist | Firewall rules, network access control for remote bridge instances |
| Worktree Isolation | How git worktrees interact with the bridge, safe concurrent editing |
| Privacy Policy | What data the bridge handles, stores, and never transmits |
| Demo Setup | Standing up a persistent demo instance for review/testing |
| Architecture Decisions | ADRs for version numbers, reconnect guards, lock files, error model, session eviction |
| Release Checklist | Pre-release gate: hardcoded count audit, doc completeness, publish steps |
Reference docs (in documents/):
| Doc | What it covers |
|---|---|
| Platform Docs | Complete tool reference (130+ tools), parameters, examples |
| Data Reference | Data flows, state management, protocol details |
| Plugin Authoring | Writing custom plugins β manifest schema, entrypoint API |
| Use Cases | Real-world workflows and scenarios |
| Roadmap | Planned features and development direction |
The bridge persists state across restarts and context switches (CLI β Desktop β Cowork).
Use setHandoffNote to save context before switching sessions. Notes are workspace-scoped β switching workspaces won't overwrite each other's context. getHandoffNote retrieves the most recent note for your current workspace.
The bridge also auto-snapshots a basic handoff note whenever a new session connects and the existing note is stale (>5 minutes old).
When the bridge restarts within 5 minutes of the previous run, it automatically restores the list of open files from the last session checkpoint. The first connecting client receives a notification:
Session restored from checkpoint: N file(s) tracked (checkpoint was Xs old)
- CLI session: work normally; bridge tracks opened files
- Switching to Desktop: call
setHandoffNotefirst, or run/mcp__bridge__coworkto auto-collect context - Cowork: MCP tools are NOT available inside Cowork β the handoff note is the bridge. Always run
/mcp__bridge__coworkin regular chat before opening Cowork (Cmd+2).
Cowork sessions (Claude Desktop computer-use): MCP bridge tools are NOT available inside Cowork. Run
/mcp__bridge__coworkin a regular Desktop chat first to capture context, then open Cowork. Cowork also operates in an isolated git worktree β files won't appear in your maingit statusuntil merged.
The start-all command launches everything in a tmux session: bridge + Claude Code + remote control, with automatic health monitoring and process restart.
# Via npm global install or npx
claude-ide-bridge start-all --workspace /path/to/your-project
# Or the dedicated alias
claude-ide-bridge-start --workspace /path/to/your-project
# From source
npm run start-all -- --workspace /path/to/your-projectOptions:
| Flag | Description |
|---|---|
--workspace <path> |
Project directory (default: .) |
--notify <topic> |
ntfy.sh topic for push notifications |
--ide <name> |
IDE name hint (e.g. windsurf) |
Requires tmux and the claude CLI to be on PATH.
The bridge ships as a Claude Code plugin with 9 skills, 3 subagents, and 16 hook events β available on the Claude Code plugin directory:
# Load the plugin
claude --plugin-dir ./claude-ide-bridge-plugin| Skill | Description | Remote Session |
|---|---|---|
/ide-diagnostics-board |
Visual diagnostics dashboard (HTML) across the workspace | CLI fallback |
/ide-coverage |
Test coverage heatmap (HTML) from lcov/JSON data | CLI fallback |
/ide-quality |
Multi-language lint sweep + auto-fix + format + optional commit | CLI fallback |
/ide-debug |
Full debug cycle: run tests, set breakpoints, evaluate expressions, fix, verify | Requires bridge |
/ide-review |
Deep PR review using LSP code intelligence + GitHub tools | Requires bridge |
/ide-refactor |
Safe refactoring with snapshot checkpoints and auto-rollback | Requires bridge |
/ide-explore |
Codebase exploration using LSP (runs in isolated Explore agent) | Requires bridge |
/ide-deps |
Interactive dependency graph (HTML) for a file or symbol | Requires bridge |
/ide-monitor |
Continuous monitoring for diagnostics, tests, or terminal output | Requires bridge |
Remote sessions (
claude remote-control): Skills marked "CLI fallback" work without the bridge by using built-in Claude Code tools. Skills marked "Requires bridge" need theclaude --idesession.
| Agent | Description |
|---|---|
ide-code-reviewer |
Evidence-based code review using LSP tools, with persistent memory |
ide-debugger |
Autonomous debug cycles with breakpoints and expression evaluation |
ide-test-runner |
Runs tests, categorizes failures, applies fixes |
| Event | What it does |
|---|---|
PreToolUse |
Resolves relative path args to absolute before bridge tools execute |
PostToolUse on Edit/Write |
Reminds Claude to check diagnostics after file edits |
SessionStart |
Reports bridge status, connection, and tool count |
InstructionsLoaded |
Injects live bridge status each time CLAUDE.md loads |
Elicitation |
Pre-fills file/path/uri fields using the active editor |
ElicitationResult |
Logs user responses (or cancellations) to MCP elicitation dialogs |
PostCompact |
Re-injects bridge status after Claude compacts context |
WorktreeCreate |
Reports bridge β worktree relationship; warns about LSP limitations |
WorktreeRemove |
Warns that IDE state may be stale after worktree removal |
SubagentStart |
Verifies bridge is alive before IDE subagents run |
SubagentStop |
Surfaces subagent final response summary for parent agent awareness |
TeammateIdle |
Reports bridge health when a team agent finishes and awaits coordination |
TaskCompleted |
Logs task completion summary and confirms bridge availability |
ConfigChange |
Warns if changed config files require a bridge restart |
Stop |
Logs session end and surfaces final response for automated workflows |
StopFailure |
Logs API errors that ended the turn; checks bridge health |
The bridge exposes tools in two modes:
- Slim mode (default) β 48 IDE-exclusive tools. Only tools that require a live VS Code extension and have no native Claude equivalent. This is what you get with
claude-ide-bridge --watch. - Full mode (
--full) β all ~130 tools, adding git, terminal, file ops, HTTP, and GitHub. Use this for large projects or workflows that rely on those integrations.
| Category | Tools |
|---|---|
| LSP / Code Intelligence | getDiagnostics Β· watchDiagnostics Β· goToDefinition Β· findReferences Β· getHover Β· getCodeActions Β· applyCodeAction Β· renameSymbol Β· searchWorkspaceSymbols Β· getDocumentSymbols Β· getCallHierarchy Β· getSemanticTokens Β· getCodeLens Β· getDocumentLinks Β· batchGetHover Β· batchGoToDefinition |
| Impact Analysis | getChangeImpact Β· getImportedSignatures |
| Refactor & Navigation | refactorAnalyze Β· refactorPreview Β· refactorExtractFunction Β· prepareRename Β· selectionRanges Β· foldingRanges Β· signatureHelp Β· explainSymbol Β· getImportTree |
| Editor Decorations | setEditorDecorations Β· clearEditorDecorations |
| Debugger | startDebugging Β· stopDebugging Β· setDebugBreakpoints Β· evaluateInDebugger Β· getDebugState |
| Editor State | getOpenEditors Β· getCurrentSelection Β· getLatestSelection Β· checkDocumentDirty Β· saveDocument Β· openFile Β· closeTab Β· captureScreenshot |
| VS Code | executeVSCodeCommand |
| Bridge | getBridgeStatus Β· getToolCapabilities |
| Category | Count | Tools (sample) |
|---|---|---|
| Git | 16 | getGitStatus Β· getGitDiff Β· gitCommit Β· gitPush Β· gitBlame Β· β¦ |
| Terminal | 8 | runCommand Β· createTerminal Β· sendTerminalCommand Β· β¦ |
| File ops | 8 | createFile Β· editText Β· searchWorkspace Β· getFileTree Β· β¦ |
| GitHub | 13 | githubCreatePR Β· githubListIssues Β· githubPostPRReview Β· β¦ |
| HTTP | 2 | sendHttpRequest Β· parseHttpFile |
| Code analysis | 9 | auditDependencies Β· detectUnusedCode Β· getSecurityAdvisories Β· β¦ |
| Code quality | 3 | fixAllLintErrors Β· formatDocument Β· organizeImports |
| Diagnostics+ | 2 | runTests Β· getCodeCoverage |
| Plans | 5 | createPlan Β· updatePlan Β· getPlan Β· β¦ |
| Clipboard | 2 | readClipboard Β· writeClipboard |
| LSP extras | 4 | getHoverAtCursor Β· getTypeSignature Β· getInlayHints Β· getTypeHierarchy |
| More editor | 2 | openDiff Β· getBufferContent |
| Session | 2 | getHandoffNote Β· setHandoffNote |
The bridge exposes 15 built-in slash commands via the MCP prompts/list + prompts/get protocol. These appear as /mcp__bridge__<name> in any MCP client that supports prompts.
| Prompt | Argument | Description |
|---|---|---|
/mcp__bridge__review-file |
file (required) |
Code review for a specific file using current diagnostics |
/mcp__bridge__explain-diagnostics |
file (required) |
Explain and suggest fixes for all diagnostics in a file |
/mcp__bridge__generate-tests |
file (required) |
Generate a test scaffold for the exported symbols in a file |
/mcp__bridge__debug-context |
(none) | Snapshot current debug state, open editors, and diagnostics |
/mcp__bridge__git-review |
base (optional, default: main) |
Review all changes since a git base branch |
/mcp__bridge__cowork |
task (optional) |
Gather full IDE context and propose a Cowork action plan β run this before opening a Cowork session |
/mcp__bridge__set-effort |
level (optional: low/medium/high, default: medium) |
Prepend an effort-level instruction to tune Claude's thoroughness for the next task |
/mcp__bridge__project-status |
(none) | Quick project health: git status + diagnostics + test summary (Dispatch) |
/mcp__bridge__quick-tests |
filter (optional) |
Run tests and return concise pass/fail summary (Dispatch) |
/mcp__bridge__quick-review |
(none) | Review uncommitted changes with diff summary and diagnostics (Dispatch) |
/mcp__bridge__build-check |
(none) | Check if the project builds successfully (Dispatch) |
/mcp__bridge__recent-activity |
count (optional, default: 10) |
Recent git log and uncommitted changes (Dispatch) |
/mcp__bridge__team-status |
(none) | Workspace state, active tasks, and recent activity for team leads (Agent Teams) |
/mcp__bridge__health-check |
(none) | Comprehensive project health: tests, diagnostics, security (Scheduled Tasks) |
Cowork sessions and MCP tools: MCP tools (including all bridge tools) are not available inside a Cowork session. Use a two-step workflow: run
/mcp__bridge__coworkin a regular Claude Code chat first β it gathers full IDE context and produces an action plan β then open a Cowork session armed with that context.
Prompts are served directly from the bridge β no extension required. Implemented in src/prompts.ts.
The bridge exposes your workspace files as MCP Resources via resources/list and resources/read. Any MCP client that supports the resources protocol can browse and read files directly β without calling individual file tools.
- Workspace tree is walked automatically (skips
node_modules,.git,dist, etc.) - Only text file extensions are exposed
- Cursor-paginated (50 files per page)
- 1 MB per-file cap
- Workspace-confined: paths outside the workspace are rejected
No configuration needed β resources are enabled by default.
The bridge exposes several HTTP endpoints for monitoring and integration. All require Authorization: Bearer <token> except /.well-known/mcp.
| Endpoint | Description |
|---|---|
GET /health |
Liveness probe β returns { status, uptime, connections } |
GET /ready |
Readiness probe β returns 200 only after MCP handshake completes and reports tool count + extension state. Returns 503 before ready. |
GET /status |
Detailed status object with uptime and session diagnostics |
GET /metrics |
Prometheus-format metrics: bridge_tool_calls_total, bridge_tool_duration_ms_avg, bridge_uptime_seconds |
GET /stream |
Server-Sent Events stream of all activity log entries in real time (tool calls, lifecycle events). Keep-alive pings included. |
GET /tasks |
Sanitized task list (when --claude-driver is active) |
GET /.well-known/mcp |
Public MCP server discovery β name, version, capabilities, transports (no auth required) |
TOKEN=$(cat ~/.claude/ide/*.lock | python3 -c "import sys,json; print(json.load(sys.stdin)['authToken'])")
# Live tool call feed
curl -N -H "Authorization: Bearer $TOKEN" http://localhost:PORT/stream
# Prometheus scrape
curl -H "Authorization: Bearer $TOKEN" http://localhost:PORT/metricsThe bridge instruments every tool call with OpenTelemetry spans. Tracing is zero-overhead when disabled (the default).
# Export traces to any OTLP-compatible collector (Jaeger, Datadog, Honeycomb, etc.)
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 claude-ide-bridge
OTEL_SERVICE_NAME=my-bridge claude-ide-bridge # optional service name overrideSpans are exported on process exit. No bridge code changes needed β the env var activates tracing automatically.
The bridge can spawn Claude subprocesses, queue tasks, and drive event-driven automation directly from VS Code events.
# Enable subprocess driver + event-driven automation with a policy file
claude-ide-bridge --workspace /path/to/project \
--claude-driver subprocess \
--automation \
--automation-policy ./automation-policy.json{
"onDiagnosticsError": {
"enabled": true,
"minSeverity": "error",
"prompt": "Fix the errors in {{file}}:\n{{diagnostics}}",
"cooldownMs": 30000
},
"onFileSave": {
"enabled": true,
"patterns": ["**/*.ts", "!node_modules/**"],
"prompt": "Review the saved file: {{file}}",
"cooldownMs": 10000
},
"onFileChanged": {
"enabled": true,
"patterns": ["**/*.ts"],
"prompt": "A file was edited: {{file}}. Run getDiagnostics to check for new errors.",
"cooldownMs": 15000
},
"onCwdChanged": {
"enabled": true,
"prompt": "Working directory changed to {{cwd}}. Call getBridgeStatus and getOpenEditors to orient.",
"cooldownMs": 10000
},
"onPostCompact": {
"enabled": true,
"prompt": "Context was compacted. Call getOpenEditors and getDiagnostics to rebuild your understanding of the current state.",
"cooldownMs": 60000
},
"onInstructionsLoaded": {
"enabled": true,
"prompt": "Call getToolCapabilities to confirm the bridge is connected and note which tools are available for this session."
},
"onTestRun": {
"enabled": true,
"onFailureOnly": true,
"prompt": "Tests failed ({{failed}}/{{total}}). Fix the failures:\n{{failures}}",
"cooldownMs": 15000
}
}When automation is active, VS Code save/change events, diagnostic errors, and Claude Code hook events automatically enqueue Claude tasks. Output streams to the "Claude IDE Bridge" output channel in real time.
Policy triggers:
| Trigger | When it fires | Key fields |
|---|---|---|
onDiagnosticsError |
VS Code reports new errors/warnings for a file | enabled, minSeverity (error/warning), prompt (supports {{file}} and {{diagnostics}}), cooldownMs |
onFileSave |
A file matching patterns is explicitly saved (Ctrl+S) |
enabled, patterns (minimatch globs), prompt (supports {{file}}), cooldownMs |
onFileChanged |
Any buffer edit on a matching file (unsaved changes, external writes) β CC 2.1.83+ | enabled, patterns (minimatch globs), prompt (supports {{file}}), cooldownMs |
onCwdChanged |
Claude Code's working directory changes β CC 2.1.83+; call via notifyCwdChanged tool from a CC CwdChanged hook |
enabled, prompt (supports {{cwd}}), cooldownMs |
onPostCompact |
Claude compacts its context (Claude Code 2.1.76+) | enabled, prompt, cooldownMs |
onInstructionsLoaded |
Claude loads CLAUDE.md at session start (Claude Code 2.1.76+) | enabled, prompt |
onTestRun |
runTests completes |
enabled, onFailureOnly (bool, default true), prompt (supports {{runner}}, {{failed}}, {{passed}}, {{total}}, {{failures}}), cooldownMs |
Cloud sessions: If
CLAUDE_CODE_REMOTE=true(Claude Code on the web), automation tasks will still enqueue but the bridge itself runs locally β those tasks will not execute. Guard policy prompts or theonInstructionsLoadedhook with an environment check if needed.
| Flag | Description |
|---|---|
--claude-driver <mode> |
subprocess | api | none (default: none) |
--claude-binary <path> |
Path to the claude binary (default: claude) |
--automation |
Enable event-driven automation |
--automation-policy <path> |
Path to JSON automation policy file |
| Tool | Description |
|---|---|
runClaudeTask |
Enqueue a Claude task with optional context files, streaming, and model override (model param, e.g. "claude-haiku-4-5-20251001") |
getClaudeTaskStatus |
Poll task status and output by task ID |
cancelClaudeTask |
Cancel a pending or running task |
listClaudeTasks |
List session-scoped tasks with optional status filter |
resumeClaudeTask |
Re-enqueue a completed or failed task by ID, preserving its original prompt, context files, and model |
A GET /tasks HTTP endpoint (Bearer-auth required) provides a sanitized task list for external monitoring.
Use with claude -p for automation:
# Fix all lint errors
claude -p "Use getDiagnostics to find all errors, then fix them" \
--mcp-config ./mcp-bridge.json
# Run tests and fix failures
claude -p "Run tests with runTests, fix any failures, and commit" \
--mcp-config ./mcp-bridge.json
# Generate architecture overview
claude -p "Map the project using getFileTree, getDocumentSymbols, and getCallHierarchy" \
--mcp-config ./mcp-bridge.json --output-format jsonWhen the bridge restarts, it picks up where it left off β restoring the set of files you had open in Claude's view of the workspace.
What's restored:
- Open file tracking (the set of files Claude was aware of across the last session's activity)
- Task queue β pending and running tasks survive bridge crashes and restarts (persisted to
~/.claude/ide/tasks-<port>.json) - Activity log β all tool calls from past sessions remain readable
What isn't restored:
- In-progress tool calls (those are cancelled on disconnect)
- Live diagnostics (always fetched fresh from the extension)
- Claude's own conversation context (that's Claude Code's responsibility, not the bridge's)
How it works: The bridge checkpoints session state every 30 seconds to ~/.claude/ide/. On startup, the first connecting Claude session is seeded with the union of all previously-tracked open files. No configuration needed β this is on by default.
Beta caveat: Checkpoint restore is file-list only. Full "resume from mid-task" support (restoring partial tool progress, re-streaming output) is not yet implemented.
Run the bridge on a remote server with no display β give Claude full IDE capabilities over SSH without opening a desktop environment.
Recommended: VS Code Remote-SSH or Cursor SSH
Connect your local VS Code, Cursor, or Windsurf to a VPS via Remote-SSH. The bridge extension runs in the remote extension host automatically β no extra setup. LSP, debugger, terminals, and all editor-state tools work normally because the extension and bridge run together on the server.
Windsurf SSH tip: Windsurf with an active SSH session counts as Remote-SSH β the extension loads on the VPS side and connects to the bridge. Confirm with
curl .../healthand look for"extension": true.
Fully headless (no IDE)
For servers with no VS Code at all:
# On the VPS β install Node.js 20 + the bridge
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
npm install -g claude-ide-bridge
# Generate a stable token (survives restarts β save this value)
export BRIDGE_TOKEN=$(uuidgen | tr '[:upper:]' '[:lower:]')
# Start the bridge in the background with tmux
tmux new-session -d -s bridge 'claude-ide-bridge --bind 0.0.0.0 --port 9000 --fixed-token $BRIDGE_TOKEN --workspace /path/to/project'
# Confirm the token
claude-ide-bridge print-token --port 9000# On your local machine β write an MCP config pointing at the VPS
# Run from inside your project directory (merges into the nearest .mcp.json)
bash scripts/gen-mcp-config.sh remote \
--host your-vps-ip:9000 \
--token <token-from-above> \
--writeAvailable tools in headless mode: file operations, git, terminals, search, CLI linters, dependency audits, HTTP client. LSP, debugger, and editor-state tools require the extension.
Stable tokens: Use
--fixed-token <uuid>(orCLAUDE_IDE_BRIDGE_TOKEN=<uuid>) to keep the same token across restarts. Without it, a new token is generated each time the bridge starts, requiring a config update.
VPS filesystem scope: A bridge running on a VPS serves that VPS's filesystem only. File tools (
readFile,writeFile,searchWorkspace, etc.) read and write files on the VPS β not on your local Mac. If you want Claude to work on files on your local machine, run the bridge locally (or use VS Code Remote-SSH, which runs both the extension and bridge on the VPS alongside your remote files).
Security:
--bind 0.0.0.0exposes the bridge to the network. Put nginx or Caddy in front with TLS before exposing to the internet. See docs/remote-access.md for a production Caddy setup.
| Editor | Status |
|---|---|
| VS Code | Supported |
| Windsurf | Supported |
| Cursor | Supported |
| Google Antigravity | Supported |
Install the extension in any supported editor:
# Auto-detect editor
claude-ide-bridge install-extension
# Specify editor
claude-ide-bridge install-extension windsurf
claude-ide-bridge install-extension cursor
# Or via the install script
bash scripts/install-extension.sh --ide <name>Run the bridge on a VPS with the IDE on your local machine β full tools, no compromise.
When you connect VS Code or Cursor to a VPS via SSH, the extension host runs on the VPS. The bridge extension runs there too β it spawns the bridge, polls lock files, and connects over VPS localhost. Nothing needs to change on your end.
Setup:
- Install the extension in VS Code/Cursor locally (it will auto-install on the VPS via SSH)
- Connect via Remote-SSH and open your VPS workspace
- The extension activates on the VPS, auto-installs
claude-ide-bridgeif needed, and starts the bridge - Claude Code on your local machine connects normally via the lock file
All tools are available β LSP, debugger, terminals, git, diagnostics β because the extension runs alongside the bridge on the same machine.
For VPS environments without VS Code (e.g. a pure server setup):
# On the VPS β start bridge with a stable token so it survives restarts
export BRIDGE_TOKEN=$(uuidgen | tr '[:upper:]' '[:lower:]')
tmux new-session -d -s bridge 'claude-ide-bridge --bind 0.0.0.0 --port 9000 --fixed-token $BRIDGE_TOKEN --workspace /path/to/project'
# Get the auth token
claude-ide-bridge print-token --port 9000# On your local machine β generate and write the MCP config
# Run from inside your project directory (merges into the nearest .mcp.json)
bash scripts/gen-mcp-config.sh remote \
--host your-vps-ip:9000 \
--token <token-from-above> \
--writeStable tokens:
--fixed-tokenkeeps the same token across bridge restarts so your local config stays valid. Without it, the token changes every restart.
Security:
--bind 0.0.0.0exposes the bridge to your network. For production, put nginx or Caddy in front with TLS. Theremoteconfig generator useshttp://β update the URL tohttps://once TLS is in place.
Available tools in headless mode: file operations, git, terminals, search, CLI linters, dependency audits, HTTP client. LSP, debugger, and editor-state tools are unavailable without the extension.
Connect the Claude Desktop app to your running bridge β chat with your IDE using natural language.
# Generate the config (prints to stdout)
bash scripts/gen-claude-desktop-config.sh
# Write it to the config file (backs up existing config)
bash scripts/gen-claude-desktop-config.sh --writeThen restart Claude Desktop once to load the new config. After that, the bridge's stdio shim handles everything automatically β it discovers the running bridge via lock files, buffers requests until connected, and reconnects transparently when the bridge restarts. No port or token needs to be hard-coded, and no further Desktop restarts are needed when the bridge restarts.
Tool availability: Without the VS Code extension connected, ~48 tools (debugger, LSP intelligence, editor state, decorations, refactoring) are unavailable. Claude Desktop works best alongside the running extension. You can verify connectivity by asking "What tools do you have available?" β the response will list what's active.
Debugging the shim: If the connection seems stuck, the shim logs to stderr. In Claude Desktop, check Settings β Developer β MCP Logs to see shim output. Common cause: bridge not running β start it with
claude-ide-bridge --watchfirst.
Try it: Open Claude Desktop and ask "What diagnostics are in my workspace?" or "What files are open in my IDE?"
You can also use the general config generator:
bash scripts/gen-mcp-config.sh claude-desktop --writeConfig location:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Dispatch is a Claude Desktop feature that lets you send instructions from your phone to your desktop Claude session. Combined with the bridge, you can check on your project, run tests, and review changes β all from a phone message.
Your Phone (Claude App)
β
βΌ terse instruction
Claude Desktop (main conversation)
β
βΌ MCP tool calls
Bridge Server βββΊ IDE Extension βββΊ Your Code
β
βΌ results
Claude Desktop
β
βΌ concise summary
Your Phone
Dispatch messages land in Claude Desktop's main conversation, which has full MCP bridge access. Claude calls the bridge tools, gathers results, and sends a summary back to your phone.
Not Cowork: Dispatch routes through the main conversation, not a Cowork session. All 130+ bridge tools are available. The Cowork tool-access limitation does not apply here.
