Skip to content

Language Support

Install reference

Language Server Install
TypeScript / JavaScript typescript-language-server npm i -g typescript-language-server typescript
Python pyright-langserver npm i -g pyright
Go gopls go install golang.org/x/tools/gopls@latest
Rust rust-analyzer rustup component add rust-analyzer
C / C++ clangd apt install clangd / brew install llvm
Ruby solargraph gem install solargraph
PHP intelephense npm i -g intelephense
Java jdtls eclipse.jdt.ls snapshots
YAML yaml-language-server npm i -g yaml-language-server
JSON vscode-json-language-server npm i -g vscode-langservers-extracted
Dockerfile docker-langserver npm i -g dockerfile-language-server-nodejs
C# csharp-ls dotnet tool install -g csharp-ls
Kotlin kotlin-language-server GitHub releases
Lua lua-language-server GitHub releases
MQL4 / MQL5 mql-lsp-server GitHub releases
Luau luau-lsp GitHub releases
Swift sourcekit-lsp Ships with Xcode / Swift toolchain
Zig zls GitHub releases (match Zig version)
CSS vscode-css-language-server npm i -g vscode-langservers-extracted
HTML vscode-html-language-server npm i -g vscode-langservers-extracted
Terraform terraform-ls releases.hashicorp.com
Scala metals cs install metals (Coursier)
Gleam gleam (built-in) GitHub releases
Elixir elixir-ls GitHub releases
Prisma prisma-language-server npm i -g @prisma/language-server
SQL sqls go install github.com/sqls-server/sqls@latest
Clojure clojure-lsp GitHub releases
Nix nil GitHub releases
Dart dart language-server Ships with Dart SDK (brew install dart)
MongoDB mongodb-language-server npm i -g @mongodb-js/mongodb-language-server

MQL (mql-lsp-server)

agent-lsp auto-detects servers on PATH, so installing MQL support is just placing the self-contained binary there — no .NET runtime required:

curl -fsSL https://github.com/davalillo/mql-language-server/releases/latest/download/mql-lsp-server-linux-x64 \
  -o ~/.local/bin/mql-lsp-server
chmod +x ~/.local/bin/mql-lsp-server
mql-lsp-server --version   # verify: "MQL Language Server 2.4.2" or newer

Assets for other platforms are in the same release: mql-lsp-server-win-x64.exe (rename to mql-lsp-server.exe), mql-lsp-server-osx-x64, mql-lsp-server-osx-arm64. If you already have the .NET 10 SDK, dotnet tool install -g mql-language-server installs the same mql-lsp-server command. Verify with agent-lsp doctor.


CI tool coverage matrix

Tier 1 (start_lsp, open_document, get_diagnostics, inspect_symbol) verified for all 32 languages. Tier 2: 34 additional tools.

Language Tier 1 symbols definition references completions workspace format declaration type_hierarchy hover call_hier sem_tok sig_help
TypeScript pass pass pass pass pass pass pass pass — pass pass pass pass
Python pass pass pass pass pass pass — — — pass pass pass —
Go pass pass pass pass pass pass pass — — pass pass pass pass
Rust pass pass pass pass pass pass pass — — pass pass pass —
Java pass — — — — — — — pass pass pass — —
C pass pass pass pass pass pass pass pass — pass pass pass —
PHP pass pass pass pass pass pass — — — pass pass pass pass
C++ pass pass pass pass pass pass pass pass — pass pass pass —
JavaScript pass pass pass pass pass pass pass pass — pass pass pass —
Ruby pass pass pass pass pass pass pass — — pass pass pass pass
YAML pass — — — pass pass pass — — pass — — —
JSON pass — — — pass pass pass — — pass — — —
Dockerfile pass — — — pass pass — — — pass — — —
C# pass pass pass pass pass pass pass — — pass pass pass pass
Kotlin pass pass pass pass pass pass pass — — pass pass pass pass
Lua pass pass — — pass pass pass — — pass pass pass pass
Luau pass pass pass pass pass pass — — — pass — pass —
Swift pass pass pass pass pass pass pass — — pass — pass —
Zig pass pass pass pass pass fail pass — — pass — pass pass
CSS pass pass — — pass pass pass — — pass — — —
HTML pass — — — pass pass pass — — pass — — —
Terraform pass pass pass — pass pass pass — — pass — — —
Scala pass pass pass pass pass pass pass — — pass — pass —
Gleam pass pass pass pass pass fail pass — — pass — — —
Elixir pass fail pass pass pass pass pass — — pass pass — pass
Prisma pass pass pass pass — — pass — — pass — — —
SQL pass pass pass pass pass pass — — — pass — — —
Clojure pass pass pass pass pass pass pass — — pass — — —
Nix pass pass — — pass pass — — — pass — — —
Dart pass pass pass pass pass pass pass — — pass — — —
MongoDB pass — — — pass pass — — — pass — — —
MQL pass pass pass pass pass pass — — — pass — — —

