chadbohannan/py-mcp-code-rag

GitHub: chadbohannan/py-mcp-code-rag

一个基于语义代理索引的代码检索系统,通过AI摘要实现意图级搜索,解决大型代码库的导航难题。

Stars: 0 | Forks: 0

# 代码检索 针对本地代码库的语义代码搜索,提供 REST API 和 [模型上下文协议](https://modelcontextprotocol.io/) 服务器。专为导航复杂、庞大的代码库而设计——挖掘架构意图而非匹配表面文本。 ## 工作原理 原始源代码难以与自然语言查询形成良好嵌入。开发者询问"认证如何工作?"与实现认证的代码在嵌入空间中几乎没有重叠。 **代码检索**使用语义代理索引:文件被解析为具有语言感知的单元(函数、类、方法、SQL、Markdown章节),每个单元由 Claude 进行摘要,然后嵌入的是*摘要*而非原始源码。原始源码会随匹配结果一同存储并返回。 ``` source file → semantic parser → semantic units │ semantic summary (file path + unit type as context) │ fastembed → vector index raw source stored alongside, returned on match ``` 这意味着像"令牌过期如何工作?"这样的查询会匹配到一个摘要,例如*"验证 JWT 并根据可配置容差检查时钟偏移"*——这是原始源码嵌入无法做到的。 ## 环境要求 - Python >= 3.12 - [uv](https://github.com/astral-sh/uv) 包管理器 - 安装了 gemma4:e2b 的 [Ollama](https://ollama.com/) ## 快速开始 ``` # 安装 dependencies make install # 索引 codebase make index SRC=../my-project DB=./index.db # 启动 REST API + web UI(主要界面) make webui DB=./index.db # 在另一个终端中,启动 MCP server 并指向 web UI make mcp ``` ## 安装说明 ``` git clone cd py-mcp-code-rag make install ``` ## 使用说明 ### 命令行界面 ``` code-rag index [paths...] [options] Build or update the index code-rag webui [options] Start the REST API + web UI code-rag-cli.py SUBCOMMAND [args] Stdlib CLI client to a running web UI code-rag-mcp.py [options] MCP server proxying tools to the web UI ``` ### 索引 索引一个或多个目录。默认增量处理——仅重新处理已更改的文件。 ``` # 索引当前目录 code-rag index . # 将 specific directories 索引到单个 DB code-rag index /path/to/backend /path/to/frontend # 使用自定义 database path code-rag index --db myproject.db ../my-project # 更改 embed model 后重建 embeddings(保留 summaries) code-rag index --reindex . # 使用 Ollama 进行摘要,而不是 Anthropic API code-rag index --summarizer ollama --ollama-model gemma3 . ``` **索引选项:** | 标志 | 默认值 | 描述 | |---|---|---| | `--reindex` | 关闭 | 重建向量表;保留未更改单元的摘要 | | `--embed-model MODEL` | `nomic-ai/nomic-embed-text-v1.5-Q` | 嵌入模型 (fastembed) | | `--db PATH` | `./index.db` | 索引文件位置 | | `--summarizer {anthropic,ollama}` | `ollama` | 摘要后端 | | `--ollama-model MODEL` | — | Ollama 模型名称 | | `--ollama-host HOST` | — | Ollama API 主机 | ### Web 用户界面(REST API) 主要界面。提供 REST API(文档见 `SKILL.md`)和浏览器用户界面。 ``` code-rag webui --db index.db --port 8081 ``` **Web UI 选项:** | 标志 | 默认值 | 描述 | |---|---|---| | `--db PATH` | `./index.db` | 索引文件位置 | | `--host HOST` | `0.0.0.0` | 绑定地址 | | `--port N` | `8080` | 监听端口 | | `--embed-model MODEL` | (来自数据库) | 覆盖嵌入模型 | | `--summarizer {anthropic,ollama}` | `ollama` | 用于通过 Web UI 触发的重新索引作业的摘要后端 | ### MCP 服务器 一个独立脚本,通过 REST 将 MCP 工具调用代理到正在运行的 Web UI。默认使用标准输入/输出;传入 `--http` 以使用流式 HTTP 传输。 ``` # Stdio MCP server(默认 — 用于直接 agent stdin/stdout 集成) python code-rag-mcp.py --base-url http://localhost:8081 # 或通过 env var CODE_RAG_URL=http://localhost:8081 python code-rag-mcp.py ``` **MCP 服务器选项:** | 标志 | 默认值 | 描述 | |---|---|---| | `--base-url URL` | `http://localhost:8081` | 要通信的 Web UI(环境变量:`CODE_RAG_URL`) | | `--http` | 关闭 | 以流式 HTTP MCP 服务器模式在 `127.0.0.1` 上运行 | | `--port N` | `8000` | `--http` 模式的端口 | ### 独立命令行客户端 用于 shell 脚本和人工使用,`code-rag-cli.py` 将 REST API 封装为纯文本输出: ``` python code-rag-cli.py search "how does authentication work?" python code-rag-cli.py --json repos | jq '.[].name' python code-rag-cli.py index /path/to/repo --wait ``` 子命令:`search`、`unit`、`fetch`、`units`、`files`、`repos`、`status`、`browse`、`index`、`index-status`、`index-cancel`、`clear-repo`、`staleness`、`ls`。顶层的 `--json` 标志可输出任何子命令的原始 JSON。 ### 代理集成 将 `code-rag-mcp.py` 注册到你选择的代理。两个命令都接受 `BASE_URL=` 以指向非默认的 Web UI。 | 代理 | 注册 | 注销 | |---|---|---| | Claude Code | `make add-claude-mcp` | `make remove-claude-mcp` | | pi-agent | `make add-pi-mcp` | `make remove-pi-mcp` | Web UI 必须正在运行 MCP 服务器才能工作——先在拥有索引的主机上启动一次,然后将代理指向它。 #### 系统提示 为获得最佳效果,请在你代理的系统提示或人格配置中包含以下内容: ## Make 目标 所有操作源代码目录的目标都接受 `SRC=`(默认为 `.`)。使用索引数据库的目标接受 `DB=`(默认为 `index.db`)。 | 目标 | 描述 | 示例 | |---|---|---| | `install` | 安装所有依赖 | `make install` | | `index` | 索引目录(增量) | `make index SRC=../repo DB=my.db` | | `reindex` | 从头开始重建嵌入 | `make reindex SRC=../repo` | | `mcp` | 启动 MCP 服务器(标准输入/输出) | `make mcp BASE_URL=http://host:8081` | | `webui` | 启动 REST API + Web UI | `make webui DB=my.db PORT=8081` | | `test` | 运行完整测试套件 | `make test` | | `test-unit` | 仅运行单元测试 | `make test-unit` | | `test-integration` | 运行集成测试 | `make test-integration` | | `lint` | 检查代码风格 | `make lint` | | `format` | 自动格式化代码 | `make format` | | `add-claude-mcp` | 注册到 Claude Code | `make add-claude-mcp` | | `remove-claude-mcp` | 从 Claude Code 注销 | `make remove-claude-mcp` | | `add-pi-mcp` | 注册到 pi-agent | `make add-pi-mcp` | | `remove-pi-mcp` | 从 pi-agent 注销 | `make remove-pi-mcp` | | `clean` | 移除 index.db 和 WAL 文件 | `make clean` | ## 支持的文件类型 | 扩展名 | 解析器 | 单元边界 | |---|---|---| | `.py` | 标准库 `ast` | 模块级函数、类、方法 | | `.go` | tree-sitter (Go) | 函数、方法、结构体、接口 | | `.c`, `.h` | tree-sitter (C) | 函数、结构体、枚举 | | `.cc`, `.cpp`, `.cxx`, `.hh`, `.hpp`, `.hxx`, `.ino` | tree-sitter (C++) | 函数、方法、类、结构体、枚举 | | `.js`, `.jsx`, `.mjs`, `.cjs` | tree-sitter (JavaScript) | 函数、类、方法、箭头函数 | | `.ts`, `.tsx`, `.mts`, `.cts` | tree-sitter (TypeScript) | 函数、类、方法、接口、类型、枚举 | | `.java` | tree-sitter (Java) | 类、接口、枚举、方法、构造函数 | | `.tf` | HCL 块分割器 | resource、variable、output、module、data、locals、… | | `.tfvars` | 文档级 | 整个文件 | | `.md`, `.mdx` | 标题分割器 | 标题章节 | | `.sql` | 文档级 | 整个文件(若超过 4 KB 则跳过) | 会自动检测并跳过二进制文件。无法识别的扩展名会被静默跳过。 ## MCP 工具 `code-rag-mcp.py` 暴露 10 个工具,全部代理到 `SKILL.md` 中记录的 REST API: | 工具 | 用途 | |---|---| | `search` | 自然语言向量搜索;返回排名的单元摘要 | | `get_unit` | 获取一个或多个限定路径的完整源代码 | | `list_units` | 列出已索引的单元,可选 glob 过滤器 | | `list_files` | 列出已索引的文件,可选 glob 过滤器 | | `list_repos` | 列出已索引的代码仓库 | | `index_status` | 每个代码仓库的文件/单元计数和最后索引时间戳 | | `staleness` | 每个代码仓库的索引新鲜度对比其 git HEAD | | `index_start` | 将路径加入索引队列(立即返回) | | `index_job_status` | 轮询正在运行的索引作业 | | `index_cancel` | 发送信号取消正在运行的作业 | 完整的参数和响应 schema 见 `SKILL.md`(从实时 OpenAPI 规范生成)。 ## 架构 ## 许可证 详情参见[许可证](LICENSE)。
标签:AI风险缓解, API服务, Claude AI, gemma模型, LLM评估, MCP服务器, Ollama, Python, REST API, uv包管理器, 代码分析, 代码导航, 代码库管理, 代码搜索引擎, 代码检索, 代码解析, 凭证管理, 向量数据库, 向量索引, 威胁情报, 开发者工具, 开发辅助工具, 摘要生成, 无后门, 检索增强生成, 语义代理索引, 语义单元, 语义嵌入, 语义搜索, 逆向工具