clouatre-labs/code-analyze-mcp

GitHub: clouatre-labs/code-analyze-mcp

基于 tree-sitter 的 MCP 服务器,为 LLM 提供高效的代码结构分析、语义提取和调用图生成能力。

Stars: 1 | Forks: 0

# code-analyze-mcp [![MCP Security Scan](https://img.shields.io/github/actions/workflow/status/clouatre-labs/code-analyze-mcp/mcp-scan.yml?label=mcp-scan&logo=cisco)](https://github.com/clouatre-labs/code-analyze-mcp/actions/workflows/mcp-scan.yml) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![Rust](https://img.shields.io/badge/rust-2024_edition-orange.svg)](https://www.rust-lang.org) [![MCP](https://img.shields.io/badge/protocol-MCP-purple.svg)](https://modelcontextprotocol.io) 使用 tree-sitter 进行代码结构分析的独立 MCP server。
## 概述 code-analyze-mcp 是一个 Model Context Protocol server,可分析 5 种编程语言的代码结构。它提供三个工具:`analyze_directory`(带指标的文件树)、`analyze_file`(单个文件中的函数、类、导入)以及 `analyze_symbol`(指定符号的调用图)。它与任何兼容 MCP 的编排器(Claude Code、Kiro、Fast-Agent、MCP-Agent 等)集成,在最大限度地减少 token 使用量的同时,为 LLM 提供精确的结构上下文。 ## 安装 ### Homebrew (macOS 和 Linux) ``` brew install clouatre-labs/tap/code-analyze-mcp ``` 更新:`brew upgrade code-analyze-mcp` ### cargo-binstall (无需 Rust) ``` cargo binstall code-analyze-mcp ``` ### cargo install (需要 Rust 工具链) ``` cargo install code-analyze-mcp ``` ## 快速开始 ### 从源码构建 ``` cargo build --release ``` 二进制文件位于 `target/release/code-analyze-mcp`。 ### 配置 MCP Client 通过 brew 或 cargo 安装后,向 Claude Code CLI 注册: ``` claude mcp add --transport stdio code-analyze -- code-analyze-mcp ``` 如果您是从源码构建的,请直接使用二进制文件路径: ``` claude mcp add --transport stdio code-analyze -- /path/to/repo/target/release/code-analyze-mcp ``` 使用 stdio 是有意为之:该服务器在本地运行并直接处理磁盘上的文件。这种低延迟、零网络开销的传输方式非常适合该用例。对于本地工具而言,可流式传输的 HTTP 会增加网络跳数,却没有任何好处。 或者手动添加到项目根目录的 `.mcp.json`(通过版本控制与您的团队共享): ``` { "mcpServers": { "code-analyze": { "command": "code-analyze-mcp", "args": [] } } } ``` ## 工具 所有可选参数均可省略。工具间通用的可选参数: | 参数 | 类型 | 默认值 | 描述 | |-----------|------|---------|-------------| | `summary` | boolean | auto | 紧凑输出;超过 50K 字符时自动触发 | | `cursor` | string | -- | 来自上一次响应 `next_cursor` 的分页游标 | | `page_size` | integer | 100 | 每页条目数 | | `force` | boolean | false | 跳过输出大小警告 | ### `analyze_directory` 遍历目录树,统计每个文件的代码行数、函数数和类数。遵循 `.gitignore` 规则。 **必填:** `path` *(string)* -- 要分析的目录 **额外可选:** `max_depth` *(integer,默认无限制)* -- 递归限制;对于大型 monorepo,建议使用 2-3 **示例输出:** ``` 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 ``` ``` analyze_directory path: /path/to/project analyze_directory path: /path/to/project max_depth: 2 analyze_directory path: /path/to/project summary: true ``` ### `analyze_file` 从单个文件中提取函数、类、导入和类型引用。 **必填:** `path` *(string)* -- 要分析的文件 **额外可选:** `ast_recursion_limit` *(integer,默认 256)* -- tree-sitter 递归上限,用于栈安全 **示例输出:** ``` 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] ``` ``` analyze_file path: /path/to/file.rs analyze_file path: /path/to/file.rs page_size: 50 analyze_file path: /path/to/file.rs cursor: eyJvZmZzZXQiOjUwfQ== ``` ### `analyze_symbol` 为目录中所有文件的指定符号构建调用图。使用哨兵值 ``(顶层调用)和 ``(类型引用)。被调用超过 3 次的函数会显示 `(•N)` 标记。 **必填:** - `path` *(string)* -- 要搜索的目录 - `symbol` *(string)* -- 符号名称,区分大小写且精确匹配 **额外可选:** - `follow_depth` *(integer,默认 1)* -- 调用图遍历深度 - `max_depth` *(integer,默认无限制)* -- 目录递归限制 - `ast_recursion_limit` *(integer,默认 256)* -- tree-sitter 递归上限,用于栈安全 **示例输出:** ``` FOCUS: analyze DEPTH: 2 FILES: 12 analyzed DEFINED: src/lib.rs:35 CALLERS (incoming): main -> analyze [src/main.rs:12] -> 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] ``` ``` analyze_symbol path: /path/to/project symbol: my_function analyze_symbol path: /path/to/project symbol: my_function follow_depth: 3 analyze_symbol path: /path/to/project symbol: my_function max_depth: 3 follow_depth: 2 ``` ## 输出管理 对于大型代码库,有两种机制可防止上下文溢出: **分页** 当输出被截断时,`analyze_file` 和 `analyze_symbol` 会追加一行 `NEXT_CURSOR:`。将该 token 作为 `cursor` 传回以获取下一页。 ``` # 响应结束于: NEXT_CURSOR: eyJvZmZzZXQiOjUwfQ== # 获取下一页: analyze_symbol path: /my/project symbol: my_function cursor: eyJvZmZzZXQiOjUwfQ== ``` **摘要模式** 当输出超过 50K 字符时,服务器会使用汇总统计数据自动压缩结果。可通过 `summary: true`(强制压缩)或 `summary: false`(禁用)进行覆盖。 ``` # 强制摘要大型项目 analyze_directory path: /huge/codebase summary: true # 禁用摘要(获取完整详情,可能较大) analyze_directory path: /project summary: false ``` ## 非交互式 Pipeline 在单次子代理会话中,prompt 缓存会被写入但从未被重用。基准测试显示,MCP 响应写入缓存的数据量约为原生工作流的 2 倍,增加了成本却未带来质量提升。设置 `DISABLE_PROMPT_CACHING=1`(或针对 Haiku 特定 pipeline 设置 `DISABLE_PROMPT_CACHING_HAIKU=1`)以避免此开销。 ## 支持的语言 | 语言 | 扩展名 | 状态 | |----------|-----------|--------| | Rust | `.rs` | 已实现 | | Python | `.py` | 已实现 | | TypeScript | `.ts`, `.tsx` | 已实现 | | Go | `.go` | 已实现 | | Java | `.java` | 已实现 | ## 文档 - **[ARCHITECTURE.md](docs/ARCHITECTURE.md)** - 设计目标、模块图、数据流、语言处理器系统、缓存策略 - **[MCP, Agents, and Orchestration](docs/anthropic-mcp-agents-orchestration.md)** - 智能体循环、编排模式、MCP 工具设计、内存管理和安全控制的最佳实践 - **[CONTRIBUTING.md](CONTRIBUTING.md)** - 开发工作流、提交约定、PR 检查清单 - **[SECURITY.md](SECURITY.md)** - 安全策略和漏洞报告 ## 许可证 Apache-2.0。详情请参阅 [LICENSE](LICENSE)。
标签:Claude, Claude Code, CVE检测, LLM工具, MCP服务器, Model Context Protocol, odt, Rust, Tree-sitter, 云安全监控, 代码分析, 代码理解, 代码结构, 低延迟, 凭证管理, 可视化界面, 多语言支持, 威胁情报, 安全测试框架, 开发者工具, 抽象语法树, 本地部署, 源代码解析, 符号分析, 网络流量审计, 调用图, 通知系统, 零网络开销, 静态分析