[#5] Cross-client support (Cursor / Windsurf / VS Code) #5
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
BCC only discovers Claude Desktop and Claude Code. Research found this is a widely felt pain point — "each client has a different config file, a different path, and different behavior when something breaks." Config locations:
~/.cursor/mcp.jsonor per-project.cursor/mcp.json~/.codeium/windsurf/mcp_config.jsonserverstop-level key (notmcpServers) — a real structural difference, not just a path differenceThis is the headline feature of the leading competing tool (
mcp-manager, 73 stars): "changes are automatically synced between Claude and Cursor."Proposed solution
discover_profiles()to scan for Cursor and Windsurf configs alongside the existing Claude Desktop scan.servers↔mcpServerson read/write (since BCC's internal model is keyed onmcpServers).Acceptance criteria
~/.cursor/mcp.json) and Windsurf configs appear in the profile dropdown alongside Claude ones.serverskey round-trips correctly through load → edit → save.Relevant code
bcc_core.py::discover_profiles(line 83)bcc_core.py::app_support_base(line 74)bcc_core.py::extract_servers/apply_serversScope/scheduling note (AJ): this is a behemoth — it gets its own branch, and it's a candidate to punt past the next release. Intent is to hold it until the app works exactly the way we want for the existing single-client (Claude Desktop / Claude Code) experience; cross-client generalization shouldn't happen on top of a UX that's still moving. Leaving it open and P1-labeled, but treat it as deferred / revisit-later, not next-release scope.
Design pass (Cowork supervisor)
The core problem
BCC currently hard-codes Claude's layout:
mcpServers(+ our_disabledMcpServersparking key) in specific file locations. Other clients differ in path, top-level key, and sometimes schema:claude_desktop_config.jsonmcpServers~/.claude.json(user), project.mcp.jsonmcpServers~/.cursor/mcp.json(global), project.cursor/mcp.jsonmcpServers~/.codeium/windsurf/mcp_config.jsonmcpServers.vscode/mcp.json/ usersettings.jsonserverstype, input variables)Proposed architecture: a client-adapter model
Introduce a
ClientSpec(adapter) that captures everything client-specific:label, config-path discovery (global + project),servers_key("mcpServers"vs"servers"),disabled_key(our parking key; may be per-client or unsupported),to_internal(raw) / from_internal(entries)translation to/from BCC'sServerEntrymodel.Everything else (the editor, tables, validation, backups, stale-file check, secret masking) works against the internal model and stays unchanged. The cardinal rule generalizes cleanly: the selective-write path already only rewrites the servers block + preserves every other key verbatim — parameterize it by
servers_keyand it holds for every client.Discovery
Extend
discover_profiles()to also scan each client's known locations; project-scoped files (Cursor/VS Code/Claude Code) can be surfaced via the existing "Add config…" and/or auto-detected in a user-chosen project dir.Phasing (de-risked — do the refactor before adding clients)
mcpServersschema, only new paths → low risk.serverskey + schema translation (type/inputs) → highest risk, do last, with its own translation layer + tests.Risks / notes
typemodel is the only real schema-translation work; keep it isolated in that adapter..mcp.jsondiscovery overlaps with a separate idea I flagged (auto-detecting Claude Code project configs) — worth unifying.Open decisions for you
This one is a genuine multi-PR effort (the issue rightly calls it a behemoth). If you greenlight phase 1, it's a well-bounded subagent task on its own branch.
Design pass (2026-07-12) — proposed for next week's release
Model: client adapters over the existing Profile system. A client =
{label, per-platform config paths, discovery rule, shape adapter}. BCC's whole pipeline (load → extract → edit → apply → atomic write with backups) already only assumes "JSON file with a servers map", so most of the work is discovery + one shape translation.Phase 1 — Cursor + Windsurf (low risk, same shape):
~/.cursor/mcp.json(global) and<project>/.cursor/mcp.json— top-levelmcpServers, byte-compatible with what BCC edits today.~/.codeium/windsurf/mcp_config.json— alsomcpServers.discover_profiles()(labels "Cursor", "Windsurf"), gate Desktop-only actions (Restart button already gated by filename).Copy to ▸across clients then works for free. Project-scope Cursor configs can reuse the #53 pattern once we have a project list source (start with Add config… only).mcpServers+ bcc keys, preserve the rest).Phase 2 — VS Code (shape translation):
.vscode/mcp.json/ usersettings.jsonuse a different shape:{"servers": {name: {...}}}, withtypevalues and input-variable placeholders (${input:...}).ShapeAdapterpair (to_entries(cfg)/apply_entries(cfg, servers)) keyed off the profile; identity adapter for everything current, VS Code adapter mappingservers⇄mcpServersand leavinginputsuntouched.settings.jsonis JSONC — the existing repair pipeline already strips comments, but we must not rewrite the whole settings.json (it's shared with everything else in VS Code); v1: support.vscode/mcp.jsonand the dedicated usermcp.jsononly, explicitly skipsettings.json-embedded config.Suggested sequencing: Phase 1 lands early next week (small, testable), Phase 2 as its own PR behind it. Naming/rebrand question stays deferred per the recorded decision until this actually ships.