mcpField
C
code-context

code-context

本地服务
github.com/infino-ai搜索与检索322 周前更新

关于 code-context

code-context 是面向编码 Agent 的 MCP 服务,可检索代码、日志及其他已索引文件。它结合精确关键词查找、语义搜索、SQL 和跨仓库问答,并采用本地与 Infino 云端处理。

主要功能

  1. 01精确查找并统计匹配文本
  2. 02关键词与语义混合搜索
  3. 03对索引内容执行只读 SQL
  4. 04提供带路径引用的仓库问答
  5. 05索引代码、日志及其他文件

适用场景

  1. 01代码审查时查找所有调用位置
  2. 02梳理大型代码库中的功能实现
  3. 03联合搜索代码、日志和测试输出
  4. 04跨多个仓库提问

MCP 相关

MCP 服务提供 `find`、`search`、`sql` 和 `ask` 四种工具。`find` 与普通 `sql` 在本地运行;语义搜索和 `ask` 使用 Infino 云端处理。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"infino-ai-code-context": {
"command": "npx",
"args": [
"-y",
"@infino-ai/code-context"
],
"env": {
"CX_ROOT": "<CX_ROOT>",
"CX_INDEX_DIR": "<CX_INDEX_DIR>",
"CX_AUTO_SYNC": "<CX_AUTO_SYNC>",
"CX_NO_EMBED": "<CX_NO_EMBED>",
"CX_NO_RECEIPT": "<CX_NO_RECEIPT>"
}
}
}
}
启动命令npx -y @infino-ai/code-context
需要配置的环境变量
CX_ROOTRepository root to serve. Optional - defaults to the working directory the server is launched in.
CX_INDEX_DIRWhere the index lives. Optional - defaults to .infino/ inside the repository root.
CX_AUTO_SYNCSet to 0 to disable the background staleness sync that runs as queries arrive.
CX_NO_EMBEDSet (1/true/yes) for keyword-only mode - skip the vector stage entirely.
CX_NO_RECEIPTSet (1/true/yes) to turn off local usage accounting: the per-call receipt on results and the cx usage ledger. Optional - on by default, computed locally, nothing leaves the machine.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@infino-ai/code-context0.5.1

工具

3

收录的工具列表 · 更新于 2 周前

参数类型必填说明
kinteger否最大命中数。
pathstring否要搜索的仓库根目录绝对路径。默认为服务器配置的根目录;当一个会话涉及多个仓库时,可将其设为目标仓库。
querystring是要查找的内容:术语、短语或描述。

详细介绍

CI npm License: Apache-2.0

SuperGrep

为 AI 编码 Agent 卸载检索与推理任务。 帮助 Agent 更快、更低成本地找到答案,同时保持相同的答案质量。对于更经济的模型尤其有用。

立即在 infino.ai/supergrep 体验 ——向真实代码库提问,并并排观察同一个模型在使用和不使用 SuperGrep 时如何回答,以及各自的费用。Supergrep 使用 Infino 进行检索。Infino 将小型语言模型与索引紧密集成,可在对象存储上实现可扩展的 Agent 检索。

SuperGrep:在本机执行 find 和普通 sql,在 Infino 云端执行 search、语义 sql 和 ask,两处共用一个索引

SuperGrep 为 Agent 提供四种工具,使用存放在两个位置的 Infino 索引。find 和普通 sql 在你的机器上基于关键词索引运行。相反,任何涉及语义的操作——search、包含排序搜索的 sql 语句,以及 ask——都在 Infino 云端运行,因此繁重的计算和嵌入操作不会占用你的笔记本电脑资源。Infino 还在其服务中嵌入推理模型,让多个小型模型同时处理索引,并将找到的行交给你的 Agent。你的 Agent 负责推理、撰写答案,并决定何时使用 SuperGrep。无需配置。

四种工具,各用一句话介绍——写给正在阅读本文的 Agent
工具功能
find查找包含精确字符串的每一行,类似 grep -n:结果完整、不排序,并提供整个代码库的总数和每个文件的计数。通过索引检索只需几十毫秒。
search一次排序检索,将精确关键词匹配与语义相似度融合,因此无论你是否知道具体用词,都能找到结果。命中结果包含代码和引用的 path:line。
sql对索引执行只读 SQL。排序搜索以表值函数的形式提供,因此“哪些文件包含最多与 X 相关的代码”可以通过一个查询完成排序和统计。
ask提出一个涉及整个代码库的问题,并交给 Infino 服务上的小型模型。它们会基于索引调查并返回找到的行及引用的 path:line,而不是散文式回答。多个 ask 可同时运行。

