LAIN-mcp
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., "@LAIN-mcpif I change the database schema, what code will break?"
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.
LAIN-mcp
LAIN builds a map of how all the code in your project connects — what calls what, what depends on what, which files tend to change together. Then it lets your AI coding assistant ask questions about that map. So instead of the AI just looking at one file and guessing, it can ask "if I change this function, what else breaks?" and get a real answer. It plugs into any AI agent that supports MCP and runs in the background while you work.
TL,DR:
# One-line install (interactive - will ask you to configure and add to PATH)
curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | bash
# After install: reload your shell (or open a new terminal)
source ~/.zshrc # or ~/.bashrc
# Or non-interactive (skips prompts, auto-adds to PATH)
curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | \
bash /dev/stdin --workspace . --transport both --yesRelated MCP server: trace-mcp
What is Lain?
Lain is a persistent code-intelligence MCP server. It builds a queryable knowledge graph of your codebase — symbols and their relationships extracted via LSP and tree-sitter, augmented with git co-change history and optional semantic embeddings — and exposes that graph through MCP tools. The value over LSP-only or RAG-based approaches is cross-file structural reasoning: blast radius for proposed changes, transitive dependency traces, anchor identification, co-change correlation, and contextual build failure decoration so agents can reason about callers rather than just the failing line. Written in Rust, persists across sessions, stays fresh during editing via a file watcher that updates a volatile overlay layered on top of the static graph.
Installation
Quick Install (recommended - interactive)
curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | bashThe installer will ask you to configure:
Workspace path
MCP transport mode (stdio, http, or both)
HTTP port (if using http/both)
Target agent (auto-detects Claude Code, Cursor, Windsurf, Cline)
Whether to download the ONNX model for semantic search
After you confirm your settings, it will:
Download and install LAIN to
~/.local/lainOptionally download the ONNX model (~120MB)
Run
lain initwith your configurationAdd LAIN to your agent's settings
Non-interactive install (with options):
# Install with specific workspace and download ONNX model for semantic search
curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | \
bash /dev/stdin --workspace . --transport both --download-model --yes
# Install for specific agent
curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | \
bash /dev/stdin --agent cursor --yes
# See all options
curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | \
bash /dev/stdin --helpInstall options:
Option | Description | Default |
| Workspace path for LAIN |
|
| MCP transport: stdio, http, both |
|
| HTTP port for MCP server |
|
| Target agent: auto, claude, cursor, windsurf, cline |
|
| Path to ONNX embedding model | - |
| Download default ONNX model (all-MiniLM-L6-v2.onnx, ~120MB) | - |
| Skip all confirmation prompts | - |
After installation:
# Reload your shell (the installer adds to ~/.zshrc or ~/.bashrc automatically)
source ~/.zshrc # or ~/.bashrc, then open a new terminal
# Verify installation
lain --version
# Query the graph
lain query "find Function | limit 5"Homebrew
brew tap spuentesp/lain https://github.com/spuentesp/lain
brew install lain
# Initialize
lain initPre-built Binary
Download the latest release for your platform from GitHub releases, then:
# Make executable
chmod +x lain
# Run directly
./lain --workspace /path/to/your/project --transport stdioBuild from Source
# Clone the repo
git clone https://github.com/spuentesp/lain.git
cd lain
# Build (requires Rust 1.75+)
cargo build --release
# Binary will be at ./target/release/lainQuick Start
1. Install LAIN
curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | bash2. Initialize for Claude Code (or other agents)
# Auto-detect agent (Claude Code, Cursor, Windsurf, Cline)
lain init
# Or specify agent explicitly
lain init --agent claude3. Run
# Standard mode (for Claude Code)
lain --workspace /path/to/project --transport stdio
# With HTTP diagnostics (web UI at http://localhost:9999)
lain --workspace /path/to/project --transport both --port 9999
# With semantic search (requires ONNX model)
lain --workspace /path/to/project --embedding-model ~/.local/lain/models/all-MiniLM-L6-v2.onnx4. Verify
# Check health and LSP status
curl -s -X POST http://localhost:9999/mcp -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"get_health","arguments":{}},"id":1}'
# Query the graph directly
lain query "find Function | limit 5"Key Features
Query Language (query_graph)
JSON-based ops array for flexible graph traversals:
{
"ops": [
{ "op": "find", "type": "Function" },
{ "op": "connect", "edge": "Calls", "depth": { "min": 1, "max": 3 } },
{ "op": "filter", "label": "test" },
{ "op": "semantic_filter", "like": "error handling", "threshold": 0.35 },
{ "op": "limit", "count": 10 }
]
}Available ops: find, connect, filter, semantic_filter, group, sort, limit
Dependency Intelligence
get_call_chain— Shortest path between two functionsget_blast_radius— Everything affected by a changetrace_dependency— What a symbol depends onget_coupling_radar— Files that change together
Architectural Analysis
find_anchors— Most-called, most-stable symbols (architectural pillars)list_entry_points— Findmain(), route handlers, app initializationget_context_depth— How far from an entry point (abstraction layers)explore_architecture— High-level tree of modules and files
Search
semantic_search— Find code by meaning, not just names (uses local ONNX embeddings)
Code Health
find_dead_code— Potentially unreachable code (filters trait defaults, common names)suggest_refactor_targets— High-coupling, low-stability nodes
Build Integration
Lain enriches build failures with architectural context:
run_build— Build with Rust/Go/JS/Python toolchain error parsingrun_tests— Tests with error enrichmentrun_clippy— cargo clippy with context
Requirements
Requirement | Details |
Rust | 1.75 or newer |
Git | Required for co-change analysis |
ONNX Model | Optional — for semantic search |
Optional: Semantic Search
For semantic_search to work, you need an ONNX embedding model. The easiest way to set this up is using the provided install script:
./scripts/install.shAlternatively, you can set it up manually:
# Create model directory
mkdir -p .lain/models
# Download all-MiniLM-L6-v2 (or any compatible model)
# Model produces 384-dim embeddings
curl -L https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/onnx/model.onnx -o .lain/models/model.onnx
curl -L https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer.json -o .lain/models/tokenizer.jsonSet the model path:
export LAIN_EMBEDDING_MODEL=$PWD/.lain/models/model.onnx
# or
./lain --embedding-model ./.lain/models/model.onnx ...Without the model, semantic_search returns "unavailable" but all other features work.
MCP Transport Modes
Mode | Command | Use Case |
|
| Claude Code, MCP clients |
|
| Web diagnostics dashboard |
|
| Both stdio + diagnostics |
Troubleshooting
LSP servers not ready?
# Install missing language servers
curl -X POST http://localhost:9999/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"install_language_server","arguments":{"language":"rust"}},"id":2}'Graph stale?
# Sync to current git HEAD
curl -X POST http://localhost:9999/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"sync_state","arguments":{}},"id":3}'View all available tools:
curl -s -X POST http://localhost:9999/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"get_agent_strategy","arguments":{}},"id":4}'A/B Testing Results
A simple A/B test was run on the asciinema_fix_pty_bug (a small fork i made from https://github.com/asciinema/asciinema.git ) across 5 passes, 4 times using a script. Median numbers are reported.
Metric | with_lain | without_lain |
Pass rate | 5/5 (100%) | 5/5 (100%) |
Median duration | 39.3s | 54.1s |
Median tokens in | 35,488 | 41,731 |
Key observations:
Both conditions passed 100% — the bug fix worked in both conditions, with variation per run.
with_lainused fewer input tokens (~35k vs ~42k median), a difference of ~7k tokens per run.
About the bug: The failing test (pty::tests::spawn_extra_env on macOS) stems from handle_child() setting env vars via env::set_var() before execvp(). The shell's interpretation of echo -n $VAR varies across platforms — sometimes -n is treated as a literal argument. The fix: use printf "%s" "$ASCIINEMA_TEST_FOO" instead, portable across all Unix-like systems.
This was a test I did for A/B comparison — not a rigorous evaluation.
License
MIT — Copyright (c) 2026 spuentesp
This server cannot be installed
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 Servers
- AlicenseAqualityCmaintenanceAn MCP server and CLI tool that transforms codebases into AI-ready context through semantic search, call graph analysis, and incremental indexing. It enables AI assistants to perform hybrid vector and keyword searches to understand complex repository structures and cross-file relationships.Last updated5451MIT
- AlicenseAqualityAmaintenanceFramework-aware code intelligence MCP server that builds a cross-language dependency graph from source code. 53 integrations (Laravel, Django, Rails, Spring, NestJS, Next.js, and more) across 68 languages. 100+ tools for navigation, impact analysis, refactoring, security scanning, session memory, and CI/PR reports — up to 97% token reduction.Last updated10024394MIT
- AlicenseAqualityAmaintenanceA local knowledge graph MCP server that provides AI agents with permanent, structured memory about codebases, enabling semantic search, blast radius analysis, and convention enforcement.Last updated82MIT
- Alicense-qualityAmaintenanceMCP server for local-first code intelligence, providing structural code graph, semantic search, and impact analysis to AI agents.Last updated1MIT
Related MCP Connectors
User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
An MCP server that gives your AI access to the source code and docs of all public github repos
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/spuentesp/lain'
If you have feedback or need assistance with the MCP directory API, please join our Discord server