arbor
This server provides graph-based codebase analysis through two core operations:
Trace Logic Paths (
get_logic_path) - Follow the call graph to discover all dependencies and usages of a specific function or class, revealing how code flows through your projectAnalyze Refactoring Impact (
analyze_impact) - Calculate the "blast radius" of changing a code element to understand what will be affected before making modifications, including direct callers and transitive dependencies
Key capabilities:
Deterministic Results - Uses Arbor's semantic dependency graph for execution-aware analysis rather than text matching, with confidence scoring (High/Medium/Low)
AI Integration - Implements Model Context Protocol (MCP) enabling LLMs like Claude to query the graph directly for structurally-accurate code analysis
Multi-Language Support - Works across 10+ languages (Rust, TypeScript, Python, Go, Java, C/C++, C#, Dart, JavaScript) with cross-file symbol resolution
Local Privacy - All analysis happens locally with no data leaving your machine
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@arborshow me all functions that call the authentication service"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
v3.0.0 — The Right Node · v2.6.0 stopped dropping colliding symbols. It did not stop resolving them to the wrong one. When a bare name matched several modules, resolution fell through to "same directory" and confidently attached the edge to whichever definition happened to sit next to the caller. On a graded fixture the three largest hubs reported zero downstream impact while unrelated siblings inherited their centrality. A file's own imports now settle it. Reproduce it yourself: getArbor-dev/arbor-torture
Why Arbor
Most AI coding tools treat code as text. Arbor builds a semantic dependency graph — functions, classes, and modules as nodes; calls, imports, and inheritance as edges — then answers execution-aware questions with deterministic precision:
Question | Arbor answer |
If I change this symbol, what breaks? | Blast radius with depth, confidence, and risk level |
Who calls this — directly and transitively? | Caller/callee traversal on the call graph |
What's the shortest path between A and B? | A* path through real dependencies |
Is this PR too risky to merge? | CI gate on blast-radius thresholds |
No keyword guessing. No embedding hallucinations. One graph, every interface.
Where the graph is unsure, it says so — edges carry a confidence, and ambiguous resolutions are labelled rather than hidden. An honest unknown beats a confident wrong answer.
Related MCP server: CodeGraph CLI MCP Server
What's new in v3.0.0
One fix, measured.
Symbol resolution consults the importing file. When a bare name matched
definitions in several modules, resolve_ref fell through to SameDir and
attached the edge to whichever definition sat in the caller's own directory —
not a dropped edge, a confidently misrouted one, stamped at 0.55 confidence.
GraphBuilder already kept a per-file import map, but only
apply_import_validation read it, and that scores an edge after one has been
chosen. It never saw the references going to the wrong node. Consulting it
between the same-file and same-directory checks keeps a local definition
shadowing an import, while letting a written import beat mere adjacency.
Resolution::ViaImport scores 0.93, above SameDir's 0.55.
Measured
A fixture of 260 modules across 10 layers, each layer defining the same 26 function names. Ground truth is derived from the generator's own edge list, so the expected answer is exact rather than estimated.
True downstream | v2.6.0 | v3.0.0 |
179 | 0 | 163 |
178 | 0 | 161 |
161 | 0 | 133 |
143 | 22 | 133 |
122 | 22 | 119 |
36 | 22 | 61 |
16 | 22 | 46 |
Previously flat at about 22 regardless of the real answer. Now it tracks. Risk
on the largest hub moves from LOW to CRITICAL.
Total edge count barely moves (1335 → 1334). That is the signature of misrouting rather than loss: the edges were always there, pointing at the wrong nodes.
Breaking
Resolutiongains aViaImportvariant — an exhaustive match will not compileEdges land on different nodes, so cached graphs, stored node ids, and centrality baselines from 2.6.0 will differ
Known and still open
Written down rather than left to be discovered:
Small targets now over-report (36 → 61, 16 → 46). Safer direction than silence, but not yet correct.
PageRank has no escape from a closed cycle. Every member of a 500-function ring scores above 90% centrality on one caller each, so mutually recursive clusters — parsers, tree walkers, state machines — crowd the top of any ranking.
Inheritance produces no edges.
class Middle(Base)is invisible, so changing a base class shows zero blast radius.Dynamic and reflective imports (
importlib,__import__,import(),eval(require(...))) are unresolvable by construction and are documented as expected misses in the fixture rather than counted as defects.
Correctness, not speed. Each of these was silently wrong before.
Fix | Why it mattered |
Colliding symbols are kept |
|
Resolution is deterministic | Same-directory locality was decided by iterating a |
Edges carry confidence | A proven same-file call and a same-directory guess were identical evidence. Each edge now scores |
Exported TS symbols indexed once |
|
Method calls on untyped receivers resolve |
|
Centrality is a percentile rank | Scores were divided by the graph maximum, so the top node was |
Resolution is O(1), not O(refs × nodes × files) | Unresolvable references — stdlib and third-party calls, most call sites in real code — paid the worst case. Suffixes are now indexed. |
New capability — concept search. Substring matching cannot find get_authenticated from login; they share no substring. Identifiers are now tokenized and expanded through curated concept clusters, and docstrings, signatures, and paths are indexed alongside names. Deterministic, offline, no model. Available on the library as ArborGraph::search_ranked (arbor query remains literal-substring for now).
New capability — hunk-level impact. changed_node_ids_for_ranges keeps only symbols whose lines actually changed, instead of every symbol in a touched file.
Measured on identical node sets, after the duplicate-extraction fix:
Codebase | Before | After |
TypeScript (149 files) | 172 edges | 196 (+14%) |
Rust (arbor-graph) | 116 edges | 167 (+44%) |
Graph caches from earlier versions are invalidated — centrality now means something different, so a stale cache would be read wrong.
Change | Measured |
PageRank rewrite — flat call-graph adjacency replaces per-iteration traversal | 149.8ms → 6.6ms on a 10k-node graph (23x), verified side-by-side vs the old implementation |
Parallel indexing — parse fans out across all cores, deterministic assembly | Arbor: 253ms → 95ms · tokio (178k LOC): 2.7s → 1.6s |
Warm-start centrality — watcher recomputes seed from previous scores | Converges in ~2 rounds after a one-file patch instead of the full 20-iteration budget |
Convergence early-exit | Iteration stops at 1e-9 max delta — the budget is a ceiling, not a sentence |
Think a number is wrong? cargo bench -p arbor-graph and prove it: BENCHMARKS.md.
Feature | What it does |
MCP | Stateless |
Tasks extension |
|
MCP Apps | Interactive blast-radius graph ( |
HTTP transport |
|
Real | Git-diff-aware impact analysis via shared |
Pagination |
|
Benchmarks | Criterion suite + CI regression gate — see BENCHMARKS.md |
Quickstart
# Install
cargo install arbor-graph-cli
# Index your project (one command)
cd your-project && arbor setup
# Explore before you edit
arbor map . --exclude-test # ranked project skeleton (~1k tokens)
arbor refactor parse_file # blast radius of changing a symbol
arbor diff # impact of uncommitted git changes
# Wire up your AI agent
claude mcp add --transport stdio --scope project arbor -- arbor bridgeAgent workflow: call get_map first → search_symbols / get_file_graph to locate code → Read only the target file. Full MCP guide →
For AI agents (MCP)
Arbor ships a production MCP server via arbor bridge. Stdio is the default; HTTP is opt-in for remote/enterprise.
# Stdio (Claude, Cursor, VS Code)
arbor bridge
# HTTP (MCP 2026-07-28)
arbor bridge --http --port 3333Cursor / VS Code
{
"mcpServers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
}
}Templates: templates/mcp/ · Setup scripts: scripts/setup-mcp.sh · scripts/setup-mcp.ps1
16 MCP tools
Tier | Tools | Use when |
Orientation |
| First call — token-budgeted project skeleton ranked by PageRank |
Surgical |
| Navigate to a specific symbol or file |
Broad |
| Trace dependencies, blast radius, paths |
Agent-native |
| PR impact, onboarding, security audit, bulk lookup |
Every tool returns { ok, tool, data, meta: { suggested_next_tool, suggested_next_args } } so agents chain calls without re-prompting.
Registry: io.github.Anandb71/arbor · Official API lookup · Glama listing
CLI reference
Command | Description |
| One-shot init + index |
| Ranked, token-budgeted project skeleton |
| Fuzzy symbol search (supports |
| One-hop graph traversal |
| HTTP handlers, main, jobs, webhooks |
| Symbols + edges in one file |
| Full symbol detail |
| Shortest call-graph path |
| Blast radius before refactoring |
| Git-change impact report |
| CI safety gate ( |
| Auto-generate PR description |
| Autonomous PR architecture review |
| Codebase onboarding guide |
| Real-time architectural safety gate |
| MCP server (add |
| Live re-index on file changes |
| Native desktop UI |
All query commands support --json. map additionally supports --tokens N, --focus "pattern", --focus-changed.
Visual tour
Full recording: media/recording-2026-01-13.mp4
Installation
# Rust / Cargo
cargo install arbor-graph-cli
# Homebrew (macOS/Linux)
brew install Anandb71/tap/arbor
# Scoop (Windows)
scoop bucket add arbor https://github.com/Anandb71/arbor && scoop install arbor
# npm wrapper (cross-platform)
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:latestNo-Rust installers:
macOS/Linux:
curl -fsSL https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.sh | bashWindows:
irm https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.ps1 | iex
Pinned installs: docs/INSTALL.md
Language support
Production parsers: Rust · TypeScript / JavaScript · Python · Go · Java · C / C++ · C# · Dart
Fallback parsers: Kotlin · Swift · Ruby · PHP · Shell
CI & pull requests
arbor diff --markdown
arbor check --max-blast-radius 30 --markdown
arbor summaryGitHub Action (pre-built binary, ~5s vs ~3–5min compile):
name: Arbor Check
on: [pull_request]
jobs:
arbor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: getArbor-dev/arbor@v3.0.0
with:
command: check . --max-blast-radius 30 --markdown
comment-on-pr: true
github-token: ${{ secrets.GITHUB_TOKEN }}Architecture
arbor-core (Tree-sitter parsing)
└── arbor-graph (petgraph + PageRank + impact analysis)
├── arbor-cli — CLI + MCP bridge
├── arbor-mcp — MCP protocol server
├── arbor-server — WebSocket JSON-RPC
├── arbor-watcher — incremental file watcher
└── arbor-gui — desktop UIDocs: Quickstart · Architecture · Graph schema · MCP integration · Benchmarks · Roadmap · Philosophy
Release channels: GitHub Releases · crates.io · GHCR · npm · VS Code / Open VSX · Homebrew · Scoop — Releasing guide
Philosophy
Consumer first — beautiful, intuitive, instantly useful
Accessibility second — works across ecosystems, runs anywhere
Affordability next — minimal overhead, from laptops to monoliths
Arbor is local-first: no mandatory data exfiltration, offline-capable, open source. Security policy →
Contributing
cargo build --workspace
cargo test --workspace
cargo clippy --workspace --all-targets --all-featuresCONTRIBUTING.md · Good first issues · Code of conduct
Contributors
License
MIT — see LICENSE.
Available Tools
2 toolsanalyze_impactC
Analyzes the impact (blast radius) of changing a specific node.
| Name | Required | Description | Default |
|---|---|---|---|
| node_id | Yes | ID or name of the node to analyze |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions analyzing impact but doesn't specify what the analysis entails (e.g., computational cost, side effects, permissions required, or output format). This leaves significant gaps in understanding the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any fluff or redundancy. It is appropriately sized and front-loaded, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of impact analysis, no annotations, and no output schema, the description is incomplete. It doesn't explain what 'blast radius' entails, the nature of the analysis, or what results to expect, leaving the agent with insufficient context for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with 'node_id' documented as 'ID or name of the node to analyze'. The description adds no additional parameter semantics beyond this, so it meets the baseline of 3 for high schema coverage without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Analyzes the impact (blast radius) of changing a specific node.' It specifies the verb ('analyzes') and resource ('impact of changing a specific node'), though it doesn't explicitly differentiate from the sibling tool 'get_logic_path' (which might retrieve paths rather than analyze impact).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as the sibling tool 'get_logic_path'. It lacks context on prerequisites, scenarios where this analysis is needed, or any exclusions, leaving the agent without usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logic_pathC
Traces the call graph to find dependencies and usage of a function or class.
| Name | Required | Description | Default |
|---|---|---|---|
| start_node | Yes | Name of the function or class to trace |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions tracing and finding dependencies/usage, which suggests a read-only analysis operation, but doesn't clarify if it's safe, has side effects, requires permissions, or details output format (e.g., graph structure, depth limits). This leaves significant gaps for a tool with potential complexity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately sized and front-loaded, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete for a tool that traces call graphs. It lacks details on behavioral traits (e.g., safety, performance), output format, or how it differs from siblings, making it inadequate for an agent to fully understand usage without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, clearly documenting the single parameter 'start_node'. The description adds context by specifying it traces 'dependencies and usage of a function or class', which aligns with the schema but doesn't provide additional syntax or format details beyond what's already covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('traces', 'find') and resources ('call graph', 'dependencies and usage', 'function or class'), making it easy to understand what it does. However, it doesn't explicitly differentiate from its sibling tool 'analyze_impact', which might have overlapping or related functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus its sibling 'analyze_impact' or any alternatives. It implies usage for tracing dependencies and usage, but lacks explicit context, prerequisites, or exclusions, leaving the agent to infer appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
2 tool updates
v1.0.0- First observed
analyze_impact - First observed
get_logic_path
TDQS
The two tools have clearly distinct purposes: analyze_impact focuses on assessing the blast radius of a node change, while get_logic_path traces dependencies and usage in a call graph. There is no overlap or ambiguity between these functions.
Both tools follow a consistent verb_noun pattern (analyze_impact, get_logic_path) with clear, descriptive names. The naming style is uniform and predictable across the set.
With only two tools, the server feels thin for a domain like code or system analysis, where more operations (e.g., for managing nodes, viewing graphs, or updating logic) might be expected. This limited set could hinder agent workflows.
Inferring a domain of code or system dependency analysis, the toolset is severely incomplete. It lacks basic CRUD operations (e.g., create, update, delete nodes) and essential functions like listing or searching dependencies, leaving significant gaps for agent tasks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
AI-powered codebase analysis — call graphs, security, dead code, complexity. 150+ tools.
AI Agent with Architectural Memory. Impact analysis (free), tests and code from the graph (pro).
Deterministic context layer for your codebase: change impact, blast radius, answers with receipts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn intelligent server that provides semantic code search, domain-driven analysis, and advanced code understanding for large codebases using LLMs and vector embeddings.11MIT
- FlicenseNot gradedqualityFmaintenanceA high-performance CLI tool that provides semantic code search, advanced architectural analysis, and codebase indexing with vector embeddings across multiple programming languages. Enables AI assistants to understand and navigate large codebases through graph-based relationships and intelligent code pattern detection.872-
- AlicenseAqualityAmaintenanceA local-first codebase intelligence tool that enables AI assistants to research codebases using semantic search, multi-hop relationship discovery, and structural parsing. It allows users to extract architectural patterns and institutional knowledge across 30+ programming languages through an MCP-compatible interface.21,428MIT
- AlicenseNot gradedqualityCmaintenanceA graph-powered code intelligence engine that indexes codebases into a structural knowledge graph to provide AI agents with deep context on function calls, types, and execution flows. It offers local, zero-dependency tools for hybrid search, impact analysis, and dead code detection across Python, JavaScript, and TypeScript projects.808MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/getArbor-dev/arbor'
If you have feedback or need assistance with the MCP directory API, please join our Discord server