
Build a local code graph, verify Arbor from the command line, and publish its optional HTTP transport only when remote MCP access is required
Arbor is an open-source code-intelligence CLI that represents functions, classes, modules, calls, imports, and related program structures as a semantic graph. This guide walks through the documented Cargo installation, project setup, command-line verification, optional MCP configurations, and the opt-in HTTP server on port 3333. After Arbor works locally, we show how to connect that HTTP listener to a Localtonet HTTP tunnel without configuring inbound router ports or requiring a public IP address. We also explain the important limitations of static analysis and why the HTTP service should not be exposed until its security requirements have been reviewed.
π What's in this guide
What Arbor does and where Localtonet fits
Arbor analyzes source code as a graph rather than treating an entire repository as an unstructured collection of text. Its graph can represent program entities such as functions, classes, and modules as nodes, with calls, imports, and other relationships represented as edges. This structure supports questions that depend on relationships between symbols, including which functions call a symbol, which code can be reached transitively, and which parts of a repository may be affected by a change.
The distinction matters when an engineer or coding assistant needs structural context. A text search can find a matching name, but a graph can describe how identified symbols are connected. Arbor exposes this functionality through its command-line interface and through an MCP bridge that can be connected to a compatible coding assistant.
Arbor's default MCP workflow uses standard input and output, commonly called stdio. In that mode, the MCP client starts the local arbor bridge process and communicates with it directly. No network listener is required, so a Localtonet tunnel is unnecessary for a normal same-device stdio configuration.
Remote access becomes relevant only when Arbor is deliberately started with its optional HTTP transport. The documented command arbor bridge --http --port 3333 starts that mode on port 3333. Once the HTTP service is working on the same device as our client, a Localtonet HTTP tunnel can forward a public HTTPS address to the local listener. The Localtonet client creates an outbound connection to our relay infrastructure, so the workflow does not require inbound router port forwarding, firewall changes, a VPN, or a public IP address.
Use the stdio bridge when Arbor and the MCP client run on the same machine and the client supports stdio. Add an HTTP tunnel only when a remote client must reach Arbor over HTTP. A tunnel changes connectivity, not Arbor's analysis behavior.
Prerequisites and decisions to make first
The documented installation command uses Cargo, the Rust package manager. You therefore need a working Rust toolchain that includes Cargo. The available Arbor evidence does not state a minimum supported Rust version, so this guide does not invent one. If installation fails because your compiler is too old, update through the method used to manage Rust on your system and retry.
You also need a local source repository that you are permitted to analyze. Run Arbor's setup command from the repository you intend to index, not from an unrelated home or downloads directory. If the repository contains confidential code, review how every connected coding assistant or remote consumer handles project information before giving it access.
For local command-line analysis, no listening port is needed. For a same-device MCP integration, use stdio unless your MCP client specifically requires an HTTP endpoint. For remote HTTP access, install the Localtonet client on the same device that runs Arbor. Keeping both processes on one device allows the tunnel target to remain local instead of exposing Arbor directly on the LAN.
| Component | When it is needed | How to check it |
|---|---|---|
| Rust and Cargo | Required for the documented cargo install installation path |
Run cargo --version and confirm that the command is available |
| Source repository | Required for project setup and code analysis | Open a terminal in the repository root and confirm that it contains the code you intend to analyze |
| Compatible MCP client | Required only when using Arbor through an AI coding assistant | Confirm whether the client supports stdio, HTTP, or both before choosing a transport |
| Localtonet client | Required only for the remote-access stage in this guide | Confirm that the device appears connected in the Localtonet dashboard |
| Port 3333 availability | Required when following Arbor's documented HTTP example | Start Arbor and check that no port-conflict error is reported |
Confirm Cargo is available
Open a terminal and run:
cargo --version
A version response confirms that the shell can find Cargo. If the shell says that the command is missing, install a current Rust toolchain using the official method appropriate for your operating system, then open a new terminal so that environment changes take effect.
Choose the MCP transport deliberately
The transport determines whether networking is involved. Stdio is process-local and is the simplest choice when supported. HTTP creates a listening service and therefore requires additional decisions about binding, authentication, remote reachability, and service lifetime.
| Mode | Documented command | Best fit | Localtonet needed? |
|---|---|---|---|
| CLI | arbor callers your_function |
Interactive terminal analysis | No |
| MCP over stdio | arbor bridge |
An MCP client that can launch a local process | No |
| MCP over HTTP | arbor bridge --http --port 3333 |
A client that specifically needs network-based HTTP transport | Only for remote access |
Install the Arbor CLI with Cargo
Arbor's documented package installation uses the package name arbor-graph-cli. Cargo downloads and builds the package, then places its executable in Cargo's configured binary directory.
Open a terminal with Cargo available
Use a shell in which cargo --version succeeds. The installation is associated with the current user's Cargo environment.
Install the published Arbor CLI package
Run cargo install arbor-graph-cli. Allow Cargo to download dependencies and complete the build.
Confirm that the arbor command is discoverable
After installation completes, make sure the directory used by Cargo for installed binaries is on your shell's PATH. If the command is not found, reopen the terminal and inspect your Rust installation's PATH configuration.
cargo install arbor-graph-cli
Do not substitute an unverified package name or download command. The package name and executable name are different in this workflow: Cargo installs arbor-graph-cli, while the commands shown in Arbor's documentation use the arbor executable.
A Cargo installation compiles software locally, so completion time depends on the machine and whether dependencies are already cached. Compiler output is not itself an error. Look for the final success or failure result rather than interpreting normal build messages as a problem.
Although the Arbor repository contains container-related files, the supplied installation evidence does not establish a complete supported container procedure, required volumes, image name, published ports, or persistence behavior. This guide therefore uses the explicitly documented Cargo installation rather than inventing a Docker workflow.
Initialize Arbor in the repository you want to analyze
Installing the binary and preparing a repository are separate operations. Installation makes the command available. Project setup allows Arbor to initialize its analysis for the current codebase.
Change into the root directory of the repository you want Arbor to inspect. The exact directory is specific to your machine, so replace the placeholder below with the real repository path:
cd /path/to/your/repository
arbor setup
Open the repository root
Start from the directory that represents the project you want to analyze. Check the current location before continuing so that Arbor is not initialized against the wrong tree.
Run Arbor setup
Execute arbor setup from that repository. Let the command complete and read any project-specific diagnostics it reports.
Resolve reported indexing problems
Treat warnings about unsupported, unresolved, or incomplete relationships as analysis limitations rather than hiding them. A graph can be useful without representing every runtime behavior.
The available evidence does not provide a definitive list of all supported programming languages, generated-file rules, ignore patterns, setup prompts, or files created by arbor setup. Observe the output from the installed version instead of assuming that behavior from an older release or another project. If your repository uses an unusual language or build layout, verify the resulting graph with known symbols before relying on broad impact conclusions.
A graph connection does not prove that code will fail, and a missing connection does not prove that a change is safe. Dynamic calls, reflective imports, generated behavior, incomplete indexing, and runtime configuration can create relationships that static analysis cannot resolve. Use Arbor to identify investigation paths, then use tests, review, and runtime validation before shipping a change.
Verify Arbor locally before adding MCP or remote access

