SYMBOL DELTA LEDGER
Cards-first code context for AI coding agents
Stop feeding entire files into the context window.<br/>Start giving agents exactly the code intelligence they need.
<br/> </div><br/>
What's the problem?
Every time an AI coding agent reads a file to answer a question, it consumes thousands of tokens. Most of those tokens are irrelevant to the task. The agent doesn't need 500 lines of a file to know that validateToken takes a string and returns a Promise<User> โ but it reads them anyway, because that's all it has.
Multiply that across a debugging session touching 20 files and you've burned 40,000+ tokens on context gathering alone.
SDL-MCP fixes this. It indexes your codebase into a searchable symbol graph and serves precisely the right amount of context through a controlled escalation path. An agent that uses SDL-MCP understands your code better while consuming a fraction of the tokens.
<br/><br/>
How it works โ in 30 seconds
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart TD
Codebase["Your Codebase"]
Indexer["Indexer<br/>12 languages<br/>Rust native or Tree-sitter fallback"]
Graph["LadybugDB graph<br/>symbols, edges, metrics, versions"]
MCP["Current MCP surfaces<br/>33 flat, 6 gateway, 4 Code Mode"]
CLI["13 CLI commands"]
HTTP["HTTP API and graph UI"]
Agent["AI coding agent<br/>Claude Code, Claude Desktop, Cursor, Windsurf, Codex, Gemini"]
Codebase e1@--> Indexer
Indexer e2@--> Graph
Graph e3@--> MCP
Graph e4@--> CLI
Graph e5@--> HTTP
MCP e6@--> Agent
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5,e6 animate;
- Index once โ SDL-MCP parses every symbol in your repo and stores it as a compact metadata record (a "Symbol Card") in a graph database
- Query efficiently โ Agents use MCP tools to search, slice, and retrieve exactly the context they need
- Escalate only when necessary โ A four-rung ladder controls how much code the agent sees, from a 100-token card to full source (with justification required)
<br/>
Prerequisites
- Node.js 24+ is required (download). SDL-MCP uses Node.js features not available in earlier versions. Run
node -vto check.
<br/>Peer dependency warnings during install? The tree-sitter grammar packages may produce
ERESOLVEwarnings about peer dependencies. These are harmless โ the install succeeds and everything works correctly. Add--legacy-peer-depsto suppress them:npm install -g sdl-mcp --legacy-peer-deps. SDL-MCP's postinstall also verifies tree-sitter grammar bindings and rebuilds missing ones before pruning sources; installs that use--ignore-scriptsshould runnpm rebuild tree-sitter tree-sitter-kotlinif a grammar is unavailable.
<br/>
Quick Start
# Install (requires Node.js 24+)
npm install -g sdl-mcp
# Initialize, auto-detect languages, index your repo, and run health checks
sdl-mcp init -y --auto-index
# Start the MCP server for your coding agent
sdl-mcp serve --stdio
Point your MCP client at the server and the agent gains access to SDL-MCP's current configured surface. By default that is exclusive Code Mode; set codeMode.exclusive: false when you want Code Mode plus the regular flat or gateway tools in one session.
npx users: Replace
sdl-mcpwithnpx --yes sdl-mcp@latestin all commands above.
Full Getting Started Guide โ
<br/><br/>
The Iris Gate Ladder
The core innovation. Named after the adjustable aperture that controls light flow in optics, the Iris Gate Ladder lets agents dial their context "aperture" from a pinhole to wide-open.
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart TB
R1["~100 tokens<br/>Rung 1: Symbol Card<br/>Name, signature, summary, dependencies, metrics"]
R2["~300 tokens<br/>Rung 2: Skeleton IR<br/>Signatures and control flow with bodies elided"]
R3["~600 tokens<br/>Rung 3: Hot-Path Excerpt<br/>Identifier-focused lines with context"]
R4["~2,000 tokens<br/>Rung 4: Raw Code Window<br/>Policy-gated full source"]
R1 e1@--> R2
R2 e2@--> R3
R3 e3@--> R4
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3 animate;
Most questions are answered at Rungs 1-2 without ever reading raw code. That's where the token savings come from.
| Scenario | Reading the file | Using the Ladder | Savings |
|---|---|---|---|
"What does parseConfig accept?" | ~2,000 tok | ~100 tok | 20x |
"Show me the shape of AuthService" | ~4,000 tok | ~300 tok | 13x |
"Where is this.cache set?" | ~2,000 tok | ~500 tok | 4x |
Why it matters:
- 4โ20x token savings on typical code understanding queries
- Most questions answered at Rungs 1โ2 without ever reading raw code
- Controlled escalation prevents agents from over-consuming context
- Policy-gated raw access ensures agents prove they need full source
Iris Gate Ladder Deep Dive โ
<br/><br/>
Feature Tour
Symbol Cards โ The Atoms of Understanding
Every function, class, interface, type, and variable becomes a Symbol Card: a compact metadata record (~100 tokens) containing everything an agent needs to understand a symbol without reading its code.
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart TB
Card["Symbol Card: validateToken"]
Kind["Kind: function (exported)"]
File["File: src/auth/jwt.ts:42-67"]
Signature["Signature: (token: string, opts?: ValidateOpts) -> Promise<DecodedToken>"]
Summary["Summary: validates JWT signature and expiration"]
Invariants["Invariants: throws on expired token"]
SideEffects["Side effects: logs to audit trail"]
Deps["Dependencies: verifySignature, checkExpiry, jsonwebtoken, AuditLogger"]
Metrics["Metrics: fan-in 12, fan-out 4, churn 3/30d"]
Context["Context: auth-module, request-pipeline, auth.test.ts"]
ETag["ETag: a7f3c2..."]
Card e1@--> Kind
Kind e2@--> File
File e3@--> Signature
Signature e4@--> Summary
Summary e5@--> Invariants
Invariants e6@--> SideEffects
SideEffects e7@--> Deps
Deps e8@--> Metrics
Metrics e9@--> Context
Context e10@--> ETag
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5,e6,e7,e8,e9,e10 animate;
Cards include confidence-scored call resolution (the pass-2 resolver traces imports, aliases, barrel re-exports, and tagged templates to produce accurate dependency edges), community detection (cluster membership), and call-chain tracing (process participation with entry/intermediate/exit roles).
Why it matters:
- ~100 tokens per symbol vs. ~2,000 tokens to read the full file
- Confidence-scored dependency edges trace real call relationships across files
- Community detection and call-chain tracing reveal architectural structure
- ETag-based conditional requests avoid re-fetching unchanged symbols
- Workflow ETag caching now seeds
slice.buildwithknownCardEtagsso repeated slice builds can skip unchanged cards
Indexing & Language Support Deep Dive โ
Graph Slicing โ The Right Context for Every Task
Instead of reading files in the same directory, SDL-MCP follows the dependency graph. Starting from symbols relevant to your task, it traverses weighted edges (call: 1.0, config: 0.8, import: 0.6), scores each symbol by relevance, and returns the N most important within a token budget.
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart TD
Task["Task: Fix the auth middleware"] e1@--> Slice["sdl.slice.build"]
Slice e2@--> Auth["authenticate"]
Slice e3@--> Validate["validateToken"]
Slice e4@--> Config["JwtConfig"]
Auth e5@--> Hash["hashPassword"]
Validate e6@--> User["getUserById"]
Config e7@--> Env["envLoader"]
Env e8@-. frontier outside budget .-> Frontier["spillover frontier"]
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5,e6,e7,e8 animate;
Slices have handles, leases, refresh (delta-only updates), and spillover (paged overflow). You can also skip the symbol search entirely โ pass a taskText string and SDL-MCP auto-discovers the relevant entry symbols.
Why it matters:
- Follows the dependency graph, not directory boundaries, for cross-cutting context
- Weighted edge scoring (call > config > import) prioritizes the most relevant symbols
- Token-budgeted: returns only what fits within your budget (~800 tokens vs. ~16,000 for raw files)
- Natural-language task-text auto-discovers entry symbols โ no symbol IDs needed
Delta Packs & Blast Radius โ Semantic Change Intelligence
git diff tells you what lines changed. SDL-MCP tells you what that change means and who's affected.
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart TD
Change["Modified validateToken() signature"]
Sig["signatureDiff<br/>added options?: object"]
Inv["invariantDiff<br/>added throws on expired"]
Fx["sideEffectDiff<br/>added logs to audit trail"]
Blast["Blast radius"]
A1["authenticate()<br/>distance 1"]
A2["refreshSession()<br/>distance 1"]
A3["AuthMiddleware<br/>distance 2"]
A4["auth.test.ts<br/>re-run recommended"]
Change e1@--> Sig
Change e2@--> Inv
Change e3@--> Fx
Sig e4@--> Blast
Inv e5@--> Blast
Fx e6@--> Blast
Blast e7@--> A1
Blast e8@--> A2
Blast e9@--> A3
Blast e10@--> A4
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5,e6,e7,e8,e9,e10 animate;
PR risk analysis (sdl.pr.risk.analyze) wraps this into a scored assessment with findings, evidence, and test recommendations. Fan-in trend analysis detects "amplifier" symbols whose growing dependency count means changes ripple further over time.
Why it matters:
- Semantic diffs show what a change means, not just what lines moved
- Ranked blast radius identifies which dependent symbols are most at risk
- Fan-in trend analysis detects "amplifier" symbols whose changes ripple further over time
- PR risk scoring produces actionable findings with test re-run recommendations
Delta & Blast Radius Deep Dive โ
Live Indexing โ Real-Time Code Intelligence
SDL-MCP doesn't wait for you to save. As you type in your editor, buffer updates are pushed to an in-memory overlay store, parsed in the background, and merged with the durable database. Search, cards, and slices reflect your current code, not your last save.
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart LR
Editor["Editor keystrokes"] e1@--> Push["sdl.buffer.push"]
Push e2@--> Overlay["Overlay store"]
Overlay e3@--> Reads["Merged reads<br/>search, cards, slices"]
Overlay e4@--> Persist["save / idle checkpoint"]
Persist e5@--> DB["LadybugDB durable graph"]
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5 animate;
Why it matters:
- Search, cards, and slices reflect unsaved editor changes in real time
- No manual re-index needed during active development
- Background AST parsing with in-memory overlay keeps queries fast
Governance & Policy โ Controlled Access
Raw code access (Rung 4) is policy-gated. Agents must provide:
- A reason explaining why they need raw code
- Identifiers they expect to find in the code
- An expected line count within configured limits
Requests that don't meet policy are denied with actionable guidance ("try getHotPath with these identifiers instead"). Every access is audit-logged.
The sandboxed runtime execution tool (sdl.runtime.execute) has its own governance layer: enabled by default, but still guarded by executable allowlisting, CWD jailing, environment scrubbing, concurrency limits, and timeout enforcement. The outputMode parameter ("minimal" | "summary" | "intent") defaults to "minimal" for ~95% token savings, with sdl.runtime.queryOutput enabling on-demand output retrieval when needed.
Why it matters:
- Proof-of-need gating prevents agents from wastefully reading raw code
- Denied requests include actionable next-best-action guidance
- Full audit logging of every code access decision
- Sandboxed runtime with executable allowlisting, CWD jailing, and environment scrubbing
Governance & Policy Deep Dive โ
Agent Context โ Task-Shaped Retrieval
sdl.context is SDL-MCP's task-shaped context engine. Give it a task type (debug, review, implement, explain), a description, and a budget โ it selects the right Iris Gate rungs, collects evidence, and returns context tuned to the job. In Code Mode, sdl.context provides the same retrieval surface without dropping into sdl.workflow.
Unscoped natural-language context calls use confidence-gated hybrid retrieval by default. Exact symbol mentions and explicit focusPaths / focusSymbols stay on the fast path; low-confidence lexical results can escalate to bounded FTS + vector retrieval. Set options.semantic: true to force hybrid retrieval, or options.semantic: false to keep lexical-only behavior for deterministic debugging.
The feedback loop (sdl.agent.feedback) records which symbols were useful and which were missing, improving future slice quality.
For portable exports such as tickets and PR descriptions, use the CLI sdl-mcp summary command. It generates token-bounded context briefings in markdown, JSON, or clipboard format for use outside MCP environments.
Why it matters:
- Task-shaped context retrieval plans the right Iris Gate path within a token budget
- Confidence-gated hybrid retrieval improves discovery without slowing known-target lookups
- Feedback loop records what was useful/missing, improving future slice quality
- Portable context summaries export findings for use outside MCP environments
Agent Context Deep Dive โ ยท Context Modes โ
Sandboxed Runtime Execution
Run tests, linters, and scripts through SDL-MCP's governance layer instead of uncontrolled shell access. 16 runtimes (Node.js, Python, Go, Java, Rust, Shell, and more), code-mode or args-mode, smart output summarization with keyword-matched excerpts, and gzip artifact persistence.
Why it matters:
- Run tests, linters, and scripts under governance instead of uncontrolled shell access
- 16 runtimes supported (Node, Python, Go, Java, Rust, Shell, and more)
- Executable allowlisting, CWD jailing, timeout enforcement, and environment scrubbing
- Smart output summarization with keyword-matched excerpts and gzip artifact persistence
Runtime Execution Deep Dive โ
Development Memories โ Cross-Session Knowledge Persistence (Opt-In)
Agents forget everything between sessions. SDL-MCP fixes this with an opt-in graph-backed memory system that lets agents store decisions, bugfix context, and task notes linked directly to the symbols and files they relate to. Memory is disabled by default and must be explicitly enabled in the configuration. When enabled, memories are stored both in the graph database (for fast querying) and as checked-in markdown files (for version control and team sharing).
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart LR
Session1["Agent session 1<br/>records bugfix memory"] e1@--> Store["sdl.memory.store"]
Store e2@--> Graph["LadybugDB memory node"]
Store e3@--> Files[".sdl-memory/bugfixes/<id>.md"]
Graph e4@--> Link1["MEMORY_OF -> authenticate()"]
Graph e5@--> Link2["HAS_MEMORY -> repo"]
Session2["Agent session 2"] e6@--> Surface["sdl.memory.surface"]
Surface e7@--> Graph
Graph e8@--> Recall["Relevant memory surfaced<br/>race condition fix in authenticate()"]
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5,e6,e7,e8 animate;
When enabled, memories are automatically surfaced inside graph slices โ when an agent builds a slice touching symbols with linked memories, those memories appear alongside the cards. During re-indexing, memories linked to changed symbols are flagged as stale, prompting agents to review and update them. Four MCP tools (store, query, remove, surface) provide full CRUD plus intelligent ranking by confidence, recency, and symbol overlap. Memory tools are only available when memory is enabled in the configuration.
Why it matters:
- Structured knowledge persists across sessions, linked directly to symbols and files
- Opt-in and disabled by default โ enable via
"memory": { "enabled": true }in config - When enabled, automatically surfaced inside graph slices when touching related symbols
- Stale memories flagged when linked symbols change during re-indexing
- Dual storage: graph DB for fast querying + markdown files for version control and team sharing
Development Memories Deep Dive โ
SCIP Integration โ Compiler-Grade Cross-References
Tree-sitter gives SDL-MCP fast, syntax-level symbol extraction across the supported TypeScript/JavaScript, Python, Go, Java, C#, C/C++, PHP, Rust, Kotlin, and Shell surface. SCIP (Source Code Intelligence Protocol) supplements this with compiler-grade cross-references from tools like scip-typescript, scip-go, and rust-analyzer. Generate a .scip index file, point SDL-MCP at it, and heuristic edges are upgraded to exact compiler-verified edges, external dependency symbols become first-class graph nodes, and new implements edges reveal interface/trait relationships that syntax analysis cannot discover.
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart LR
Compiler["Compiler / Type Checker"] e1@--> SCIP[".scip index file"]
SCIP e2@--> Ingest["sdl.scip.ingest"]
Ingest e3@--> Upgrade["Heuristic edges โ exact edges"]
Ingest e4@--> External["External dependency nodes"]
Ingest e5@--> Implements["implements edges"]
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5 animate;
Why it matters:
- Upgrades heuristic call resolution to compiler-verified exact edges (confidence 0.95)
- External dependencies (npm packages, Go modules, crate deps) become searchable graph nodes
- Interface/trait implementations tracked via
implementsedges - Auto-ingest on
sdl.index.refreshkeeps SCIP data current with zero manual steps - Complementary: tree-sitter provides structure, SCIP provides semantic precision
SCIP Integration Deep Dive โ
CLI Tool Access โ No MCP Server Required
Access SDL-MCP direct action aliases plus the low-risk action.search and manual metadata proxies from the command line with sdl-mcp tool. No MCP server, transport, or SDK is required.
# Search for symbols
sdl-mcp tool symbol.search --query "handleAuth" --output-format pretty
# Build a task-scoped slice
sdl-mcp tool slice.build --task-text "debug auth flow" --max-cards 50
# Pipe JSON args, chain commands
echo '{"repoId":"my-repo"}' | sdl-mcp tool symbol.search --query "auth"
# Apply a single-file targeted write
sdl-mcp tool file.write --repo-id my-repo --file-path config/app.json \
--json-path server.port --json-value 8080
# Discover and inspect metadata without opening the graph DB
sdl-mcp tool action.search --query manual --summary-only
sdl-mcp tool manual --actions action.search --format json
Features include typed argument coercion (string, number, boolean, string[], json), budget flag merging, stdin JSON piping with CLI flag precedence, auto-resolved repoId from cwd for graph actions, four output formats (json, json-compact, pretty, table), typo suggestions, and per-action --help. Direct graph actions dispatch through the same gateway router and Zod schemas as the MCP server; action.search and manual run in process against the same metadata handlers used by MCP registration.
Why it matters:
- 36 direct graph/action aliases plus
action.searchandmanualmetadata proxies accessible from any terminal - no server, transport, or SDK required - Direct graph actions keep gateway-router/Zod parity; metadata proxies share the same MCP registration handlers
- Four output formats (json, json-compact, pretty, table) for scripting and CI pipelines
- Auto-resolves repoId from cwd, supports stdin JSON piping and per-action
--help
Tool Gateway โ Compact Tool Registration
The tool gateway projects the 35 gateway-routable SDL actions into 4 namespace-scoped tools (sdl.query, sdl.code, sdl.repo, sdl.agent), reducing tools/list overhead from the full flat schema surface to a compact gateway surface.
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart LR
Before["Flat mode<br/>38 tools<br/>2 universal + 36 flat"] e1@--> After["Gateway mode<br/>6 tools<br/>2 universal + 4 gateway"]
After e2@--> Savings["Smaller tools/list payload<br/>lower agent startup overhead"]
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2 animate;
Each gateway tool accepts an action discriminator field (e.g., { action: "symbol.search", repoId: "x", query: "auth" }) and routes to the same handlers with double Zod validation. Thin wire schemas in tools/list keep the registration compact while full validation happens server-side. The flat-only sdl.file.write action remains outside gateway mode today.
Why it matters:
- Large reduction in
tools/listoverhead for gateway-first agents - 35 gateway-routable actions consolidated into 4 namespace-scoped tools for simpler agent selection
- Fewer tool choices means faster and more accurate tool dispatch by the agent
- Choose Code Mode for task-shaped retrieval first; opt out of exclusive Code Mode when you also need regular flat or gateway tools
Observability Dashboard
Built-in read-only dashboard surfaces every metric needed to diagnose SDL-MCP behaviour without parsing stderr logs. GlitterKill dark UI at /ui/observability on the HTTP transport or the loopback-only sdl-mcp serve --stdio --dashboard-port <port> sidecar, plus REST + SSE APIs (/api/observability/snapshot, /timeseries, /beam-explain, /stream) for programmatic access. Surfaces cache hit rates, hybrid-retrieval breakdowns (FTS / vector / PPR / RRF), beam-search decision traces, indexing pipeline metrics, write-pool and drain saturation, packed-wire token efficiency, and runtime CPU/memory/event-loop probes. See Observability Dashboard Deep Dive.
<br/>
Current Tool Surface at a Glance
| Mode | Tool count | Composition |
|---|---|---|
| Flat | 38 | 2 universal + 36 flat tools |
| Gateway | 6 | 2 universal + 4 gateway tools |
| Gateway + legacy | 42 | 2 universal + 4 gateway + 36 flat tools |
| Code Mode exclusive | 5 | sdl.action.search, sdl.context, sdl.file, sdl.manual, sdl.workflow |
The generated source of truth is docs/generated/tool-inventory.md.
Complete MCP Tools Reference (detailed parameters & responses) โ
<br/><br/>
CLI Commands
| Command | Description |
|---|---|
sdl-mcp init | Bootstrap config, detect repo/languages, optionally auto-index |
sdl-mcp doctor | Validate runtime, config, DB, grammars, repo access |
sdl-mcp index | Index repositories (with optional --watch mode) |
sdl-mcp serve | Start MCP server (--stdio or --http) |
sdl-mcp tool | Access 36 direct action aliases (docs) |
sdl-mcp info | Runtime diagnostics โ version, Node.js, platform, database, config |
sdl-mcp summary | Generate copy/paste context summaries from the CLI |
sdl-mcp health | Compute composite health score with badge/JSON output |
sdl-mcp benchmark | Run CI regression benchmarks |
sdl-mcp export | Export sync artifact |
sdl-mcp import | Import sync artifact |
sdl-mcp pull | Pull by version/commit with fallback |
sdl-mcp version | Show version and environment info |
CLI Reference โ ยท Configuration Reference โ
<br/><br/>
Compatible With
SDL-MCP works with any MCP-compatible client:
| Client | Transport | Setup |
|---|---|---|
| Claude Code | stdio | sdl-mcp init --client claude-code |
| Claude Desktop | stdio | sdl-mcp init --client claude-code |
| Cursor | stdio | Standard MCP server config |
| Windsurf | stdio | Standard MCP server config |
| Codex CLI | stdio | sdl-mcp init --client codex |
| Gemini CLI | stdio | sdl-mcp init --client gemini |
| OpenCode | stdio | sdl-mcp init --client opencode |
| Any MCP client | stdio / http | sdl-mcp serve --stdio or --http |
A VSCode extension (sdl-mcp-vscode/) provides live buffer integration for real-time indexing of unsaved edits.
<br/>
Tech Stack
| Component | Technology |
|---|---|
| Runtime | Node.js 24+ / TypeScript 5.9+ (strict ESM) |
| Graph Database | LadybugDB (embedded, single-file) |
| Indexer (default) | Rust via napi-rs (multi-threaded) |
| Indexer (fallback) | tree-sitter + tree-sitter-typescript |
| MCP SDK | @modelcontextprotocol/sdk |
| Validation | Zod schemas for all payloads |
| Transports | stdio (agents) ยท HTTP (dev/network) |
<br/>
System Architecture
%%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
flowchart TD
Clients["MCP clients<br/>Claude Code, Claude Desktop, Cursor, Windsurf, Codex, Gemini"]
Gateway["Tool gateway<br/>sdl.query, sdl.code, sdl.repo, sdl.agent"]
Flat["Flat tools and optional code-mode surfaces"]
Policy["Policy engine<br/>proof-of-need, budgets, audit logging"]
Graph["LadybugDB graph<br/>symbols, edges, files, versions, memories"]
Indexer["Indexer pipeline<br/>Rust native or Tree-sitter fallback<br/>pass 1, pass 2, semantic enrichment"]
Clients e1@--> Gateway
Clients e2@--> Flat
Gateway e3@--> Policy
Flat e4@--> Policy
Policy e5@--> Graph
Indexer e6@--> Graph
classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
class e1,e2,e3,e4,e5,e6 animate;
Full Architecture Documentation โ
<br/><br/>
Documentation
| Document | Description |
|---|---|
| Getting Started | Installation, 5-minute setup, MCP client config |
| MCP Tools Reference | Detailed docs for the current flat, gateway, and Code Mode surfaces |
| CLI Reference | All CLI commands and options |
| Configuration Reference | Every config option with defaults and guidance |
| Agent Workflows | Workflow instructions for CLAUDE.md / AGENTS.md |
| Architecture | Tech stack, data flow, component diagram |
| Iris Gate Ladder | Context escalation methodology |
| Troubleshooting | Common issues and fixes |
Feature Deep Dives
| Topic | What You'll Learn |
|---|---|
| Iris Gate Ladder | Four-rung context escalation with token savings analysis |
| Graph Slicing | BFS/beam search, edge weights, wire formats, auto-discovery |
| Delta & Blast Radius | Semantic diffs, ranked impact analysis, PR risk scoring |
| Live Indexing | Real-time editor buffer integration and overlay architecture |
| Governance & Policy | Proof-of-need gating, audit logging, runtime sandboxing |
| Agent Context | Task-shaped context retrieval, feedback loops, portable context summaries |
| Context Modes | Precise vs broad retrieval, adaptive symbol ranking, benchmark trade-offs |
| Indexing & Languages | Rust/TS engines, two-pass architecture, 12-language support |
| Runtime Execution | Sandboxed subprocess execution with governance |
| CLI Tool Access | Direct CLI access to 36 action aliases, output formats, stdin piping, scripting |
| Tool Gateway | 35 gateway-routable actions, 4 namespace tools, thin schemas, migration guide |
| Semantic Engine | Pass-2 call resolution, embedding search, LLM summaries, confidence scoring |
| Semantic Embeddings Setup | Dependencies, model installation, provider configuration, tier-by-tier setup |
| Code Mode | sdl.context, sdl.workflow, action discovery, manual reference, one-call workflows |
| Development Memories | Graph-backed cross-session memory, file sync, staleness detection, auto-surfacing |
| SCIP Integration | Compiler-grade cross-references, external deps, implements edges, auto-ingest |
| Token Savings Meter | Per-call meter, session summaries, lifetime tracking, sdl.usage.stats |
<br/>
License
This project is source-available.
- Free Use (Community License): You may use, run, and modify this software for any purpose, including internal business use, under the terms in
LICENSE. - Commercial Distribution / Embedding: You must obtain a commercial license before you sell, license, sublicense, bundle, embed, or distribute this software as part of a for-sale or monetized product. See
COMMERCIAL_LICENSE.md.
Questions? Contact gmullins.gkc@gmail.com.