搜索函数可直接在 SQL 中使用,因此一条语句就能询问一个完整的问题

使用场景

  • 代码审查。 审查者会问:“还有哪些地方调用了它?如果它发生变化,哪些内容会受到影响?”find 一次调用即可返回每个调用方及其计数,ask 则会读取相关路径,因此审查的重点是变更本身,而不是寻找变更。
  • 大规模探索。 “X 从头到尾是如何工作的?”这样的问题会触发五十次查找。使用 SuperGrep 时,这些查找会作为五十个 ask 并行针对索引运行,而不是让五十个子 Agent 读取代码树并增加你的费用。
  • 同时处理多个代码库。 每个本地工具都接受一个仓库路径,因此一个会话可以遍历所涉及的所有仓库——服务端、客户端、共享库——无需针对每个问题单独检出代码。
  • 同时处理代码、日志和问题。 将日志、测试输出和问题导出文件与源代码一起编入索引后,“为什么这个集成测试开始失败了?”就能通过一个问题对所有内容进行检索。

Agent 会主动选择它

同时提供两者时,模型会选择 SuperGrep

模型自身的文件工具始终可用。SuperGrep 提供的是服务端的说明,其中指出哪种问题适合使用哪种工具;每次调用时由模型自行选择。非 SuperGrep 的调用大多是 Read:模型在索引告诉它要查看哪个文件后才打开文件,而不是用它来代替提问。这正是你想要的方式——索引负责查找,模型仍会打开需要引用的内容。

不止于代码——为整台笔记本电脑或任意语料建立索引

SuperGrep 会搜索问题所需的所有文件,而不只是源代码。日志、测试输出、堆栈跟踪、CI 输出、配置和文档都可以与代码一起纳入索引—— .log、.out、.err、.jsonl 和 .ndjson 会按记录边界分块,因此堆栈跟踪会与解释它的消息保存在一起—— 同样的四种工具可以处理所有这些内容:用 find 查找确切的堆栈帧,用 search 搜索只能通过描述来定位的故障,用 sql 统计并排序一次运行中的内容,用 ask 提出一个同时涉及多个文件的问题。

这在前沿模型最薄弱的场景中尤为重要。日志是最不适合放入上下文窗口的情况——体积大、重复多、大部分内容无关,而且只要它留在对话记录中,每轮都要再次付费处理。索引会先将内容缩减为相关片段,再交给模型查看。在一项公开的 CI 故障诊断基准测试中,按该基准自身的评判标准评分,SuperGrep 的得分排名第二,而每 1k 个上下文 token 的得分则遥遥领先:

LogDx-CI:按方法列出的诊断得分、交给模型的上下文,以及每 1k 个 token 的得分

对于无法放入笔记本电脑的文件——将它们写入对象存储中的 Parquet 文件,然后让 SuperGrep 直接读取,无需将文件加载到笔记本电脑上(方法)。你可以使用相同的工具,将它们与代码或笔记本电脑中的文件一起搜索。

节省了什么

使用和不使用 SuperGrep,同一个模型针对一个包含 256,000 行代码的代码库回答相同的 36 个问题。每个答案都经过代码核查。完全正确表示每项陈述都成立,并且完整回答了问题。费用是你需要支付的全部费用:模型、它的子 Agent,以及 SuperGrep。

运行设置方式

通过 Claude Agent SDK 运行真实 Agent,每种方案使用相同的最简提示词,测试对象为 infino 引擎仓库,测量日期为 2026-09-24。共 36 个问题,分为五类:聚合(10)、理解(6)、按含义查找(6)、精确定位(8)、已知文件(6)。文件工具方案使用原版 Claude Code:Glob、Grep、Read、LS、Bash,以及带内置 Explore 子 Agent 的 Agent 工具。SuperGrep 方案则在此基础上增加上述四种工具。评判模型为 Opus 5.5。

四种 Claude 模型分别使用文件工具和 SuperGrep 时的对比:费用、完全正确的答案数、耗时