Always verify the smallest local workflow first. This separates installation and indexing problems from MCP client configuration, HTTP transport, and tunnel configuration. If a local query fails, adding a public URL will not fix the underlying graph.
Arbor documents a callers query in this form:
arbor callers your_function
Replace your_function with a real function name from the repository you initialized. Pick a symbol whose callers you already understand. A familiar symbol gives you a practical baseline for deciding whether the graph appears plausible.
How to interpret the result
Check whether the command identifies expected direct or indirect callers, depending on the output and query behavior of the installed release. If an expected relationship is absent, inspect whether the call is dynamic, reflective, generated, or otherwise difficult to infer statically. If unrelated symbols with the same name appear, inspect module and import context instead of assuming that every name match refers to the same definition.
Arbor's recent graph work distinguishes resolution confidence and explicitly acknowledges ambiguity. In version 3.0.0, import context was added to improve the selection of the correct symbol when identical bare names occur in different modules. A written import can provide stronger evidence than directory adjacency, while a local definition can still shadow an import. This improves an important class of resolution, but it does not eliminate all ambiguity.
Arbor also documents known limitations. Dynamic and reflective imports cannot always be resolved by construction. The available release evidence states that inheritance relationships are not represented as edges in the discussed version, so changing a base class can produce an incomplete blast-radius result. Small targets can also be over-reported. These limitations are reasons to inspect and test, not reasons to discard the graph entirely.
A practical verification checklist
- Run the query from the repository that was initialized with
arbor setup. - Use a real, known symbol rather than leaving
your_functionunchanged. - Compare the result with at least one relationship you can verify directly in source code.
- Check imports and module context when multiple symbols share the same name.
- Expect gaps around dynamic loading, reflection, generated behavior, and unsupported relationships.
- Use automated tests and runtime checks before treating an impact result as a release decision.
Configure Arbor as a local MCP server

