code-analyze-mcp
Standalone MCP server for code structure analysis using tree-sitter.
Overview
code-analyze-mcp is a Model Context Protocol server that analyzes code structure across 5 programming languages. It provides three analysis modes: directory overview (file tree with metrics), file-level semantic analysis (functions, classes, imports), and symbol-focused call graphs. It integrates with any MCP-compatible orchestrator (Claude Code, Kiro, Fast-Agent, MCP-Agent, and others), minimizing token usage while giving the LLM precise structural context.
Installation
Homebrew (macOS and Linux)
Update: brew upgrade code-analyze-mcp
cargo-binstall (no Rust required)
cargo install (requires Rust toolchain)
Quick Start
Build from source
The binary is at target/release/code-analyze-mcp.
Configure MCP Client
Add to .mcp.json at your project root (shared with your team via version control):
Or add via the Claude Code CLI:
Tool Interface
The analyze tool accepts these parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
path |
string | Yes | — | File or directory to analyze |
max_depth |
integer | No | unlimited | Directory recursion limit |
focus |
string | No | — | Symbol name for call graph analysis (case-sensitive) |
follow_depth |
integer | No | 1 | Call graph traversal depth |
ast_recursion_limit |
integer | No | 256 | Tree-sitter recursion limit for stack safety |
force |
boolean | No | false | Bypass output size warning |
mode |
string | No | auto | Analysis mode: 'overview', 'file_details', 'symbol_focus' |
summary |
boolean | No | auto | Compact output; unset=auto-detect when output exceeds 50K chars |
cursor |
string | No | — | Opaque pagination cursor token (from previous response's next_cursor) |
page_size |
integer | No | 100 | Number of items per page |
Mode Auto-Detection
graph TD
A["analyze tool called"] --> B{"Parameters provided?"}
B -->|focus param| C["Symbol Focus Mode"]
B -->|path is file| D["File Details Mode"]
B -->|path is directory| E["Directory Overview Mode"]
C --> F["Build call graph for symbol"]
D --> G["Extract semantic elements from file"]
E --> H["Walk directory tree and count elements"]
F --> I["Return MCP response"]
G --> I
H --> I
Analysis Modes
Directory Overview
Walks a directory tree, counts lines of code, functions, and classes per file. Respects .gitignore rules via the ignore crate.
Triggered when: Path is a directory and no focus parameter is provided.
Example output:
src/ [328 LOC | F:28 C:5]
main.rs [18 LOC | F:1 C:0]
lib.rs [156 LOC | F:12 C:3]
parser.rs [89 LOC | F:8 C:2]
formatter.rs [65 LOC | F:7 C:0]
languages/ [142 LOC | F:19 C:5]
mod.rs [45 LOC | F:5 C:2]
rust.rs [97 LOC | F:14 C:3]
Total: 4 files, 328 LOC, 28 functions, 5 classes
Usage:
# Overview with default recursion
# Limit depth to 2 levels
# Get summary totals only
File Details
Extracts functions, classes, imports, and type references from a single file.
Triggered when: Path is a file and no focus parameter is provided.
Example output:
FILE: src/lib.rs [156 LOC | F:12 C:3]
CLASSES:
CodeAnalyzer:20
SemanticExtractor:45
FUNCTIONS:
new:27
analyze:35
extract:52
format_content:78
build_index:89
IMPORTS:
rmcp (3)
serde (2)
tree_sitter (4)
thiserror (1)
REFERENCES:
methods: [analyze, extract, format_content]
types: [AnalysisResult, SemanticData, ParseError]
fields: [path, mode, language]
Usage:
# File details
# Get paginated results (100 items per page)
# Fetch next page
Symbol Call Graph
Builds a call graph for a named symbol and traverses it with configurable depth. Uses sentinel values <module> (top-level calls) and <reference> (type references).
Triggered when: focus parameter is provided.
Example output:
FOCUS: analyze
DEPTH: 2
FILES: 12 analyzed
DEFINED:
src/lib.rs:35
CALLERS (incoming):
main -> analyze [src/main.rs:12]
<module> -> analyze [src/lib.rs:40]
process_request -> analyze [src/handler.rs:88]
CALLEES (outgoing):
analyze -> determine_mode [src/analyze.rs:44]
analyze -> format_output [src/formatter.rs:12] (•2)
analyze -> validate_params [src/validation.rs:5]
determine_mode -> is_directory [src/utils.rs:23]
Functions called >3 times show (•N) notation.
Usage:
# Call graph with default depth (1)
# Deeper traversal
# With directory limit
Output Management
For large codebases, two mechanisms prevent context overflow:
Pagination
File details and symbol focus modes append a NEXT_CURSOR: line when output is truncated. Pass the token back as cursor to fetch the next page.
# Response ends with:
NEXT_CURSOR: eyJvZmZzZXQiOjUwfQ==
# Fetch next page:
analyze path: /my/project cursor: eyJvZmZzZXQiOjUwfQ== page_size: 100
Summary Mode
When output exceeds 50K chars, the server auto-compacts results using aggregate statistics. Override with summary: true (force) or summary: false (disable).
# Force summary for large project
# Disable summary (get full details, may be large)
Supported Languages
| Language | Extensions | Status |
|---|---|---|
| Rust | .rs |
Implemented |
| Python | .py |
Implemented |
| TypeScript | .ts, .tsx |
Implemented |
| Go | .go |
Implemented |
| Java | .java |
Implemented |
Documentation
- ARCHITECTURE.md - Design goals, module map, data flow, language handler system, caching strategy
- CONTRIBUTING.md - Development workflow, commit conventions, PR checklist
- SECURITY.md - Security policy and vulnerability reporting
License
Apache-2.0. See LICENSE for details.