The problem we started with
Ask an AI coding agent who calls a function and it reaches for text: grep for exact matches, embeddings for fuzzy ones. Both answer a question about strings. The question you asked was about symbols. So the agent gets an unrelated helper with the same name, misses the real call site behind an interface, and fills the gap from training data instead of from your repository.
Source code is not unstructured text. It is a deterministic graph: calls, imports, types, definitions, references. Compilers have traversed that graph for decades. Travsr builds the same graph, keeps it in step with your commits, and hands it to your agent over MCP so the agent walks real edges instead of guessing from chunks.
How it works
Two passes build the graph. Tree-sitter parses every file into an AST for instant structural nodes and edges, across all supported languages. LSIF-style analysis then adds the deeper semantic edges, call graphs and cross-file references, per language. Every node carries a Kythe VName, a stable identity that survives renames, re-indexing and repository boundaries, so a symbol stays the same symbol.
Retrieval is graph traversal, not vector similarity. A query starts as a BFS from the symbols it mentions, is ranked with Personalized PageRank, and is trimmed to the smallest connected subgraph that still answers the question with a Prize-Collecting Steiner Tree, then fitted to the token budget. What comes back is a connected slice of your codebase, not a pile of loosely similar snippets.
What is shipped today
- 16 languages parsed structurally, with semantic call edges built in for TypeScript/JavaScript, Rust and Python and installable per language for the rest.
- The MCP server, with tools for dependencies, callers, references, blast radius, execution paths, repo maps, snippets and index health.
- The CLI and daemon:
travsr initindexes a repo, installs the git hook, and wires up whichever MCP client you already have. - A VS Code extension on both the Marketplace and Open VSX.
Hosted cloud indexing and team repositories are in progress. The public roadmap tracks what is shipped, what is being built, and what is still just a plan.
What we hold to
Algorithms first, LLM last
Graph algorithms decide what is related to what. A language model never determines an edge, so the structure an agent reads is the structure the compiler sees.
Always fresh
A git post-commit hook re-indexes only what changed, keyed by a SHA-256 delta. There is no nightly embedding job drifting behind HEAD. Staleness is treated as a bug.
Local first
The graph is a SQLite file in your repo. Indexing, retrieval and the MCP server all run on your machine, and your code stays there unless you opt into a cloud tier.
MCP is the interface
No REST API to wrap, no plugin per editor. Travsr speaks the Model Context Protocol, so any MCP client (Claude, Copilot, Cursor) queries the same graph.
Open source
Travsr is Apache-2.0 licensed and developed in the open at github.com/Travsr-com/travsr. Issues, discussions and pull requests are all welcome, and the architecture docs describe the indexer, store, retrieval and MCP layers in the same terms the code uses.
Questions, feedback, or something that should work and does not? Get in touch.