代码搜索-mcp
密码搜索人工智能特工 遍及你拥有的所有仓库.
code-search-mcp 是一个用于索引许多
即时寄存器并给出任何 MCP 客户端( Claude Code, Claude Desktop,
咒语,或者你自己的经纪人) 三件事 grep 和纯向量搜索
无法:
- 找到正确代码的混合搜索. 它处理精确的识别器, 在一个查询路径中部分名称、错误字符串和纯英语问题.
- 密码图. 特工可以看见呼叫者 被呼叫者 呼叫链 死亡密码, 和爆炸半径 diff.
- 一个系统图横跨仓库. 它连接到HTTP路线, gRPC 服务、Kafka专题、数据库表格、环境 vars 和共享类型 连接您的服务, 因此“ 谁消费这个话题 ” 有一个答案 .
它运行在笔记本电脑在stdio, 或者作为一个共享的HTTP服务器为整个团队. 它被测试在超过100万个索引代码块.
npm install -g @esankhan3/code-search-mcp
ollama pull bge-m3 # or use an OpenAI / Voyage / Mistral key
claude mcp add code-search -- code-search-mcp --local ~/code
就是这样。 你的探员现在知道你的密码了 这个 分步向导 覆盖一切方法运行它.
目录
你的经纪人可以问什么
| 问题 | 代理工具 |
|---|---|
| "我们在哪里核实JWTs?" | search_code:语义+关键词+符号搜索,已连接 |
"寻找 CompanySearchResponse/"任何名称 *SearchResponse? 吗 | search_exact: 精确和部分标识匹配,不需要嵌入器 |
"谁打电话 createInvoice,从哪一个收回?" | find_callers |
如果我改变 billing/tax.ts,什么中断?" | impact_analysis (跟随受抚养人交叉重置) |
| "这是什么diff触摸?" | detect_changes: diff hunks – 更改实体 – 其受抚养人 |
"请求如何从 checkout 改为 ledgerWrite? 吗 | trace_path: 最短的呼叫链 |
哪个部门读取 orders.created 话题?" | get_cross_repo_edges |
| "这雷波做什么 如何铺设?" | get_repo_profile 编号 : get_architecture |
快开始
1. 安装. 需要20个节点或更新 git。 。 。 .
npm install -g @esankhan3/code-search-mcp
此安装三个命令: code-search (CLI), (中文(简体) ), code-search-mcp
(MCP服务器)和 code-search-daemon (表-再指数).
2. 选个嵌入器. 默认( E)auto)使用它发现的第一个:
| 你有过 | 用这个 |
|---|---|
CODE_SEARCH_EMBEDDING_BASE_URL 设定 | 任何与 OpenAI 兼容的终点 |
| Ollama 本地运行 | 奥拉玛,模型 bge-m3 (完全下线) |
MISTRAL_API_KEY | 编码嵌入 |
OPENAI_API_KEY | 开放AI |
VOYAGE_API_KEY | 阴道 |
GEMINI_API_KEY 编号 : GOOGLE_API_KEY 或登入双子座CLI | 双子座 |
3. 终点站的索引和查询.
code-search index ~/code --project acme # one repo, or a folder full of repos
code-search query --project acme "where do we retry failed webhooks"
code-search query --project acme "WebhookRetryPolicy" --mode bm25
4. 连接您的MCP客户端.
# Claude Code
claude mcp add code-search -- code-search-mcp --local ~/code --project acme
// Claude Desktop (claude_desktop_config.json) or Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"code-search": {
"command": "code-search-mcp",
"args": ["--local", "/Users/me/code", "--project", "acme"]
}
}
}
该指南涵盖团队服务器、Docker、GitHub orgs、对象存储和 排除出问题 : 运行中。 。 。 .
工具
十七种工具分四组. 每个工具都验证其反对的论据
其策略和返回 isError: true 当他们错了,有原因.
搜索
| 工具 | 它会做什么 |
|---|---|
search_code | 混合搜索:矢量+关键字+符号+短语分级,被熔接后再通过代码图扩展并可选地重新排序 |
search_semantic | 唯向量:解释和意图 |
search_exact | 以精确和部分符号名和精确口号为首的文字搜索;没有嵌入器的作品 |
get_code_snippet | 一个实体的名称来源比阅读整个文件便宜 |
图
| 工具 | 它会做什么 |
|---|---|
find_callers 编号 : find_dependencies | 谁叫符号,什么叫符号. calls 默认边缘; relations 增加进口、使用、类型参考和继承 |
trace_path | 两个符号之间最短的呼叫链,或者从一个符号可以到达的一切 |
impact_analysis | 文件或实体的依赖者,最多5跳,横跨仓库 |
detect_changes | 向行已更改的实体及其依附者映射 git diff |
search_graph | 结构查询:按名称(regex),类型,文件或repo排列的节点,按连接排序 |
find_dead_code | 无参考文献( 高度) |
get_repo_graph | 一个仓库的实体和边缘 |
get_cross_repo_edges | 存放处之间的联系,每个存放处都与产生它的证据相联系 |
get_architecture | 项目概览:存储器的作用、关键流量、连接 |
符号有确切名称或全称匹配 repo::file::entity 编号.
fuzzy: true 匹配对大小写不敏感的子字符串。 多跳转弯
绑定( 50k 节点, 1 s), 因此大圆形的中枢符号得到部分
回答是这么说的 永远不要挂断.
简介和索引
| 工具 | 它会做什么 |
|---|---|
list_repos 编号 : get_repo_profile | 每个存储器的技术堆栈、结构和入口 |
index_status | 每次重播、嵌入器、上次索引时间、矢量指数健康 |
加上MCP资源: code-search://repos, (中文(简体) ), code-search://system-graph, (中文(简体) ),
code-search://repo/{name}/profile, (中文(简体) ), code-search://repo/{name}/graph。 。 。 .
如何运作
flowchart LR
subgraph Index["Indexing (incremental)"]
direction TB
A[Discover repos] --> B[Change check per repo<br/>git SHA + working-tree snapshot]
B --> C[AST chunking<br/>tree-sitter, 8 languages]
C --> D[Per-repo code graph<br/>calls, imports, types, inheritance]
C --> E[Cross-repo signals<br/>routes, topics, tables, env vars, ...]
E --> F[Hash-join correlation<br/>14 strategies]
D & F --> G[(System graph<br/>SQLite)]
C --> H[Embed only changed chunks<br/>reuse vectors by content hash]
H --> I[(LanceDB<br/>vectors + full-text + trigram indexes)]
end
subgraph Query["Query"]
direction TB
Q[Query] --> K[Classify:<br/>identifier, path, error, natural language]
K --> V[Vector] & BM[Keyword BM25<br/>tokens + identifier parts] & S[Symbol names<br/>exact + trigram substring] & P[Exact phrase]
V & BM & S & P --> R[Weighted rank fusion<br/>+ exact-symbol pin + dedupe]
R --> X[Graph expansion<br/>callers, callees, type refs]
X --> RR[Optional cross-encoder rerank]
end
I --> V & BM & S & P
G --> X
春克跟随代码的结构. 文件在定义边界中分割 (功能,类,方法,顶级常数),不是每个N行. 每个 块带上下文前缀( 文件路径、 模块和导入) 嵌入着它.
四个检索级平行运行. 矢量搜索捕获意图.
BM25在原始标志和复合识别器上运行 所以
"预期的积压数"发现 verifyExpectedBacklogCount符号级
通过三克索引将实体名称精确匹配为子字符串, 所以
SearchResponse 发现 CompanySearchResponse选项
字符串单词。 查询分类器对每个查询的分级权重 :
标识符依靠关键字,问题依靠向量.
图表比绘图要多. 它提供检索(种子点击拉入) 直接回答结构性问题. 交叉储存地边缘来自14个探测器:npm和工作空间 依赖性,共享类型,env vars, Kafka等主题, HTTP 路由 (包括模板-语言客户端URL),gRPC服务,数据库计划, Redis 密钥、 S3 桶、 OpenAPI 合同、 插头编组和 Kubernetes 服务参考和共享常数.
指数保持不变.
- 每个周期只触及变化:
- 同时检查仓库;
- 只重装已更改的文件;
- 只有文本被重新嵌入的块;
- 系统图已更新.
- 向量指数随着体积的增大而回转.
- 每个查询所探测的IVF分区数是自动校正以击中 0.95 准确扫描时召回.
- 嵌入器按指数被固定: 使用不同的模型查询或 维度大小是一个错误,从不沉默错误的结果.
规模业绩
用一台12分多分的手提电脑测量,360块超过115万块 ,包含600个混合查询(精确识别码、部分名称、, 自然语言和短语). 这本书是复制真实的 存储器。 使用一个嵌入器,所以时间排除了 嵌入式提供方延迟.
search_code 延迟(p50, 1名客户) | 36分钟 |
search_exact 延迟(p50, 1名客户) | 17分钟 |
| 吞吐量,8个同时客户 | 26个q/s (单位:千美元)search_code, (中文(简体) ), 39个q/s (单位:千美元)search_exact(中文(简体) ) |
| 矢量召回@ 10 vs 精确扫描( 自动校正) | 0.977 (英语) |
| 重新指数,没什么变化 | ~15 s (韩语) |
| 在一个文件编辑后重新索引( 重排、 图表、 嵌入) | ~30–70 s (英语) |
| 系统图中的交叉存储边 | 454克级 |
在同一查询中,预期文件以100%的比例排在前十
两个搜索工具中的精确识别查询。 自然语言
91%的问题 search_code 和80% search_exact。 。 。 .
如何运行它
| 模式 | 命令 | 用它来 |
|---|---|---|
| 当地、 stdio | code-search-mcp --local ~/code | 一个开发者; 索引存在于您的机器上 |
| GitHub 键 | code-search-mcp --local "github:my-org/api-*" | 克隆或刷新匹配的重置器,然后为它们服务 |
| 团队服务器 | code-search-mcp --serve ~/code --auth api-key | 每个人一个索引,超流式HTTP at /mcp |
| 远程代理 | code-search-mcp --remote https://search.internal | 连接团队服务器的细长本地 stdio 桥; 无任何本地索引 |
| 守护进程 | code-search-daemon --workspace ~/code | 查看文件和关于更改的再索引; CLI 通过本地套接字查询 |
| 夹克 | docker build -f Dockerfile.all-in-one … | Ollama的一幅图像 嵌入器和重排器模型 |
团队服务器在首个索引运行前绑定它的端口,所以健康
探测器立即回答(/ready 是503,直到指数可以服务为止.
它服务于每一个 /mcp 以无国籍方式请求,这就使得重新开始是免费的,而且
让它横跨核心 CODE_SEARCH_WORKERS=N在模式一中
初级是所有写作和N工人服务.
对于无国籍的吊舱,矢量可以活在S3或MinIO(s3:// LanceDB URIs)和 互联网档案馆的存檔,存档日期2013-12-02
蒙戈DB的索引文物. 见 运行. md § 对象存储。 。 。 .
配置
五层,最低至最高优先级:
- 内置默认值
~/.code-search/config.yaml(每个用户)<workspace>/.code-search.yaml(每个工作区)CODE_SEARCH_*环境变量- CLI 旗: 任何设置为
--<dotted.path> <value>,比如说.--retrieval.max-chunks 12
code-search --print-config 用秘密打印解析结果
已编辑 。 一个身份不明的旗下出口有2级,而不是被忽略.
# .code-search.yaml
embedding:
provider: openai # auto | ollama | openai | voyage | codestral | openai-compatible | gemini-oauth | custom
model: text-embedding-3-small
dimensions: 1536
reranker:
provider: none # ollama (default, qwen2.5-coder:7b) | cohere | voyage | openai-compatible | none
retrieval:
max_chunks: 12
indexing:
reindex_interval_ms: 1800000 # team server: re-index every 30 min
变量( E)CODE_SEARCH_…(中文(简体) ) | 目的 |
|---|---|
EMBEDDING_PROVIDER 编号 : _MODEL 编号 : _DIMENSIONS 编号 : _API_KEY 编号 : _BASE_URL | 嵌入器 |
RERANKER_PROVIDER 编号 : _MODEL 编号 : _API_KEY 编号 : _BASE_URL | 重排( R)none 要禁用) |
DATA_DIR | 指数所在( 默认) ~/.anvil/knowledge-base(中文(简体) ) |
PORT 编号 : HOST | HTTP 绑定( 默认) 127.0.0.1:3100(中文(简体) ) |
AUTH_MODE 编号 : AUTH_API_KEYS 编号 : AUTH_JWT_SECRET | none 编号 : api-key 编号 : jwt |
REINDEX_INTERVAL | 30m, (中文(简体) ), 1h, (中文(简体) ), 6h 或者说 0 |
WORKERS | HTTP工人流程(2-16) |
SERVER 编号 : API_KEY | 远程代用目标及其关键 |
VECTOR_NPROBES | 在每个查询中修补IVF探测器( 覆盖自动校正; 下行 = 速度快, 回回转更慢) |
STORAGE_VECTOR_URI, (中文(简体) ), STORAGE_BLOB_BACKEND, (中文(简体) ), STORAGE_MONGO_*, (中文(简体) ), STORAGE_S3_* | 物体储存部署 |
完整名单在 运行. md § 配置引用。 。 。 .
安保和行动
- 奥特.
none: 绑定127.0.0.1只有这个.api-key数字 :Authorization: Bearer …,以恒定时间比较.jwt: HS256; 签字、发行人和所需exp验证,加nbf此时此刻 服务器拒绝在没有秘密的情况下启动 .- 一个没有认证的公开绑定记录了警告.
- 限制. 每名身份滑入-窗口率限制(默认为100分/分).
每个项目的范围和查询配额来自
<dataDir>/projects/<name>/project.yaml。 。 。 . - 端点.
GET /health, (中文(简体) ),/ready, (中文(简体) ),/version, (中文(简体) ),/status。 。 。 .GET /metrics: 查询计数的Prometheus度量衡,纬度直方图,出错,索引年龄,每回波块和矢量-索引健康.GET /admin/api/status。 。 。 .POST /index:按需重新索引.
- 记录和追踪.
CODE_SEARCH_STRUCTURED_LOGS=1发出JSON日志. 查询文本不会留下痕迹,除非您选择加入CODE_SEARCH_TELEMETRY_RECORD_QUERIES=1。 。 。 .
支持的语言
| 支助 | 语文/文件 |
|---|---|
| AST 分块、 代码图、 交叉检索信号 | TypeScript, TSX, JavaScript, Python, Go, Java, Rust, PHP 软件 |
| 索引搜索 | 以上,加上外壳、YAML、Terraform/HCL、TOML、, Dockerfile, (中文(简体) ), Makefile, (中文(简体) ), Jenkinsfile |
.gitignore 受到尊重,以及 node_modules, (中文(简体) ), dist, (中文(简体) ), build, (中文(简体) ), vendor, (中文(简体) ),
target 和类似目录被跳过.
设计原则
- 多发相先. 有趣的问题交叉存储库 边框,所以索引,图表和工具都一样.
- 缩小范围. 每个指数周期的成本与 换了,不是换了尸体 每个查询层都是以索引为基础的. 每一图相通相入相入相入相.
- 永不默然错入. 嵌入器不匹配是一个硬错误. 截断 路人说他们被截断了 坏的工具参数返回原因 .
- 默认本地, 需要时共享 . 同样的二进制服务 笔记本电脑在Stdio或整个团队 在HTTP.
- 很少移动部分. 嵌入 LanceDB 和 SQLite, 没有数据库服务器可用 运行,一个手滚动的 HTTP 层和零依赖性度量.
发展
这个软件包住在一个单列波 与它的检索引擎,
@esankhan3/anvil-knowledge-core。 。 。 .
npm install # at the repo root
npm -w @esankhan3/anvil-knowledge-core run build
npm -w @esankhan3/code-search-mcp run build # esbuild bundle → dist/
npm -w @esankhan3/code-search-mcp test
npm -w @esankhan3/code-search-mcp run smoke # end-to-end, needs Ollama with bge-m3