实际效果会因模型而异。

  • 每种模型都更省钱。 Haiku 总费用降低 41%,Sonnet 降低 58%,Opus 降低 26%,Fable 降低 14%。
  • 较便宜的模型质量有所提升。 使用 SuperGrep 后,Haiku 的完全正确答案多了 8 个。Sonnet、Opus 和 Fable 的答案水平相当:评判者本身也是模型,同一批答案进行了四次评分,分别有 19、20、17 和 23 项陈述无法核实。因此,在 36 个答案中,差异低于约 6 个都属于噪声,这三种模型的差异都在这个范围内。
  • 费用不会意外飙升。 在约三分之一的问题中,使用文件工具的 Sonnet 会派出一个子 Agent 通读仓库。这样一道题的费用会变成原来的 4 到 5 倍,耗时也会变成 4 倍。使用 SuperGrep 时,它会改为查询索引。36 个问题总计,费用为 $3.66,对比 $8.73;耗时为 20 分钟,对比 41 分钟;完全正确的答案为 20 个,对比 18 个。
  • 在你自己的代码上,差距会更大。 这些运行针对的是公开的开源仓库,因为任何人都可以重复这项测试;而且大模型在训练时见过这个仓库,因此读取文件时占了先机。对于模型从未见过的私有代码库,索引能承担更多工作,SuperGrep 的效果也会更显著。
优势所在,以及不占优势的地方

四种模型在各类问题上的完全正确答案数

对于涉及整个代码库的问题,它表现出色:计数、排名、查找所有出现位置。Grep 只会给出前 40 个匹配结果,而索引会给出总数。对于使用大模型查找某个具名对象,它表现较差,因为大模型很擅长通读整个文件。

使用 SuperGrep 的最便宜模型,对比不使用 SuperGrep 的最贵模型

使用 SuperGrep 的 Haiku 与使用文件工具的 Opus 和 Fable 对比:费用、完全正确的答案数、耗时

正确答案为 23 个,对比它们的 25 个;费用为 $1.09,而不是 Opus 的 $6.32 或 Fable 的 $19.36。

安装

每台机器只需运行两条命令。你需要在 macOS 或 Linux 上安装 Claude Code 和 node 22 或更高版本。

claude plugin marketplace add infino-ai/supergrep
claude plugin install supergrep@infino-ai

(这个插件之前名为 code-context;如果之前安装过,可运行 claude plugin uninstall code-context@infino-ai,再运行上面的两条命令来替换。内部的 MCP 服务名称保持不变,因此 Agent 已学会的内容不会改变。)

配置就这样完成了。在任意目录中打开 Claude Code——可以是代码仓库、日志文件夹、笔记目录或任何其他目录——然后提问。第一个问题会为该目录建立索引,此后 find、sql 和 read 都会基于索引回答。无需为每个目录单独配置,目前也没有账号,任何内容都不会离开你的机器。

search 和 ask 是云端功能——嵌入和检索循环在 Infino 平台上运行,使用保存在平台上的索引副本——因此需要账号。首次提问需要用到它们时,Claude 会告诉你唯一需要运行的命令,但不会替你运行,因为这需要由你决定。在终端中运行一次:

npx -y @infino-ai/code-context login --platform https://api.supergrep.infino.ai

免费账号,无需信用卡。 无需填写表单、提供邮箱、设置密码或提供银行卡;未经你的同意,不会创建任何内容:该命令会告知你,使用 search 和 ask 的目录内容将上传到 Infino,并征求你的同意;只有在你同意后,才会创建账号,并将密钥存储在 ~/.infino/key 中,权限模式为 600,仅你本人可读取。配置文件中绝不会保存密钥或密钥路径。Infino 已通过 SOC 2 Type 2 认证。

请妥善保管密钥。 免费账号无需邮箱或银行卡,因此密钥是唯一能识别你身份的凭据:你只能凭它重新登录,没有其他方式。请将它备份到安全的地方。在 Infino 控制台中添加个人信息后,同一账号即可通过登录使用,也可以在那里管理密钥。

重新启动会话后,你打开的每个目录都会提供全部四种工具。你的账号中会为每个目录创建独立数据库,以目录名称命名,并在你首次于该目录中使用 search 或 ask 时加载——如果某个目录只用过 find,其内容就绝不会上传。一个服务会响应会话涉及的所有目录:这些工具都接受 path 参数,因此会话涉及多个项目时,需要指定目标目录。免费额度用完后,ask 会告知你,并说明如何为同一账号添加账单信息和银行卡;find 和普通 sql 则始终可以继续使用。