Note: MQL references and rename via mql-lsp-server are name-based (not type-resolved). This limitation is tracked upstream (davalillo/mql-language-server#45).

See ci-notes.md for per-language CI quirks.


Current (32 languages, CI-tested)

stable = all Tier 1 tools pass CI. experimental = server works but CI results are informational.

Language Language Server Status
TypeScript typescript-language-server stable
Python pyright-langserver stable
Go gopls stable
Rust rust-analyzer stable
Java jdtls flaky (cold-start indexing)
C clangd stable
PHP intelephense stable
C++ clangd stable
JavaScript typescript-language-server stable
Ruby solargraph stable
YAML yaml-language-server stable
JSON vscode-json-language-server stable
Dockerfile docker-langserver stable
C# csharp-ls stable
Kotlin kotlin-language-server stable
Lua lua-language-server stable
Luau luau-lsp stable
Swift sourcekit-lsp stable (macos-latest runner)
Zig zls stable
CSS vscode-css-language-server stable
HTML vscode-html-language-server stable
Terraform terraform-ls stable
Scala metals experimental
Gleam gleam (built-in lsp) stable
Elixir elixir-ls experimental
Prisma prisma-language-server experimental
SQL sqls stable (postgres:16 service container)
Clojure clojure-lsp stable
Nix nil experimental
Dart dart language-server stable
MongoDB mongodb-language-server experimental
MQL mql-lsp-server experimental (name-based references/rename)

CI job structure

Job Languages Runner
multi-lang-core Go, TypeScript, Python, Rust, Kotlin ubuntu-latest
multi-lang-java Java ubuntu-latest (continue-on-error)
multi-lang-extended C, C++, JavaScript, PHP, Ruby, YAML, JSON, Dockerfile, C#, CSS, HTML ubuntu-latest
multi-lang-zig Zig ubuntu-latest
multi-lang-terraform Terraform ubuntu-latest
multi-lang-lua Lua ubuntu-latest
multi-lang-mql MQL ubuntu-latest
multi-lang-luau Luau ubuntu-latest
multi-lang-swift Swift macos-latest
multi-lang-scala Scala ubuntu-latest (continue-on-error)
multi-lang-gleam Gleam ubuntu-latest
multi-lang-elixir Elixir ubuntu-latest (continue-on-error)
multi-lang-prisma Prisma ubuntu-latest (continue-on-error)
multi-lang-sql SQL ubuntu-latest (postgres:16 service)
multi-lang-clojure Clojure ubuntu-latest
multi-lang-nix Nix ubuntu-latest (continue-on-error)
multi-lang-dart Dart ubuntu-latest
multi-lang-mongodb MongoDB ubuntu-latest (continue-on-error)
speculative-test Go, TypeScript, Python, Rust, C++, C#, Dart, Java (speculative sessions) ubuntu-latest

Adding a language: what's required

Each new language needs three things:

  1. langConfig entry in test/multi_lang_test.go buildLanguageConfigs():
  2. binary (language server executable name)
  3. serverArgs (e.g. []string{"--stdio"})
  4. fixture directory path
  5. file path (primary fixture file)
  6. hoverLine/hoverColumn: position of a named symbol in the primary file
  7. definitionLine/definitionColumn: position of a symbol whose definition is in secondFile
  8. referenceLine/referenceColumn: position to query for references
  9. completionLine/completionColumn: position inside a method call for completions
  10. workspaceSymbol: a symbol name that workspace symbol search should return
  11. secondFile: cross-file fixture (for definition + references across files)
  12. supportsFormatting: whether the server formats documents
  13. declarationLine/declarationColumn: optional, for C-style go_to_declaration
  14. highlightLine/highlightColumn: position for document highlight testing
  15. inlayHintEndLine: end line for inlay hint range
  16. renameSymbolLine/renameSymbolColumn/renameSymbolName: position and new name for rename testing (set to 0 to skip)
  17. codeActionLine/codeActionEndLine: line range for code action testing

  18. Fixture files in test/fixtures/<lang>/:

  19. A primary file with a Person class/struct (or similar named symbol)
  20. A greeter cross-file that imports and calls Person
  21. A build/project file if the language server requires one (e.g. go.mod, build.zig, Package.swift, build.sbt)
  22. Follow the pattern of existing fixtures (hover target, definition cross-ref, completion context)

  23. CI install step in the appropriate .github/workflows/ci.yml job:

  24. JVM-based: Java → multi-lang-java, Kotlin → multi-lang-core
  25. Lightweight npm/binary → multi-lang-extended
  26. macOS-only → dedicated job with runs-on: macos-latest
  27. Heavy/slow startup → dedicated job with continue-on-error: true
  28. Everything else → dedicated job (keeps extended job install time bounded)

Tier 3: next expansion candidates

Bash (bash-language-server)

  • Install: npm install -g bash-language-server
  • Binary: bash-language-server, language ID shellscript
  • Fixture: test/fixtures/bash/, simple script with functions
  • Notes: Good hover and completions. Definition/references limited.

Haskell (haskell-language-server)

  • Install: ghcup install hls (slow and fragile in CI)
  • Blocker: ghcup setup adds 5+ minutes; GHC version matrix complexity

Tier 4: complex / skip for now

Language Server Blocker
Haskell haskell-language-server ghcup setup is slow and fragile in CI
OCaml ocamllsp opam setup nontrivial
Elm elm-language-server Niche; requires elm + elm-format
R r-languageserver Niche; R package install in CI adds complexity

Language expansion summary

Tier Languages Count
Current TypeScript, Python, Go, Rust, Java, C, PHP, C++, JavaScript, Ruby, YAML, JSON, Dockerfile, C#, Kotlin, Lua, Luau, Swift, Zig, CSS, HTML, Terraform, Scala, Gleam, Elixir, Prisma, SQL, Clojure, Nix, Dart, MongoDB, MQL 32
Tier 3 candidates Bash 1
Potential total 33

The 32-language set covers systems, web, JVM, scripting, infrastructure, config, functional, schema, query, document-database, Nix/functional-package-manager, and MQL (MetaTrader) domains.