Skip to content

LSP Integration

BMO includes a built-in LSP client that connects to language servers over stdio. This enables live diagnostics, reference lookup, and ripple-impact analysis during agent sessions.

[lsp.go]
command = "gopls"
[lsp.go.env]
GOTOOLCHAIN = "go1.24.5"
[lsp.typescript]
command = "typescript-language-server"
args = ["--stdio"]
[lsp.nix]
command = "nil"

When language servers are configured, the agent has access to:

ToolDescription
lsp_diagnosticsGet live errors and warnings from the language server
lsp_symbols_overviewInspect the semantic symbol tree for a file
lsp_find_symbolSearch for symbols across the workspace
lsp_referencesFind all references to a symbol
lsp_rename_symbolRename a symbol semantically across declarations and references
lsp_replace_symbol_bodyReplace an entire symbol body using an exact semantic selector
lsp_insert_before_symbolInsert content immediately before a symbol
lsp_insert_after_symbolInsert content immediately after a symbol
lsp_ripple_impactGet a ranked list of files that reference recently changed symbols
lsp_restartRestart a language server (useful after large refactors)
get_lsp_statusReturn the shared in-process LSP status snapshot
list_recent_lsp_eventsReturn the lower-level metadata-only recent-event ring
  • bmo config show-lsp is a detached config-only read. It shows config-driven enablement and readiness projection, but it does not claim access to another runtime’s live LSP ring.
  • Live in-process status is available through TUI /lsp and agent tool get_lsp_status.
  • list_recent_lsp_events remains the lower-level metadata-only event export.

By default, BMO automatically detects root markers (e.g. go.mod, package.json, Cargo.toml) and starts the appropriate language server. Disable this with:

[options]
auto_lsp = false

After each write, edit, or multiedit, BMO calls lsp_ripple_impact to find files that reference the changed symbols. The agent receives a ranked list of potentially affected files and can proactively inspect and update them.

This surfaces cross-file breakages before the build fails.

Enable verbose LSP logging in config:

[options]
debug_lsp = true