Choose Bifrost
Bifrost has several interfaces because editor navigation, agent tools, structural queries, and embedded analysis have different jobs. Start with the question you need to answer, then choose where you want to answer it.
Start With The Analysis
Section titled “Start With The Analysis”| Your question | Start with | Why |
|---|---|---|
| “Where is this known symbol defined or referenced?” | search_symbols, then a mode-specific definition or usage tool | These tools preserve declaration identity, aliases, imports, and language-specific resolution. |
| “Which code has this syntactic shape?” | query_code | It matches normalized calls, declarations, assignments, imports, literals, containment, and typed graph steps across languages. |
| “Which declarations call, use, inherit from, or import this result?” | A query_code typed pipeline | Start with a structural match, then traverse exact indexed declarations, reference/call edges, hierarchy, ownership, or project-file imports. |
| “What value can this receiver denote, or which exact member does it select?” | receiver_targets, points_to, or member_targets | Returns a bounded receiver_analysis row with explicit precision, ambiguity, unsupported, and budget outcomes for each input. |
| “Can selected untrusted values reach selected sensitive operations?” | A taint .rqlp policy | Compiles typed source and sink sets into compatible shared solves, then reports actual meetings with bounded witnesses and explicit completeness. |
| “Can this resource or API reach an invalid lifecycle state?” | A typestate policy or registered typestate query | Runs a finite-state protocol over the bounded interprocedural semantic graph and preserves uncertainty and terminal obligations. |
| “Where does this literal string occur?” | A text-search tool | Text search is the honest choice when the question is textual rather than structural or semantic. |
| “Can Bifrost prove path feasibility, complete whole-program points-to, or general unbounded aliasing?” | Do not use the current engine for that proof | Bounded value-flow, taint, and typestate results do not imply those stronger guarantees. |
When a question begins with a known declaration, prefer symbol and usage tools. When it begins with a language-neutral shape, prefer query_code. A common workflow is to find candidates structurally and then use exact locations or declarations for semantic follow-up.
Then Choose The Interface
Section titled “Then Choose The Interface”| Where you work | Best first surface | What it provides |
|---|---|---|
| Coding agent | MCP Server with symbol|extended | Symbol navigation plus inline JSON query_code and saved .rql through query_file. |
| VS Code | VS Code LSP | Definitions, references, hover, .rql editing, and execution of the current RQL buffer, including unsaved text. |
| Another editor | LSP Server | Editor-native definitions, references, hover, and workspace indexing; RQL editor features currently belong to the VS Code extension. |
| Terminal exploration | CLI and Rune Query Language | One-shot JSON queries, saved query files, and an interactive RQL prompt. |
| Rust application | Rust Library | In-process analyzer APIs for a Rust integration. |
| Python application | Python Client | Native-backed Python access to Bifrost analysis and query results. |
| Instruction-only agent setup | Agent Instructions | Guidance for using tools that are configured separately; instruction text does not expose tools. |
MCP and LSP are separate Bifrost processes. A VS Code Play action proves that the extension’s language server can execute RQL; it does not prove that an agent has MCP or query_code. Configure the MCP server and verify a real tool call. See the MCP/RQL availability matrix before configuring an agent.
Routes By User Goal
Section titled “Routes By User Goal”Evaluate Bifrost for research
Section titled “Evaluate Bifrost for research”Read Language and Analysis Capabilities first. It distinguishes structural support, exact graph-backed references and calls, proof tiers, named arguments, imports, hierarchy, external-dependency limits, and unsupported whole-program analyses. Then review the current evidence and evaluation method, complete the ten-minute evaluation, and use the executable language tutorials to inspect source, query, and exact expected output together.
Build or study an agent platform
Section titled “Build or study an agent platform”Start with the MCP toolsets, choose symbol|extended, and run both query-access smoke tests. Keep symbol tools, structural query results, and text search as different evidence sources. A successful symbol call does not establish that query_code is enabled, and a truncated or diagnostic-bearing result is not a completeness proof. Review workspace, cache, launcher, and model boundaries before connecting a repository to a hosted model.
Add Bifrost to an editor workflow
Section titled “Add Bifrost to an editor workflow”Choose an LSP integration for editor navigation. Add MCP separately only when an agent in that editor should call Bifrost tools. For VS Code query exploration, use the RQL Play workflow.
Build a static-analysis integration
Section titled “Build a static-analysis integration”Begin with Build a Static-Analysis Rule, use RQL to explore, and inspect its canonical JSON CodeQuery before embedding the query through the CLI, Python, Rust, or MCP. Treat diagnostics, proof, truncation, and provenance as part of the result contract rather than optional metadata.
Check Suitability Before Installation
Section titled “Check Suitability Before Installation”Bifrost is a good fit when the answer can be grounded in parsed source structure, indexed declarations, exact source references, resolved call edges, direct project-file imports, indexed type relationships, bounded receiver provenance, source-backed procedure-local CFG edges, or a configured value-flow, taint, or typestate analysis. The public CFG inspection surface does not cross call boundaries, while the registered and policy analyses use a bounded interprocedural graph internally. None of those surfaces claims path feasibility, complete whole-program points-to, or general unbounded aliasing. Read the capability matrix and inspect runtime diagnostics before relying on a zero-result or completeness claim.
Once you have chosen an interface, read License and Use Cases for the practical differences between running Bifrost as a subprocess, linking it into an application, operating a hosted service, and distributing a fork.