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 双重许可。
标签:可视化界面, 通知系统