nordicnode/kernava-mcp
GitHub: nordicnode/kernava-mcp
基于 Rust 的图驱动编码智能 MCP 服务器,通过预构建内存调用图和 SQLite 持久化,以极低 token 消耗为 AI 编程助手提供亚毫秒级代码结构查询。
Stars: 1 | Forks: 0
# Kernava MCP
一个基于 Rust 构建、由图结构驱动的编码智能 MCP server。使用 tree-sitter 解析您的代码库,将符号和调用关系存储在 SQLite-WAL 中,并通过可流式传输的 HTTP 提供位于 RAM 中的热调用图。专为提高 token 效率而设计——无需重新读取文件即可回答“谁调用了这个?”、“此更改的影响范围有多大?”以及“死代码在哪里?”。
## 为什么需要它
大多数编码 MCP 工具要么在每次查询时重新读取文件(开销大、消耗 token 多),要么依赖 LSP 往返(速度慢、特定于语言)。Kernava 仅构建一次调用图,将其保持在 RAM 中处于活跃状态,并在亚毫秒级内回答结构性问题——MCP 客户端无需触碰源文件。
## 架构
```
Source files → tree-sitter (11 languages) → symbols + calls + imports
↓
SQLite-WAL (persistent, FTS5 full-text search)
↓
GraphCache (DashMap, in-RAM, shared across sessions)
↓
MCP server (streamable HTTP via rmcp)
```
- **Transport**:通过 [`rmcp`](https://crates.io/crates/rmcp) 进行可流式传输的 HTTP。长生命周期进程——图表在 MCP 会话之间保持活跃状态。没有 stdio 冷启动惩罚。
- **Storage**:带有 FTS5 的 SQLite-WAL。在 28M LOC 下得到验证,查询耗时低于 1 毫秒。
- **Graph**:单一全局 `GraphCache`(由 DashMap 支持)在所有 MCP 会话之间共享。无锁读取。
- **Parsing**:tree-sitter,支持 11 种语言。在文件监控时进行增量重新索引,并带有内容哈希去重。
## 支持的语言
| 语言 | 符号提取 | 调用解析 | Import 解析 |
|---|---|---|---|
| TypeScript / TSX | ✅ | ✅ 高 | ✅ |
| JavaScript / JSX | ✅ | ✅ 中 | ✅ (CommonJS + ESM) |
| Python | ✅ | ✅ 高 | ✅ |
| Rust | ✅ | ✅ 中 | ✅ |
| Go | ✅ | ✅ 中 | ✅ |
| Java | ✅ | ✅ 高 | ✅ |
| C# | ✅ | ✅ 高 | ✅ |
| Ruby | ✅ | ⚠ 中 | ✅ |
| PHP | ✅ | ⚠ 中 | ✅ |
| C | ✅ | ⚠ 中 | ✅ |
| C++ | ✅ | ⚠ 中 | ✅ |
Kotlin 已推迟(tree-sitter-kotlin 要求 tree-sitter <0.23,与工作区 0.25 不兼容)。
## MCP 工具
| 工具 | 描述 |
|---|---|
| `index_project` | 解析所有源文件,构建符号 + 调用图,填充 SQLite + 预热 RAM cache |
| `get_index_status` | 文件数量、符号数量、边数量、已解析的调用、语言分布 |
| `search_symbols` | FTS5 全文符号搜索(已对 camelCase、snake_case、PascalCase 进行分词) |
| `get_symbol` | 完整元数据:种类、签名、返回类型、复杂度、调用者/被调用者计数 |
| `get_file_outline` | 文件中的所有符号,按行排序 |
| `find_references` | 整个代码库中的每个调用点 |
| `find_definition` | 从给定调用点调用的符号的定义 |
| `search_code` | 跨所有已索引文件内容的 Regex 搜索 |
| `get_callers` | 带有调用点位置信息的直接调用者(反向邻接) |
| `get_callees` | 带有调用点位置信息的直接被调用者(正向邻接) |
| `get_call_path` | 通过 BFS 查找最短调用路径 source→target |
| `get_impact_radius` | 按深度分组的带有风险评分的传递调用者(反向 BFS) |
| `detect_dead_code` | 具有零入边的符号,去除入口点 |
| `get_communities` | 通过对称化调用边进行 Louvain 社区发现 |
| `get_architecture` | 语言分布、模块结构、入口点、枢纽、社区 |
| `get_git_impact` | `git diff` → 受影响的符号 → 影响范围 → 风险分类 |
## 快速开始
```
# 构建
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 # show index statistics
```
然后配置您的 MCP 客户端(见下文)以连接到 `http://localhost:8080/mcp`。
## MCP 客户端配置
### Claude Code
```
{
"mcpServers": {
"kernava": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}
}
```
### Cursor
```
{
"mcpServers": {
"kernava": {
"url": "http://localhost:8080/mcp"
}
}
}
```
### Zed
```
{
"context_servers": {
"kernava": {
"url": "http://localhost:8080/mcp",
"headers": {}
}
}
}
```
### 通用 MCP 客户端
端点:`http://localhost:8080/mcp`(可流式传输的 HTTP,POST)。
## 工作区布局
```
crates/
kernava-server/ MCP server (rmcp + axum, 16 tools)
kernava-indexer/ tree-sitter parsing, symbol/call extraction, import resolution
kernava-graph/ In-RAM call graph (DashMap), Louvain communities, BFS traversal
kernava-store/ SQLite-WAL persistence, FTS5 search
```
## 调用解析
索引时的六级联策略:
1. **ImportMap** — 将被调用者与导入的名称进行匹配 → 限定目标
2. **SameFile** — 被调用者匹配在同一文件中定义的符号
3. **GlobalUnique** — 被调用者在整个代码库中全局唯一
4. **CrossFile** — 被调用者匹配位于 import 路径上的文件中的符号
5. **Default** — 被调用者未解析,边以 `target_id = NULL` 存储
6. **Builtins** — 常见的标准库调用(部分 v1)
## 许可证
采用 MIT 或 Apache-2.0 双重许可。
标签:可视化界面, 通知系统