If command-line analysis works, the next optional step is connecting Arbor to an MCP-compatible coding assistant. The default command is:
arbor bridge
This default bridge uses stdio. The MCP client starts Arbor as a child process and communicates through the process streams. Because no public endpoint is created, this is generally the better starting point for a coding assistant running on the same machine.
Claude Code project-scoped configuration
Arbor documents the following command for adding the stdio bridge to Claude Code at project scope:
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp list
The first command registers Arbor as a project-scoped MCP server. The second lists configured MCP servers so you can confirm that the entry is present. Within Claude Code, Arbor's documentation also directs users to run /mcp to inspect MCP connectivity.
Cursor configuration
For Cursor, the documented project configuration uses .cursor/mcp.json:
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}
The MCP client must be able to find the arbor executable. A common source of failure is launching a graphical application with a different PATH from the terminal where Cargo works. If that happens, fix the application's executable environment using a path appropriate to your own Rust installation. Do not copy a path from another operating system or user account.
VS Code configuration
Arbor documents this project configuration in .vscode/mcp.json:
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}
These examples use local stdio transport. They do not require port 3333, a Localtonet tunnel, or a public URL. Keep the configuration simple unless the MCP consumer is genuinely remote or specifically requires HTTP.
Stdio assumes that a trusted client launches a local command. Do not wrap it in an unauthenticated remote shell or arbitrary command-execution service. Use Arbor's documented HTTP mode when network transport is required, then protect access according to the sensitivity of the repository.
Start Arbor's optional HTTP MCP server
Arbor's documented HTTP example starts the bridge on port 3333:
arbor bridge --http --port 3333
Run this command from the prepared project context and keep the process running. Closing the terminal, interrupting the command, logging out in a way that terminates the process, or stopping the service will make the HTTP endpoint unavailable.
Complete local setup first
Install Arbor, run arbor setup in the intended repository, and validate a command-line query before introducing HTTP.
Start the HTTP bridge
Run arbor bridge --http --port 3333 and leave that process active.
Inspect startup output
Confirm that Arbor reports a successful start and does not report a port conflict, repository problem, or initialization failure.
Verify the local listener before tunneling
Test the service from the same machine using the host, port, MCP path, and request behavior expected by the installed Arbor version and your MCP client.
The supplied Arbor evidence establishes the HTTP mode and port but does not establish a specific MCP URL path, root-page response, health-check route, authentication option, TLS option, or expected response body. For that reason, this guide does not invent a path such as /mcp, /health, or /sse. Use the startup output from the installed release and the HTTP transport settings expected by your MCP client.
A browser request to the port is not always a complete MCP verification. MCP clients may use specific methods, headers, sessions, or streaming behavior. A plain browser page can be empty or return an error even while the intended protocol endpoint works. The most reliable test is an MCP-compatible client configured with the exact endpoint reported by Arbor.
Do not assume that the HTTP bridge authenticates callers. The available evidence also does not establish built-in TLS or access-control flags. Before making the listener remotely reachable, treat it as sensitive code-analysis infrastructure. Use a trusted application-layer authentication gateway or another verified access-control layer if remote users require protection beyond possession of the tunnel address.
Expose the working Arbor HTTP service with Localtonet