如果你已有 Infino 账号

改为每台机器登录一次。密钥通过文件或标准输入提供,绝不会作为参数传入——因为机器上的每个进程都能读取 argv。--yes 表示同意注册时要求的同一条款,因为通过管道传入密钥时,没有终端可供询问:

npx -y @infino-ai/code-context login --db https://api.supergrep.infino.ai --yes < keyfile
其他 MCP 客户端,以及每个代码仓库的单独配置项

Cursor、Codex CLI、Gemini CLI、Windsurf 和 Cline 都通过 stdio 使用同一个服务。在代码仓库中运行 cx install,会将配置项写入该目录下的 .mcp.json(如需写入其他客户端的配置文件,可使用 --config);如果已保存账号信息,该配置项只会指向该代码仓库的数据库,不包含其他内容;--local-only 会写入仅包含关键词的配置项;在没有账号的机器上,运行 install --platform https://api.supergrep.infino.ai 即可同时注册账号并添加配置项。参考文档列出了所有标志,CONTRIBUTING介绍了如何从源代码构建。

自行建立索引

首次提问时会为目录建立索引,MCP 服务会让索引保持最新,因此大多数时候你不必手动运行索引。需要时——比如要对超大的目录树进行首次扫描、添加 CI 步骤,或处理非 git 仓库中的语料——可使用 index 命令。(下文的 cx 指 npx -y @infino-ai/code-context,或在运行 npm install -g @infino-ai/code-context 后直接使用 cx。)

cx index                      # bring the index up to date; incremental, full on first run
cx index ~/notes              # index some other directory
cx index --full               # force a full rebuild
cx index --watch              # keep watching the tree and sync on every change
cx index --no-embed           # keyword index only, skip the vector stage
cx index --max-files 1000000  # raise the cap past the 500,000 default; over it, the index is
                              # partial and says so, with the value to pass to get all of it

索引是你所建立索引的目录下 .infino/ 中的普通文件。首次运行 cx index 后几秒内即可进行关键词搜索;语义搜索和混合搜索则会在向量完成后台回填后启用。cx status 会显示索引包含的内容及其新鲜度。

登录后,cx index 会在同一轮处理中加载平台副本——即你账户中该目录自己的数据库,因此 ask 看到的内容与 find 相同。要加载指定的数据库:

cx index --db https://api.supergrep.infino.ai/<database>

--embed-provider platform(默认值)会让平台在服务端使用自己的模型为该表填充向量;local 则会在此机器上生成向量并将其上传。

通过相同的工具访问你的数据

同一个插件可以访问你 Infino 账户中的所有表,而不只是它为之建立索引的目录。登录后,Agent 会获得另外三个工具,并且原有的四个工具也会多一个 database 参数:

工具功能
tables查看账户中的内容:所有数据库及其表;表的列、哪些列已为搜索建立索引以及哪些列由平台嵌入、用于标识行的列,以及表的概览卡——其中包含统计信息、示例行和各列的含义。
hydrate从任意来源将数据集加载到账户的数据库中:平台可自行读取的存储桶前缀、笔记本电脑上的文件、通过 ssh 访问的机器上的文件,或数据库存储中已有的前缀。支持 Parquet、CSV、NDJSON、Iceberg 和已解析的文档。如果数据库尚不存在,就会创建它;加载过程在平台上运行,并可通过 hydrate_status 跟踪。
hydrate_status、hydrate_cancel查看加载进度;停止加载。

sql、search、find 和 ask 都接受 database(和 table),可针对账户中的表而非代码仓库运行——包括语句、排序后的搜索结果、精确匹配和检索循环,以及平台对语句返回行的判定和用于联接的键,方式与处理代码完全相同。因此,一个会话既能针对代码检出目录询问“哪些文件调用了这个”,也能针对数据询问“上个季度哪些账户转移的资金最多”,这一切都通过同一个 MCP 完成,问题也可以同时涵盖两者。

