Language capability matrix
trace-mcp ships 81 language plugins. They are not equally deep, and this
page says how deep each one is. Every language in the list gets symbol
extraction; call graphs and type edges are a much smaller set. For what each
language’s framework integrations understand on top of that, see supported
frameworks; for the include globs referenced
below, see configuration.
- indexed with the default config: 78 (the rest need an
includeentry — see below) - tree-sitter parser: 29 · regex parser: 46 · custom parser: 6
- import edges: 13
- call edges (
get_call_graph, call-awarefind_usages): 3 - type / inheritance edges: 2
- covered by a plugin test: 66
What the columns mean
| Column | Meaning |
|---|---|
| Parser | tree-sitter — real grammar-based AST. regex — pattern extraction, no AST. custom — hand-written parser for a structured format. |
| Default | The shipped default include globs reach files with this extension. Where this is empty the plugin only runs once you add the extension to include in .trace-mcp.json. |
| Imports | Import statements are resolved into graph edges. Plugins outside this set still parse imports, but nothing turns them into edges yet. |
| Calls | A call-graph resolver exists, so “who calls this” is answerable for this language. |
| Types | Type-annotation or inheritance edges are resolved. |
| Tests | At least one test exercises this plugin directly. |
Default config vs. plugin count. The default include is one global glob
over every extension the plugins below claim, so 78 of
the 81 plugins run wherever their files live in the repo — no
directory anchoring. The remaining 3
are pure data formats, left out because lockfiles, fixtures and .svg would
swamp the index for little symbol value. Ask for them explicitly if you want
them:
{ "include": ["schemas/**/*.json", "k8s/**/*.xml"] }
Note that include in a project config replaces the built-in list rather
than adding to it, so copy the default glob alongside your addition if you
still want the rest of the repo indexed.
A regex plugin still gives you working search, get_outline and symbol
navigation — that covers most “find it and read it” work. What it does not give
you is a call graph: that needs an AST plus a per-language resolver. Where the
Calls column is empty, get_call_graph returns nothing for that language
unless you enable LSP enrichment (lsp.enabled: true) or ingest a SCIP index.
Imports means edges, not parsing. Most plugins extract import statements;
far fewer have a pipeline pass that resolves the specifier to a target node, and
without one the extracted import never becomes an edge. This column counts the
second thing, so it is much shorter than the language list — see
src/indexer/edge-resolvers/import-capable-languages.ts.
Matrix
| Language | Extensions | Parser | Default | Imports | Calls | Types | Tests |
|---|---|---|---|---|---|---|---|
| ada | .adb .ads .ada | regex (multi-pass) | yes | — | — | — | yes |
| al | .al | regex | yes | — | — | — | yes |
| apex | .cls .trigger .apex | regex (multi-pass) | yes | — | — | — | yes |
| assembly | .asm .s .S | regex | yes | — | — | — | yes |
| astro | .astro | tree-sitter | yes | — | — | — | yes |
| autohotkey | .ahk .ah2 | regex | yes | — | — | — | yes |
| bash | .sh .bash .zsh | tree-sitter | yes | — | — | — | yes |
| blade | .blade.php | regex | yes | — | — | — | yes |
| c | .c .h | tree-sitter | yes | — | — | — | yes |
| clojure | .clj .cljs .cljc .edn | regex | yes | — | — | — | — |
| cmake | .cmake CMakeLists.txt | regex | yes | — | — | — | — |
| cobol | .cob .cbl .cpy .cobol | regex (multi-pass) | yes | — | — | — | yes |
| common-lisp | .lisp .lsp .cl .asd | regex (multi-pass) | yes | — | — | — | yes |
| cpp | .cpp .cxx .cc .hpp | tree-sitter | yes | — | — | — | yes |
| csharp | .cs | tree-sitter | yes | — | — | — | yes |
| css | .css .scss .sass .less | tree-sitter | yes | yes | — | — | yes |
| cuda | .cu .cuh | regex | yes | — | — | — | — |
| d | .d .di | regex (multi-pass) | yes | — | — | — | yes |
| dart | .dart | tree-sitter | yes | — | — | — | yes |
| dockerfile | Dockerfile .dockerfile | regex | yes | — | — | — | yes |
| ejs | .ejs | regex | yes | — | — | — | yes |
| elisp | .el .elc | tree-sitter | yes | — | — | — | — |
| elixir | .ex .exs | tree-sitter | yes | — | — | — | yes |
| elm | .elm | tree-sitter | yes | — | — | — | — |
| erlang | .erl .hrl | regex | yes | — | — | — | yes |
| form | .frm .prc .h | regex | yes | — | — | — | — |
| fortran | .f .f90 .f95 .f03 | regex | yes | — | — | — | yes |
| fsharp | .fs .fsi .fsx | regex (multi-pass) | yes | — | — | — | — |
| gdscript | .gd | regex | yes | — | — | — | yes |
| gleam | .gleam | regex | yes | — | — | — | yes |
| glsl | .glsl .vert .frag .geom | regex | yes | — | — | — | — |
| go | .go | tree-sitter | yes | yes | — | — | yes |
| graphql | .graphql .gql | custom | yes | — | — | — | yes |
| groovy | .groovy .gradle .gvy | regex | yes | — | — | — | yes |
| haskell | .hs .lhs | regex | yes | — | — | — | yes |
| hcl | .tf .hcl .tfvars | custom | yes | yes | — | — | yes |
| html | .html .htm | tree-sitter | yes | yes | — | — | yes |
| ini | .ini .cfg .conf .properties | regex | — | — | — | — | — |
| java | .java | tree-sitter | yes | yes | — | — | yes |
| json | .json .jsonc .json5 | tree-sitter | — | — | — | — | yes |
| julia | .jl | regex | yes | — | — | — | yes |
| kotlin | .kt .kts | tree-sitter | yes | — | — | — | yes |
| lean | .lean | regex | yes | — | — | — | — |
| lua | .lua .luau | tree-sitter | yes | — | — | — | yes |
| magma | .m .mag .magma | regex | yes | — | — | — | — |
| makefile | Makefile makefile .mk GNUmakefile | regex | yes | — | — | — | — |
| markdown | .md .mdx .markdown .qmd | custom | yes | yes | — | — | yes |
| matlab | .m .mlx .mat | regex (multi-pass) | yes | — | — | — | yes |
| meson | meson.build meson_options.txt | regex | yes | — | — | — | — |
| nim | .nim .nims .nimble | regex | yes | — | — | — | yes |
| nix | .nix | regex | yes | — | — | — | yes |
| objc | .m .mm | tree-sitter | yes | — | — | — | yes |
| ocaml | .ml .mli | tree-sitter | yes | — | — | — | yes |
| pascal | .pas .dpr .dpk .lpr | regex (multi-pass) | yes | — | — | — | yes |
| perl | .pl .pm .t | regex | yes | — | — | — | yes |
| php | .php | tree-sitter | yes | yes | yes | — | yes |
| plsql | .pls .plb .pck .pkb | regex (multi-pass) | yes | — | — | — | yes |
| powershell | .ps1 .psm1 .psd1 | regex (multi-pass) | yes | — | — | — | yes |
| prisma | .prisma | custom | yes | — | — | — | yes |
| protobuf | .proto | regex | yes | — | — | — | yes |
| python | .py .pyi | tree-sitter | yes | yes | yes | yes | yes |
| r | .r .R .Rmd | regex | yes | — | — | — | yes |
| ruby | .rb .rake | tree-sitter | yes | — | — | — | yes |
| rust | .rs | tree-sitter | yes | yes | — | — | yes |
| scala | .scala .sc | tree-sitter | yes | — | — | — | yes |
| solidity | .sol | tree-sitter | yes | — | — | — | yes |
| sql | .sql | regex | yes | — | — | — | yes |
| svelte | .svelte | regex | yes | — | — | — | yes |
| swift | .swift | tree-sitter | yes | — | — | — | yes |
| tcl | .tcl .tk .itcl .itk | regex (multi-pass) | yes | — | — | — | yes |
| toml | .toml | tree-sitter | yes | — | — | — | yes |
| typescript | .ts .tsx .mts .cts | tree-sitter | yes | yes | yes | yes | yes |
| verilog | .v .sv .svh .vh | regex | yes | — | — | — | yes |
| verse | .verse | regex | yes | — | — | — | yes |
| vhdl | .vhd .vhdl .vho .vhs | regex | yes | — | — | — | yes |
| vimscript | .vim .vimrc | regex | yes | — | — | — | — |
| vue | .vue | tree-sitter | yes | yes | — | — | yes |
| wolfram | .wl .wls .m .nb | regex | yes | — | — | — | — |
| xml | .xml .xul .xsl .xslt | custom | — | yes | — | — | yes |
| yaml | .yaml .yml | custom | yes | yes | — | — | yes |
| zig | .zig .zon | tree-sitter | yes | — | — | — | yes |
Last updated: August 30, 2026