Add Localtonet only after the HTTP bridge works locally. Our client runs on the device that can reach Arbor and creates an outbound connection to a Localtonet relay server. The resulting HTTP tunnel provides a public HTTPS address and forwards requests to the selected local IP address and port.
This removes the need for inbound router port forwarding, firewall changes, VPN setup, or a public IP address. It does not add missing application authentication to Arbor, validate MCP requests, or decide who should have access. Connectivity and authorization remain separate concerns.
Install and run the Localtonet client
Run our client on the same device as the Arbor HTTP bridge. Confirm that the device is connected before creating the tunnel.
Authenticate or select the Arbor device
Use the device-specific authentication token associated with that client. Keep the token private and never place it in source code, screenshots, shared configuration, or this tunnel's public URL.
Select an available relay server
Choose a currently available server or region from the dashboard. Available server codes can vary, so obtain the value from the current product interface rather than copying a hardcoded code from a tutorial.
Create an HTTP tunnel to Arbor
Configure the local target as the IP address and port where the Arbor process is reachable. When both applications run on the same device and Arbor accepts loopback connections, use the local loopback target with port 3333. Select the appropriate HTTP process type, such as a random subdomain, supported custom subdomain, or custom domain, according to the options available to your account and current dashboard.
Start the tunnel
Creating a tunnel does not start it. Use the Start button and wait until the tunnel is running. The public address is usable only while the selected device is connected, Arbor is listening, and the tunnel is running.
Test the public HTTPS endpoint
Configure the remote MCP client with the assigned public address plus the exact Arbor endpoint path, if the installed Arbor version requires one. Verify a harmless analysis request before depending on the connection for active development.
For current dashboard details, consult our Localtonet HTTP tunnel documentation. Exact client installation commands, relay availability, custom-domain DNS requirements, and account-specific options can change, so check the current dashboard rather than relying on guessed values.
Understand the complete request path
In the same-device configuration, a remote MCP request reaches the assigned Localtonet public HTTPS address. Our relay forwards it through the outbound client connection to Arbor's local HTTP listener on port 3333. Arbor processes the MCP request using the repository context prepared on that device.
If the public address works while the Localtonet client, tunnel, and Arbor process are active but stops later, verify all three lifecycle states. A tunnel cannot reach a process that has exited, and a running Arbor process is not remotely reachable through a stopped tunnel.
Do not publish the URL in a repository, issue tracker, build log, screenshot, or chat room. Stop the tunnel when remote access is no longer needed. If the endpoint lacks verified application authentication, place an appropriate authenticated gateway in front of it or keep it local. A hard-to-guess address is not a substitute for authorization.
HTTP tunnel process types
| Process type | Public address behavior | Consideration |
|---|---|---|
| Random Sub Domain | Uses an assigned public HTTPS subdomain | Useful when a stable custom name is not required |
| Custom Sub Domain | Uses a selected subdomain where supported | Availability can depend on current product and account options |
| Custom Domain | Serves the same local content through a custom domain | Confirm current DNS requirements before configuring records |
All three HTTP process types serve the configured local content at a public HTTPS address. They do not change Arbor's graph, MCP protocol behavior, repository permissions, or application-level authorization.
Troubleshooting installation, analysis, MCP, and tunnel problems
Cargo is not recognized
If cargo --version fails, the Rust toolchain is either missing or its binary directory is not available to the current shell. Install or repair Rust using the official toolchain method for your operating system, then open a new terminal. Avoid guessing a fixed Cargo binary path because it can differ by operating system, user, and installation method.
Cargo fails while building Arbor
Read the first relevant compiler or dependency error rather than only the final failure line. Confirm that the Rust toolchain is current, that the machine can download package dependencies, and that the user has permission to write to Cargo's installation directories. The evidence does not specify a minimum Rust version or a complete list of native build dependencies, so use the actual error from the installed environment to guide remediation.
The installation succeeds but arbor is not found
Cargo can install a binary successfully while the shell cannot locate it. Reopen the terminal and check the PATH associated with the same user who ran Cargo. Graphical MCP clients may inherit a different environment from interactive shells, so success in a terminal does not guarantee that Cursor or VS Code can find the executable.
Setup analyzed the wrong directory
Stop and return to the intended repository root before running arbor setup. Do not assume that changing directories later automatically transfers project context. Verify the current directory and repeat the documented setup operation for the correct repository if necessary.
A known caller is missing
Inspect the source relationship. Dynamic imports, reflection, generated code, untyped receiver calls, language features, or incomplete indexing may prevent a static edge from being created. Inheritance is also a documented gap in the supplied release information. Confirm important relationships using source review and tests.
The callers result points to the wrong same-named symbol
Confirm the Arbor version and inspect the importing file. Version 3.0.0 specifically improved resolution when bare names collide across modules by consulting import context before falling back to same-directory proximity. Existing cached graphs, stored node identifiers, and centrality baselines from older releases can differ after this correction, so compare results carefully after upgrading.
The HTTP bridge reports that port 3333 is unavailable
Another process may already be listening on that port, or an earlier Arbor process may still be running. Stop the conflicting process if appropriate. Arbor allows a port to be selected with --port, but if you choose a different value, use exactly the same port as the Localtonet tunnel target. Do not expose an unrelated service accidentally.
The port responds, but the MCP client does not connect
Confirm that the client supports Arbor's HTTP MCP transport and that it is using the correct endpoint path, request method, and protocol behavior. The available evidence does not establish a universal path, so pointing a client at the server root may be insufficient. Review Arbor's startup output and the client's HTTP MCP requirements.
The local endpoint works, but the public endpoint does not
- Confirm that the Arbor HTTP process is still running.
- Confirm that Arbor is reachable from the same device as the Localtonet client.
- Check that the HTTP tunnel targets the correct local IP address and port 3333, or the alternative port you deliberately selected.
- Confirm that the selected Localtonet device is connected.
- Confirm that the tunnel was started, not merely created.
- Use the current assigned public address rather than an old or deleted tunnel address.
- Preserve any endpoint path required by Arbor when forming the public MCP URL.
The public endpoint stopped working later
Check the lifecycle from the inside out. First verify Arbor, then the local HTTP listener, then the Localtonet client, then the tunnel state. Localtonet tunnels are available only while the selected client or device is connected and the tunnel is running. Restarting one component does not automatically prove that every other component is active.
The graph result looks unexpectedly risky or unexpectedly safe
Treat both extremes as prompts for investigation. Small targets can be over-reported, while missing static relationships can under-report impact. Centrality and blast radius describe the analyzed graph, not every possible runtime execution. Inspect the paths, compare them with imports and calls in source, and run the repository's test suite before making a release decision.
Routine operation and safe shutdown
A reliable workflow keeps repository analysis, the Arbor service, and the Localtonet tunnel as distinct layers. This makes failures easier to diagnose and reduces accidental exposure.
- Open the intended repository and verify that Arbor's project setup is valid.
- Run a known local query when you need to confirm graph behavior.
- Use
arbor bridgefor a local stdio MCP client. - Use
arbor bridge --http --port 3333only when HTTP transport is required. - Start the Localtonet HTTP tunnel only after the local listener is healthy.
- Test the remote client with a low-risk query.
- Stop or delete the tunnel when remote access is no longer required.
- Stop the Arbor HTTP process when no HTTP consumers need it.
When upgrading Arbor, repeat local verification against symbols whose relationships are already understood. Graph corrections can move edges to different nodes, change stored node identifiers, and alter centrality or blast-radius results. A changed result is not automatically a regression, especially when an earlier release resolved a symbol incorrectly.
If Arbor or its tunnel must run unattended, use a service-management method appropriate to your operating system. The supplied evidence does not define an official Arbor service unit, startup task, background flag, or process supervisor configuration, so this guide does not invent one. Whatever manager you choose should run Arbor in the correct repository context, expose only the intended port, preserve logs needed for diagnosis, and stop cleanly.
Test CLI analysis first, local MCP second, local HTTP third, and the Localtonet public endpoint last. This sequence identifies which layer introduced a failure and prevents tunnel troubleshooting from masking an Arbor setup problem.
Frequently asked questions
What is the documented command for installing Arbor?
Install the published CLI package with cargo install arbor-graph-cli. This requires a working Rust toolchain with Cargo. The installed commands use the executable name arbor.
How do I initialize Arbor for a repository?
Open a terminal in the repository you want to analyze and run arbor setup. Verify the current directory first so that Arbor is initialized against the intended project.
Does Arbor require Localtonet for MCP?
No. Arbor's default MCP bridge uses stdio and can be launched locally with arbor bridge. Localtonet is relevant only when you deliberately start Arbor's HTTP transport and need a remote client to reach it.
How do I start Arbor's HTTP MCP server?
Run arbor bridge --http --port 3333 from the prepared project context. Keep the process running and verify it locally before creating a tunnel.
What URL path should an HTTP MCP client use?
The supplied evidence establishes HTTP mode and port 3333 but does not establish a universal endpoint path. Use the path reported or required by the installed Arbor release and the MCP client's transport configuration. Do not assume an invented /mcp, /sse, or health-check route.
Does Arbor's HTTP server include authentication or TLS?
Authentication and built-in TLS options are not established by the supplied Arbor documentation. Do not assume they exist. A Localtonet HTTP tunnel provides a public HTTPS address, but application authorization remains a separate requirement. Keep the endpoint private or use a verified authentication layer where appropriate.
Does Localtonet require router port forwarding?
No. Our client establishes an outbound connection to a Localtonet relay server. This allows the tunnel to provide a public address without inbound router port forwarding, firewall changes, VPN setup, or a public IP address.
Is a Localtonet tunnel available after Arbor or the client stops?
No. Remote service availability depends on Arbor running, the Localtonet client device being connected, and the tunnel being started. Creating a tunnel does not automatically start it.
Can Arbor prove that a code change is safe?
No. Arbor can identify static relationships, paths, callers, and possible impact, but runtime behavior still requires tests and review. Dynamic imports, reflection, inheritance gaps, generated behavior, and incomplete indexing can affect the result.
Should I use HTTP or stdio for a local coding assistant?
Prefer stdio when the assistant runs locally and supports it. It avoids a listening network service and uses the documented arbor bridge command. Choose HTTP only when the client requires network transport or runs remotely.
Connect your verified Arbor HTTP bridge with Localtonet
Once Arbor is installed, initialized, and responding locally on its HTTP transport, create a Localtonet HTTP tunnel to reach it remotely without opening an inbound router port. Keep the tunnel active only while it is needed and add appropriate authorization for sensitive repository access.
Get Started Free β