无需针对每个表或数据库单独配置。让 Agent 访问一个包含 CSV 的文件夹、Parquet 导出文件、存储桶或开发机器上的目录,并让它加载数据;然后就可以提问。笔记本电脑或远程机器上的文件会通过平台的上传会话直接进入数据库的存储中(ssh 由你提供:插件会通过它对每个文件运行一次 find 和一次 cat,且不会在远程机器上安装任何内容);存储桶则会原地读取,不会复制任何数据。

通过登录作为连接器使用

同一个服务也支持 Streamable HTTP,可通过一个 URL 连接,让 claude.ai、Claude Desktop、Claude Code 和任何其他 MCP 客户端将其添加为远程连接器:

cx mcp --http 9121 --db https://<platform> --sign-in https://<host>/.well-known/oauth-protected-resource/mcp

使用 --sign-in 时,每次调用都会携带 Infino 账户的密钥;如果调用没有密钥,就会告知登录方式(该 URL 上的 OAuth 资源元数据),Claude 会据此引导用户登录。之后,每次调用都会使用该账户自己的数据库运行。不使用此选项时,每个会话都会使用启动进程时所用的账户(若要共享无需登录的 URL,可添加 --read-only)。

从对象存储建立索引

如果语料大到笔记本电脑放不下——多年的日志、文档转储,或任何你已存放在存储桶中的 Parquet 或 JSON 数据——就让它留在那里,将平台指向该存储桶,平台便会直接从中建立索引。数据不会被复制或下载到你的设备,也不会有任何行经过你的笔记本电脑或 API。上面的 hydrate 工具可在会话中完成此操作;它调用的 API 如下。

1. 授予存储桶的读取权限,将 Infino 的服务账号(我们会提供其地址)添加到你想要建立索引的前缀:GCS 使用 roles/storage.objectViewer,S3 使用 s3:GetObject + s3:ListBucket。只有读取权限:平台不会向其中写入任何内容。

2. 提交任务。 发送一个 POST,指定存储桶和前缀,接口会立即返回——构建任务在平台上运行,而不是在请求中运行:

curl -sS -X POST https://api.supergrep.infino.ai/v1/hydrate/<database> \
  -H "authorization: Bearer $(cat ~/.infino/key)" \
  -H 'content-type: application/json' \
  -d '{
        "table": "logs",
        "source": { "kind": "bucket", "bucket": "<your-bucket>", "prefix": "exports/logs/" },
        "fts":    [ { "column": "message" } ],
        "embed":  { "column": "embedding", "source": ["message"] }
      }'

(存储在你自己的存储桶中的数据库,也可以读取暂存于其自身 _source/ 前缀下的分片:"source": { "kind": "prefix", "prefix": "_source/logs/" }。)

{ "job": "hydrate/<customer>/<database>/logs", "state": "pending" }

省略 fts 和 embed,任务就会读取样本并自行确定各列的用途。columns 用于限定要保留的源列;no_embed: true 则完全不建立向量列。

3. 跟踪任务。 响应会包含任务状态、进度、确定的架构,以及目前产生的费用:

curl -sS "https://api.supergrep.infino.ai/v1/hydrate/<database>?table=logs" \
  -H "authorization: Bearer $(cat ~/.infino/key)"

状态包括 pending、running、cancelling、stopped、succeeded 和 failed。已停止的任务——无论是被取消,还是因中断时间超出预算而停止——都会从自身的检查点恢复,而不是从头开始:

# resume where it left off
curl -sS -X POST https://api.supergrep.infino.ai/v1/hydrate/<database> -H "authorization: Bearer $(cat ~/.infino/key)" \
  -H 'content-type: application/json' \
  -d '{"table":"logs","source":{"kind":"bucket","bucket":"<your-bucket>","prefix":"exports/logs/"},"resume":true}'

# stop a running job at its next commit boundary
curl -sS -X DELETE "https://api.supergrep.infino.ai/v1/hydrate/<database>?table=logs" \
  -H "authorization: Bearer $(cat ~/.infino/key)"

默认情况下,彻底失败的任务会删除其构建了一半的表,因此不会提供不完整的表;"on_failure": "keep" 则会保留已提交的内容。

随后,你就可以像搜索其他表一样搜索该表。ask 可对其进行查询,一次提问也可以同时查询该表和你的代码。

注意:Hydrate API 需要按账号启用。请联系 [email protected] 进行启用。

了解更多

许可证

Apache-2.0

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。