This guide explains how to configure language servers for the OMP coding agent.

Source of truth in code:

  • Server config type: packages/coding-agent/src/lsp/types.ts (ServerConfig)
  • Config loader: packages/coding-agent/src/lsp/config.ts
  • Built-in server definitions: packages/coding-agent/src/lsp/defaults.json

Auto-detection

When no LSP config file is present, OMP auto-detects servers by intersecting two conditions:

  1. The project directory contains at least one of the server’s rootMarkers.
  2. The server binary is available — checked in project-local bin directories first (e.g., node_modules/.bin/, .venv/bin/), then $PATH.

No configuration is required for common setups. The built-in server list covers most popular languages; see defaults.json for the full set.

Config file locations

OMP merges LSP config from multiple files, lowest to highest priority:

PriorityLocation
5 (lowest)~/lsp.json, ~/.lsp.json, ~/lsp.yaml, ~/.lsp.yaml, ~/lsp.yml, ~/.lsp.yml
4Plugin LSP configs (marketplace / --plugin-dir roots)
3User config dirs: ~/.omp/agent/lsp.*, ~/.claude/lsp.*, ~/.codex/lsp.*, ~/.gemini/lsp.*
2Project config dirs: <project>/.omp/lsp.*, <project>/.claude/lsp.*, <project>/.codex/lsp.*, <project>/.gemini/lsp.*
1 (highest)Project root: <project>/lsp.* and <project>/.lsp.*

Each location accepts .json, .yaml, and .yml variants, including hidden-file versions (.lsp.json, .lsp.yaml, .lsp.yml). Files are merged in order: higher-priority files override lower-priority fields for the same server. Servers not mentioned in any override file remain at their built-in defaults.

Recommended locations:

  • User-wide preferences → ~/.omp/agent/lsp.json
  • Project-specific overrides → <project>/.omp/lsp.json

Note: Auto-detection is skipped only when at least one config file contributes server overrides. A config file that only sets idleTimeoutMs still lets OMP auto-detect built-in servers. When server overrides exist, OMP merges them with defaults and then loads servers that have matching rootMarkers, an available binary, and are not explicitly disabled.

File shape

Both JSON and YAML are accepted. The top-level object can use either a servers wrapper key or a flat map directly:

{
  "servers": {
    "server-name": { ... }
  },
  "idleTimeoutMs": 300000
}

or (flat, without the servers wrapper):

{
  "server-name": { ... },
  "idleTimeoutMs": 300000
}

Top-level keys:

  • servers — map of server name to ServerConfig (optional wrapper; flat form is equivalent)
  • idleTimeoutMs — shut down idle language servers after this many milliseconds; disabled by default

ServerConfig fields

FieldTypeRequiredDescription
commandstringyesBinary name (resolved via PATH/local bins) or absolute path
argsstring[]noArguments passed to the binary
fileTypesstring[]yesFile extensions this server handles, e.g. [".ts", ".tsx"]
rootMarkersstring[]yesFiles/dirs that indicate a project root; glob patterns (e.g. *.cabal) are supported
initOptionsobjectnoSent as initializationOptions during LSP handshake
settingsobjectnoWorkspace settings pushed via workspace/didChangeConfiguration
disabledbooleannoSet to true to disable this server entirely
warmupTimeoutMsnumbernoStartup timeout in ms for this server (overrides the global default)
isLinterbooleannoMark server as linter/formatter only; excluded from type-intelligence operations (hover, go-to-definition, etc.)
capabilitiesobjectnoOpt-in server-specific features; see Capabilities

resolvedCommand is populated automatically at runtime — do not set it manually.

Capabilities

The capabilities object enables optional server-specific features that OMP supports on a per-server basis:

{
  "capabilities": {
    "flycheck": true,
    "ssr": true,
    "expandMacro": true,
    "runnables": true,
    "relatedTests": true
  }
}

All fields are boolean and optional. They are currently used by rust-analyzer.

Common recipes

Override a built-in server’s settings

Partial overrides are merged onto the built-in defaults. You only need to specify the fields you want to change.

{
  "servers": {
    "typescript-language-server": {
      "args": ["--stdio", "--log-level", "4"]
    }
  }
}
servers:
  gopls:
    settings:
      gopls:
        gofumpt: false
        staticcheck: false

Disable a built-in server

{
  "servers": {
    "eslint": {
      "disabled": true
    }
  }
}

Register a custom server

New servers require command, fileTypes, and rootMarkers. All other fields are optional.

{
  "servers": {
    "my-lsp": {
      "command": "my-lsp-server",
      "args": ["--stdio"],
      "fileTypes": [".xyz"],
      "rootMarkers": [".xyz-project", ".git"]
    }
  }
}

Set a global idle timeout

Shut down language servers that have been inactive for more than five minutes:

{
  "idleTimeoutMs": 300000
}

Disable a server for one project, keep it globally

Place the override in <project>/.omp/lsp.json:

{
  "servers": {
    "pylsp": {
      "disabled": true
    }
  }
}

The user-level config in ~/.omp/agent/lsp.json is unaffected; pylsp is only suppressed in this project.

Built-in server list

The following servers ship in defaults.json and are eligible for auto-detection:

Server keyLanguage(s)Binary
rust-analyzerRustrust-analyzer
clangdC, C++, ObjCclangd
zlsZigzls
goplsGogopls
typescript-language-serverTypeScript, JavaScripttypescript-language-server
denolsTypeScript, JavaScript (Deno)deno
biomeTS/JS/JSON (linter)biome
eslintTS/JS/Vue/Svelte (linter)vscode-eslint-language-server
vscode-html-language-serverHTMLvscode-html-language-server
vscode-css-language-serverCSS, SCSS, Lessvscode-css-language-server
vscode-json-language-serverJSONvscode-json-language-server
tailwindcssHTML, CSS, TS/JStailwindcss-language-server
svelteSveltesvelteserver
vue-language-serverVuevue-language-server
astroAstroastro-ls
pyrightPythonpyright-langserver
basedpyrightPythonbasedpyright-langserver
pylspPythonpylsp
ruffPython (linter)ruff
jdtlsJavajdtls
kotlin-lspKotlinkotlin-lsp
metalsScalametals
hlsHaskellhaskell-language-server-wrapper
ocamllspOCamlocamllsp
elixirlsElixirelixir-ls
expertElixirexpert
erlanglsErlangerlang_ls
gleamGleamgleam
solargraphRubysolargraph
ruby-lspRubyruby-lsp
rubocopRuby (linter)rubocop
bashlsBash, Zshbash-language-server
lua-language-serverLualua-language-server
intelephensePHPintelephense
phpactorPHPphpactor
omnisharpC#omnisharp
yamllsYAMLyaml-language-server
terraformlsTerraformterraform-ls
dockerlsDockerfiledocker-langserver
helm-lsHelmhelm_ls
nixdNixnixd
nilNixnil
olsOdinols
dartlsDartdart
marksmanMarkdownmarksman
texlabLaTeXtexlab
graphqlGraphQLgraphql-lsp
prismalsPrismaprisma-language-server
vimlsVim scriptvim-language-server
emmet-language-serverHTML, CSS, JSXemmet-language-server
sourcekit-lspSwiftsourcekit-lsp
swiftlintSwift (linter)swiftlint
tlaplusTLA+tlapm_lsp