内容
# Kernava MCP
基于图谱的编码智能MCP服务器,使用Rust构建。通过tree-sitter解析代码库,存储符号和调用关系在SQLite-WAL中,并通过可流式HTTP提供温暖的内存调用图。旨在实现令牌效率——回答“谁调用了这个?”,“这个更改的影响范围是多少?”,以及“哪里有死代码?”等问题,而无需重新读取文件。
## 为什么
大多数编码MCP工具要么在每次查询时重新读取文件(昂贵,令牌密集),要么依赖LSP往返(缓慢,特定于语言)。Kernava构建调用图一次,将其保存在内存中,并在毫秒级回答结构问题——MCP客户端从不触及源文件。
## 架构
```
源文件 → tree-sitter(11种语言)→ 符号 + 调用 + 导入
↓
SQLite-WAL(持久,FTS5全文搜索)
↓
GraphCache(DashMap,内存,跨会话共享)
↓
MCP服务器(通过rmcp流式HTTP)
```
- **传输**: 通过[`rmcp`](https://crates.io/crates/rmcp)的流式HTTP。长寿命进程——调用图在MCP会话之间保持温暖。没有stdio冷启动惩罚。
- **存储**: SQLite-WAL与FTS5。已在2800万LOC上验证,毫秒级查询。
- **图**: 单个全局`GraphCache`(基于DashMap),跨所有MCP会话共享。无锁读取。
- **解析**: tree-sitter,11种语言。文件监视时增量重新索引,内容哈希去重。
## 支持的语言
| 语言 | 符号提取 | 调用解析 | 导入解析 |
|---|---|---|---|
| TypeScript / TSX | ✅ | ✅ 高 | ✅ |
| JavaScript / JSX | ✅ | ✅ 中 | ✅(CommonJS + ESM) |
| Python | ✅ | ✅ 高 | ✅ |
| Rust | ✅ | ✅ 中 | ✅ |
| Go | ✅ | ✅ 中 | ✅ |
| Java | ✅ | ✅ 高 | ✅ |
| C# | ✅ | ✅ 高 | ✅ |
| Ruby | ✅ | ⚠ 中 | ✅ |
| PHP | ✅ | ⚠ 中 | ✅ |
| C | ✅ | ⚠ 中 | ✅ |
| C++ | ✅ | ⚠ 中 | ✅ |
Kotlin暂缓(tree-sitter-kotlin需要tree-sitter <0.23,与workspace 0.25不兼容)。
## MCP工具
| 工具 | 描述 |
|---|---|
| `index_project` | 解析所有源文件,构建符号+调用图,填充SQLite+温暖RAM缓存 |
| `get_index_status` | 文件数,符号数,边数,已解析调用,语言分布 |
| `search_symbols` | FTS5全文符号搜索(camelCase,snake_case,PascalCase标记化) |
| `get_symbol` | 完整元数据:种类,签名,返回类型,复杂度,调用者/被调用者计数 |
| `get_file_outline` | 文件中的所有符号,按行排序 |
| `find_references` | 代码库中的每个调用站点 |
| `find_definition` | 从给定调用站点调用的符号的定义 |
| `search_code` | 跨所有索引文件内容的正则表达式搜索 |
| `get_callers` | 直接调用者(反向邻接)与调用站点位置 |
| `get_callees` | 直接被调用者(前向邻接)与调用站点位置 |
| `get_call_path` | 通过BFS的最短调用路径源→目标 |
| `get_impact_radius` | 传递调用者(反向BFS)按深度分组,风险评分 |
| `detect_dead_code` | 符号的零入边,减去入口点 |
| `get_communities` | 对称调用边的Louvain社区检测 |
| `get_architecture` | 语言分布,模块结构,入口点,中心,社区 |
| `get_git_impact` | `git diff` → 受影响的符号 → 影响半径 → 风险分类 |
## 快速开始
```bash
# 构建
cargo build --release
# 启动MCP服务器(索引您的项目,监听端口8080)
./target/release/kernava serve --port 8080 --project-root /path/to/your/project
# 或从CLI索引而不运行服务器
./target/release/kernava index --path /path/to/your/project
./target/release/kernava stats # 显示索引统计信息
# 从CLI查询索引(用于调试/脚本)
./target/release/kernava query search_symbols --args '{"query":"handleRequest"}' --db-path kernava.db
```
然后配置您的MCP客户端(如下)连接到`http://localhost:8080/mcp`。
## MCP客户端配置
### Claude Code
```json
{
"mcpServers": {
"kernava": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}
}
```
### Cursor
```json
{
"mcpServers": {
"kernava": {
"url": "http://localhost:8080/mcp"
}
}
}
```
### Zed
```json
{
"context_servers": {
"kernava": {
"url": "http://localhost:8080/mcp",
"headers": {}
}
}
}
```
### 通用MCP客户端
端点:`http://localhost:8080/mcp`(流式HTTP,POST)。
## 工作区布局
```
crates/
kernava-server/ MCP服务器(rmcp + axum,16种工具)
kernava-indexer/ tree-sitter解析,符号/调用提取,导入解析
kernava-graph/ 内存调用图(DashMap),Louvain社区,BFS遍历
kernava-store/ SQLite-WAL持久性,FTS5搜索
```
## 调用解析
索引时采用六策略级联:
1. **导入映射** — 将被调用者与导入的名称匹配 → 限定目标
2. **同一文件** — 被调用者与同一文件中定义的符号匹配
3. **全局唯一** — 被调用者在代码库中全局唯一
4. **跨文件** — 被调用者与导入路径上的文件中的符号匹配
5. **默认** — 被调用者未解析,边存储为`target_id = NULL`
6. **内置函数** — 常见标准库调用(部分v1)
## 性能
在调试构建(Intel i5-9400,Linux)上使用`criterion`测量。发布构建更快。
| 操作 | 中位数 | 它测量什么 |
|---|---|---|
| 解析TypeScript | 10.5 µs | 仅tree-sitter解析 |
| 解析Python | 6.7 µs | 仅tree-sitter解析 |
| 解析Rust | 7.2 µs | 仅tree-sitter解析 |
| 索引单个文件 | 789 µs | 解析 → 提取 → 解析 → SQLite插入(1个事务) |
| 索引11个文件 | 2.4 ms | 完整项目:遍历 → 拓扑排序 → 索引所有文件 |
| 符号搜索(FTS5) | 34 µs | 跨所有符号的全文搜索 |
| 跨样式搜索 | 38 µs | 蛇形查询匹配驼峰符号 |
11种语言支持,SQLite-WAL存储,毫秒级查询。调用图在所有MCP会话中保持在内存中 — 没有冷启动。
## 许可证
在MIT或Apache-2.0下双重许可。