关于 codeloupe-mcp
codeloupe-mcp 是面向编码 Agent 的本地优先 MCP 服务,为大型代码库提供结构化访问。它结合持久化工作区索引、有限结果搜索、精准代码读取、目录比较和结构化文件编辑。
主要功能
- 01持久化仓库索引
- 02有界文本与正则搜索
- 03读取符号、片段和引用
- 04比较源代码目录
- 05结构化文件编辑与撤销
- 06本地 stdio 服务且不进行网络调用
适用场景
- 01在大型仓库中查找相关代码
- 02检查符号或指定行范围
- 03比较源代码目录的变更
- 04执行并撤销结构化文件编辑
MCP 相关
该服务通过本地 stdio 连接 MCP 客户端,并提供仓库探索、代码读取、目录比较和文件编辑工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
36收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 |
详细介绍
原文在翻译后有更新,译文可能不是最新。
codeloupe-mcp
一个模型上下文协议(MCP)服务,为编码 Agent 提供快速、本地优先的大型代码库访问能力。它使大模型能够检查文件、搜索文本、比较目录、读取符号,并通过有界工具响应应用结构化编辑,而不是将整个文件或仓库树倾倒到上下文中。
codeloupe-mcp 与 shell 工具的比较
此软件包提供用于探索仓库和编辑代码的 MCP 接口。
如果你使用的是编码 Agent,shell 命令仍然适用于简洁的构建/测试工作流。当模型需要在整个聊天会话中获取结构化、可重复且了解仓库情况的代码上下文时,codeloupe-mcp 最有用。
- Shell/CLI:最适用于确定性命令,例如
cargo test、npm run lint、项目脚本、一次性rg搜索,以及本身已经简洁的构建日志。 - MCP:最适用于能从工具架构、工作区感知的路径解析、有界输出、持久索引以及精准读取(例如符号主体、代码片段、浅层项目映射和目录差异)中受益的 Agent 循环。
当你希望 Agent 按需获取所需代码上下文时,请使用 codeloupe-mcp:例如某个行范围、符号主体、有界搜索结果、模糊文件匹配、工作区摘要或源目录比较。
主要功能
- 快速且轻量。通过
stdio运行的本地 Rust 服务;无需外部索引服务、网络调用或遥测。 - 适合大模型的输出。工具会返回有界的 JSON/Markdown,专为 Agent 的上下文窗口设计。
- 仓库感知索引。使用 LMDB 存储路径元数据,并可选择为每个工作区建立 Tantivy 内容索引。
- 精准读取代码。读取指定行范围、代码片段、符号主体、导入项、导出项、调用图、定义和引用。
- 范围限定的搜索。支持字面量和正则表达式搜索,可按路径限定范围、使用包含/排除 glob、提供回退诊断,并设置大型仓库保护措施。
- 目录比较。比较两个源目录,并生成新增/删除/修改/重命名摘要及有界差异。
- 结构化编辑。创建、编辑、转换、删除、批量编辑和撤销文件,并提供可预测的成功/错误元数据。
要求
- 支持本地
stdio服务的 MCP 客户端。 - 使用
npx时,需要 Node.js 18 或更高版本。 - 使用已发布的 npm 软件包或原生发行版二进制文件时,无需 Rust 工具链。
- 仅从源代码构建时需要 Rust 1.98.1;
rust-toolchain.toml会通过 rustup 安装指定版本的工具链。
入门
首先,使用客户端安装 codeloupe-mcp 服务。
标准配置适用于大多数 MCP 客户端:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
你也可以使用 GitHub Releases 页面上的原生二进制文件:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "/absolute/path/to/codeloupe-mcp",
"args": []
}
}
}
在 Windows 上原生安装时,将 command 指向 .exe 文件,例如 C:\path\to\codeloupe-mcp.exe。
Amp
通过 Amp VS Code 扩展的设置页面添加,或更新设置 JSON:
"amp.mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
Amp 命令行设置:
amp mcp add codeloupe-mcp -- npx -y @ndhkaeru/codeloupe-mcp@latest
Antigravity
通过 Antigravity 设置添加,或更新 MCP 配置文件:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
Claude Code
使用 Claude Code 命令行:
claude mcp add codeloupe-mcp -- npx -y @ndhkaeru/codeloupe-mcp@latest
原生二进制文件替代方案:
claude mcp add codeloupe-mcp -- /absolute/path/to/codeloupe-mcp
Claude Desktop
按照 MCP 安装指南操作,并使用标准配置:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
Windows 原生二进制文件替代方案:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "C:\\path\\to\\codeloupe-mcp.exe",
"args": []
}
}
}
Cline
按照 Cline 的 MCP 服务配置流程操作,并将以下内容添加到 cline_mcp_settings.json:
{
"mcpServers": {
"codeloupe-mcp": {
"type": "stdio",
"command": "npx",
"timeout": 60,
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"],
"disabled": false
}
}
}
Codex
使用 Codex 命令行:
codex mcp add codeloupe-mcp -- npx -y @ndhkaeru/codeloupe-mcp@latest
也可以创建或编辑 ~/.codex/config.toml:
[mcp_servers.codeloupe-mcp]
command = "npx"
args = ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
Copilot
使用 Copilot 的 MCP 添加流程,或将以下内容添加到 MCP 配置中:
{
"mcpServers": {
"codeloupe-mcp": {
"type": "local",
"command": "npx",
"tools": ["*"],
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
Cursor
前往 Cursor Settings -> MCP -> Add new MCP Server。
选择命令类型并使用:
npx -y @ndhkaeru/codeloupe-mcp@latest
或者粘贴标准配置:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
Factory
使用 Factory 命令行:
droid mcp add codeloupe-mcp "npx -y @ndhkaeru/codeloupe-mcp@latest"
也可以打开 Factory 的 MCP 界面并粘贴标准配置。
Gemini CLI
打开 Gemini CLI MCP 配置文件并添加:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
Goose
前往 Advanced settings -> Extensions -> Add custom extension。
选择类型 STDIO,并使用以下命令:
npx -y @ndhkaeru/codeloupe-mcp@latest
Junie
使用 Junie 的 MCP 流程,或将以下内容添加到 .junie/mcp/mcp.json:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
Kiro
按照 Kiro 的 MCP 服务文档操作并添加:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
LM Studio
前往右侧边栏中的 Program -> Install -> Edit mcp.json。
使用标准配置:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
opencode
添加到 ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"codeloupe-mcp": {
"type": "local",
"command": ["npx", "-y", "@ndhkaeru/codeloupe-mcp@latest"],
"enabled": true
}
}
}
Qodo Gen
在 VS Code 或 IntelliJ 中打开 Qodo Gen 聊天面板,选择 Connect more tools -> + Add new MCP,然后粘贴标准配置。
VS Code
使用 MCP 服务配置:
{
"servers": {
"codeloupe-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
也可以使用 VS Code 命令行安装:
code --add-mcp '{"name":"codeloupe-mcp","command":"npx","args":["-y","@ndhkaeru/codeloupe-mcp@latest"]}'
Warp
前往 Settings -> AI -> Manage MCP Servers -> + Add,或者使用 /add-mcp 斜杠命令并粘贴标准配置。
Windsurf
按照 Windsurf 的 MCP 文档操作,并使用标准配置:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"]
}
}
}
配置
codeloupe-mcp 接受可重复的 --workspace <path> / --workspace=<path> 参数,以及 MCP 服务进程中的环境变量。除非索引模式为 off,否则显式指定的命令行和环境变量工作区均获准进行索引。--help 和 --version 会立即输出结果,不会启动 stdio 服务;未知命令行选项会导致失败,而不会静默启动服务。
升级服务后,请重新连接或重启 MCP 客户端,使其获取当前的 tools/list 架构。Claude Code 等长时间运行的客户端可能会保留上一会话的工具参数,直到重新连接。
| 变量 | 描述 |
|---|---|
CODELOUPE_MCP_INDEX_DIR | 覆盖持久化索引缓存目录。 |
CODELOUPE_MCP_WORKSPACES | 显式指定的工作区根目录,以平台路径列表格式编码(Windows 使用 ;,Unix 使用 :)。 |
CODELOUPE_MCP_WORKSPACE | CODELOUPE_MCP_WORKSPACES 的兼容性单数形式;同样接受平台路径列表。 |
CODELOUPE_WORKSPACE | 显式工作区根目录的旧别名;与 CODELOUPE_MCP_* 形式不同的根目录会一并保留。 |
CODELOUPE_MCP_INDEX_MODE | 工作区索引策略:ask(默认)、auto 或 off。 |
CODELOUPE_MCP_INDEX_ADVICE | 设为 timeout_only 可隐藏成功调用时的建议,同时保留超时建议。默认会在所有符合条件的时机提供建议。 |
CODELOUPE_MCP_INDEX_ADVICE_MIN_FILES | 符合索引建议条件所需的最少已观察文件数。默认值为 20000。 |
CODELOUPE_MCP_INDEX_MAX_ENTRIES | 单次元数据扫描的最大条目数。默认值为 300000。 |
CODELOUPE_MCP_INDEX_MAX_SCAN_SECONDS | 单次元数据扫描的最长时长。默认值为 60。 |
CODELOUPE_MCP_INDEX_MAX_LOADED_WORKSPACES | 内存中保留的工作区索引运行时的最大数量。默认值为 16;最近最少使用且处于非活动状态的运行时会被逐出,但不会删除其磁盘索引。 |
CODELOUPE_MCP_INDEX_MAX_TOTAL_BYTES | 持久化索引存储的最大总容量。默认值为 2 GiB;写入前和垃圾回收期间都会执行此限制。 |
CODELOUPE_MCP_INDEX_MIN_FREE_BYTES | 索引所在卷保留的最小可用空间。默认值为 5 GiB;实际下限取此值与卷容量 10% 中的较大者。 |
CODELOUPE_MCP_TANTIVY_ENABLED | 启用/禁用 Tantivy 内容辅助索引。默认值为 true。 |
CODELOUPE_MCP_WALK_THREADS | 文件系统遍历的并行度。取值会限制在 1..=6。 |
CODELOUPE_MCP_WRITE_ROOTS | 写入工具可以修改的其他文件系统根目录,以平台路径列表格式编码(Windows 使用 ;,Unix 使用 :)。 |
CODELOUPE_MCP_BINARY | npm 包装器的覆盖设置,用于指定自定义本地二进制文件路径。 |
CODELOUPE_MCP_RUNTIME_COPY | 仅适用于 Windows npm 启动器。设为 0 可直接从 node_modules 运行原生二进制文件,而不使用带版本号的运行时副本。 |
CODELOUPE_MCP_RUNTIME_DIR | 仅适用于 Windows npm 启动器。原生二进制文件运行时副本的目录。默认值为 %LOCALAPPDATA%\codeloupe-mcp\runtime。 |
旧版 codeloupe_mcp_* 和 CODEBASE_MCP_* 名称仍受支持,以保持兼容性;大写的 CODELOUPE_MCP_* 名称优先。
在 Windows 上,npm 启动器会将原生二进制文件复制到 %LOCALAPPDATA%\codeloupe-mcp\runtime\<version>-<sha256 prefix>\ 并运行该副本。Windows 会锁定正在运行的可执行文件,因此,直接从 node_modules 运行会导致 npx -y @ndhkaeru/codeloupe-mcp@latest 升级失败并出现 EBUSY,或者在另一个 MCP 会话仍在使用该服务时遗留 npm 临时目录。后续启动时会删除已闲置一天的副本。通过 1.1.1 或更早版本的启动器启动的服务仍从 node_modules 运行;如果升级报告 EBUSY,请停止这些 codeloupe-mcp.exe 进程一次,然后重新连接。
工作区来源按以下顺序处理:可重复指定的 CLI 参数、显式工作区环境变量、MCP 客户端根目录(workspaceFolders、roots、rootUri 或 clientInfo.workspaceRoot)、类似项目的进程当前目录,最后是从工具路径推断出的工作区根目录。在 ask 模式下,只有 CLI/环境变量根目录以及已记住的 workspace_index(action="enable") 决策会获准建立索引;客户端根目录、当前工作目录和工具路径仍只是候选项。auto 会在相同的受保护路径、扫描和磁盘预算限制下为符合条件的候选项建立索引。off 会禁用索引和建议。相对工具路径会依次优先使用当前活动工作区上下文、活动索引工作区、从当前工作目录发现的工作区、当前工作目录本身、其他已配置工作区,最后是已加载的索引工作区。
写入根目录是规范化后的 MCP 客户端根目录和显式 --workspace/工作区环境根目录;如果未配置根目录,则使用类似项目的进程当前工作目录,此外还包括 CODELOUPE_MCP_WRITE_ROOTS。在写入根目录内写入不会产生位置警告;其他目标则会收到风险警告,详见工具。发现祖先仓库根目录可能会扩展索引/搜索上下文,但绝不会将写入根目录扩展到声明的根目录之外。workspace_index(action="enable") 仅授予索引权限,不会添加写入根目录。在 .git 下写入,以及通过规范化的联接/符号链接逃逸出写入根目录,均属于严重风险:在调用方重试并设置 acknowledge_risk=true 之前,会通过 risk_confirmation_required 停止操作,不进行任何文件系统更改。
自定义索引目录示例:
{
"mcpServers": {
"codeloupe-mcp": {
"command": "npx",
"args": ["-y", "@ndhkaeru/codeloupe-mcp@latest"],
"env": {
"CODELOUPE_MCP_INDEX_DIR": "/path/to/cache"
}
}
}
}
工具
工具按用途分组。每个响应都采用标准 MCP content 数组结构,并限制输出大小,以适应 Agent 上下文。
服务会协商支持的 MCP 协议版本(2024-11-05、2025-03-26、2025-06-18 和 2025-11-25),对 ping 返回空对象,并且绝不响应通知。通知形式的 tools/call 消息会被忽略,不会执行。notifications/cancelled 会抑制匹配的活动响应,并传播协作式取消;多文件扫描工具会报告协作式进度,并在取消时提前停止。作为服务扩展,请求形式的 tools/call 可将 params.timeout_seconds 设为 60 到 600 之间的整数;超出范围或非整数的值会返回 JSON-RPC -32602,而不是被静默调整。超时响应是结构化 JSON,包含已用时间、观察到的扫描进度、范围更窄的候选路径,以及有条件提供的 index_advice。
文件与编辑
| 工具 | 描述 |
|---|---|
resolve_path | 规范化路径并返回预检可访问性元数据。 |
read_file_range | 读取文件或指定行范围,并检测编码、提供截断元数据。 |
count_file_lines | 统计文本文件的行数,并检测编码和二进制内容。 |
read_snippets | 在单个请求中读取多个文件范围。 |
file_summary | 返回文件元数据、二进制检测结果和简短预览。 |
file_hash | 使用流式 I/O 计算文件的 SHA-256 摘要。 |
validate_json | 验证 UTF-8 文件或内联内容中的 JSON 语法。 |
convert_file_format | 以规范化的编码和换行符重写文件。 |
create_file | 创建或覆盖文件。 |
create_directory | 创建目录,可选择同时创建父目录。 |
edit_file | 通过替换、追加、前置或查找替换来编辑文件。 |
edit_files | 通过预检验证和回滚,对多个现有文本文件执行有界精确编辑。 |
delete_file | 删除一个文件,并返回结构化的成功/错误元数据。 |
list_history | 列出近期进程内写入快照的元数据,不返回文件内容。 |
undo_change | 当当前路径仍与记录的变更后状态匹配时,恢复一份记录的变更前快照。 |
使用 target_line_ending="preserve" 时,edit_file 会将追加、前置和查找替换片段规范化为现有文件采用的 LF 或 CRLF。响应包含 line_endings_normalized 和 mixed_line_endings;对于混合换行符的文件,会报告情况,但不会静默改写现有换行符。
如果未指定 target_encoding,edit_file 和 convert_file_format 会保留检测到的现有编码。它们支持 UTF-8、带 BOM 的 UTF-16LE/UTF-16BE,以及 Windows-1252;请求显式转换时,响应会提供 previous_encoding、target_encoding 和 encoding_changed。
file_hash 和 read_file_range 会通过有界内存流式 I/O 计算完整文件的 SHA-256 摘要。edit_file、delete_file 以及 edit_files.files 中的每个条目都可以将该摘要指定为 expected_hash;过时或格式错误的前置条件会在修改前被拒绝,单文件工具还会在写入或删除前立即重新检查摘要。成功的编辑响应会包含修改前后的摘要。
成功的写入响应内容精简,不包含多余的 success、message 和默认值状态字段。如果操作后文件仍存在,文件修改会返回 path、history_entry_id 和 sha256_after,并附带 replacements、bytes_removed 或 undone_entry_id 等操作专属字段;仅在发生异常情况时才会报告这些情况。edit_files 会对每个已更改文件应用相同的约定,而不会重复返回默认编码、验证和历史记录元数据。
写入授权使用 risk_aware 范围。在明确声明的 MCP/CLI/环境根目录内写入时,不会发出位置警告。其他目标会根据检测到的最高风险收到一条简短警告:位于已知写入根目录之外为 low;位于推断出的代码仓库其他位置为 medium;匹配已配置的敏感模式或检测到符号链接/连接点目标为 high;涉及 .git、敏感的用户主目录凭据/配置文件位置、受保护的操作系统目录,或规范化路径逃逸出声明的根目录/代码仓库为 critical。低、中、高风险写入会立即执行。critical 风险调用会在修改前返回 risk_confirmation_required;使用 acknowledge_risk=true 重试同一调用即可继续,同时保留警告。敏感的哈希不匹配响应不会暴露 actual_hash。声明根目录之外的历史记录条目会包含 outside_declared: true;workspace_index 仅控制索引,不会声明写入根目录。
validate_json 会通过流式处理验证语法,不会将文档完整载入内存。它只接受一个 UTF-8 文件路径或内嵌 JSON 字符串,并会在输入无效时报告解析器的行/列详细信息;它不执行 JSON Schema 验证。
写入历史记录存储在内存中,仅对正在运行的服务进程有效。最多保留 200 条记录和 256 MiB 的快照字节数,并优先淘汰最早的记录。list_history 仅返回元数据;如果路径当前内容或规范化位置与记录的操作后快照不再匹配,undo_change 会拒绝覆盖该路径。服务重启后,历史记录不会保留。
read_file_range 支持按行读取、使用 tail 读取最后 N 行、使用有界的 start_byte 窗口读取超长行,以及通过 RFC 6901 流式选择 json_pointer。文本响应会移除开头的 BOM,将 CRLF 和经典 CR 行结束符规范化为 LF,报告 bom/is_binary,并且绝不会返回包含 NUL 的二进制内容。如果未指定 max_bytes,按行、tail 和 start_byte 读取默认使用 64 KiB 输出窗口;首行超出窗口时,会返回该行前缀,并附带 line_truncated: true 和 next_start_byte。json_pointer 默认使用 1 MiB 的序列化值预算。read_snippets 接受相同的单次请求选择器,并返回基于行或字节的续读位置。
搜索和工作区
| 工具 | 描述 | |------|-------------| | `search_workspace` | 并发执行路径、符号定义和精确文本搜索,并按组显示引擎状态。 | | `text_search` | 按路径范围搜索字面文本或正则表达式,并支持包含/排除筛选器和回退诊断信息。 | | `fuzzy_find` | 在指定范围内模糊搜索路径和文件名。 | | `project_map` | 有界目录树视图,可选择显示大小元数据。 | | `workspace_stats` | 汇总文件、行数、语言和大小。 | | `compare_directories` | 比较两个源目录树,先汇总清单,并可选择输出有界差异。 | | `workspace_index` | 在不绕过服务安全预算的前提下,估算、启用或禁用单个工作区的索引。 |对于字面文本 text_search,Tantivy 仅用于筛选候选文件;只要搜索范围允许,之后始终会运行精确 grep 验证。因此,预热后的搜索会报告 search_strategy: "mixed",而不会将内容索引视为事实来源。核心索引摘要字段(index_used、index_complete、index_age_secs)仍位于顶层。当 complete=false、explain_no_results=true、存在警告或 verbose=true 时,时间戳、回退原因、候选项计数、有界的 unindexed_files_in_scope 及相关详情会移至 diagnostics 下。文件写入工具会为已预热的内容区域安排刷新。
search_workspace 不会通过启发式方法选择引擎。它会并发运行 fuzzy_find、find_definition 和 text_search,返回一个共享的 root,以及固定的 path、symbol 和 text 分组;每组都包含明确的 source、status、strategy、complete 和限制字段。即使某个引擎失败,也会保留其他成功分组。max_results 分别应用于每个分组;max_output_bytes 则限制整个序列化响应的大小,并以公平的方式移除超出大小限制的结果项,同时保留分组状态。
text_search 支持 output_format="json" | "markdown" | "compact"。Markdown 和紧凑文本格式会按文件对匹配项分组,并为每个匹配项输出一行。所有格式都会返回共享的 root,使用相对于该根目录的路径,报告 complete;除非 verbose=true,否则正常的完整结果会省略详细诊断信息。
project_map、fuzzy_find、text_search、workspace_stats、find_definition、find_references 和 search_workspace 支持 include_ignored=true,以包含被 .gitignore、.git/info/exclude、全局 gitignore 或 .ignore 文件筛除的路径。同一组工具还支持 include_hidden=true,以包含隐藏文件和目录。模式中使用 paths 的工具也支持将 path 作为单数别名;同时传入两者会报错。包含式扫描会绕过元数据/内容索引,并改用文件系统遍历。即使设置了 include_hidden=true,根目录扫描仍会排除 .git、.hg 和 .svn 等 VCS 元数据目录,但明确指定范围的隐藏路径或忽略路径仍可搜索。如果搜索结果为零,且有被跳过的忽略项或隐藏项,则会添加有界诊断信息,并建议使用相应的包含标志。搜索/发现响应会一致地提供 index_used、index_complete 和 index_age_secs 字段。project_map 的树键相对于 root(. 表示根目录);每个键分别对应 dirs 和 files 数组,因此条目不会重复包含恒定的类型字段。目录符号链接/联接会在 dirs 中显示,但不会遍历。文件条目仅在 show_sizes=true 时包含 size_bytes。fuzzy_find 结果中的 path 值相对于其唯一共享的 root;当 complete=false 或 verbose=true 时,详细遍历计数、时间戳、回退原因、跳过项详情和警告会移至 diagnostics 下。
当默认筛选器省略文件时,workspace_stats 会报告有界的 excluded_files.ignored 和 excluded_files.hidden 计数。counts_complete=false 表示这些计数只是下限,因为筛选器探测已达到 50,000 个文件的上限。
路径 glob 筛选器在文件系统遍历和元数据索引路径中使用相同的 globset 语义:支持 *.{rs,py} 这样的花括号交替模式;反斜杠会规范化为 /;在 Windows 上匹配不区分大小写;不含 / 的模式会匹配任意深度的文件或目录名称。开头的 ! 会被拒绝,不会被不一致地视为字面字符或否定符;请明确使用工具的 excludes 字段。目录排除项会在遍历和索引模式下剪枝其后代。
符合条件的多文件扫描响应在未获批准的标记工作区足够大,且索引可能有助于当前调用时,可能会包含 index_advice。每个工作区每个服务会话最多发出一次建议,单文件工具不会发出此建议,并且建议会提升至 batch_tool_call 的顶层。使用 workspace_index(action="estimate") 执行有界的只读估算;使用 enable 保存索引批准并开始索引;或使用 disable 移除索引,并记住拒绝状态 30 天。索引批准与写入授权相互独立。blocked 和 too_large 建议无法通过工具参数覆盖。应用程序数据目录中的路径会返回 approval_required;仅当用户明确要求在该确切路径执行操作时,Agent 才可启用索引,且仍须遵守常规扫描和磁盘预算。
代码智能
| 工具 | 描述 |
|---|---|
get_symbols | 从源文件中提取 Tree-sitter 符号、限定名称和声明行。 |
read_symbol_body | 使用 AST 优先解析和备用启发式方法解析限定或非限定符号。 |
find_definition | 使用 AST 优先解析和带标签的启发式备用方法查找区分大小写的限定或非限定定义。 |
find_references | 查找令牌匹配项,并将 AST 支持的结果分类为代码、注释或字符串。 |
list_imports | 列出支持语言的导入项。 |
list_exports | 列出支持语言的导出项。 |
get_call_graph | 列出限定或非限定函数或方法发出的外部调用。 |
compare_symbols | 比较两个解析结果明确的符号,并返回精简元数据和统一差异。 |
符号查询同时接受 Class.method 和 Class::method,也支持更深层的限定名称。get_symbols 会返回 qualified_name 和 start_line;read_symbol_body、get_call_graph 以及 compare_symbols 的每一侧都接受可选的 line 选择器。若非限定查询匹配到多个 AST 结果,则会返回 ambiguous: true 和 candidates,而不是静默选择第一个匹配项。若任一侧存在歧义,compare_symbols 会省略 same_content 和 unified_diff。
对于支持的语言,find_definition 使用 Tree-sitter,并区分符号名称的大小写;这些结果会标记为 resolution: "ast"。对于不受支持的代码扩展名,则使用声明正则表达式备用方法,并标记为 resolution: "heuristic"。find_references 执行令牌匹配,而非绑定或类型解析;对于 Tree-sitter 支持的文件,会返回 match_kind: "code" | "comment" | "string" 和 classification: "ast",将声明名称匹配项标记为 is_definition: true,普通引用则不添加标记。不受支持的扩展名会返回 match_kind: "unknown" 和 classification: "text_fallback"。
find_definition 和 find_references 会在顶层保留结果数据及 complete/限制元数据。扫描计数器、路径索引/文件系统策略、备用方法计数、跳过文件详情和取消状态,仅会在结果不完整、筛选器提示结果为零或设置 verbose=true 时出现在 diagnostics 下。可推断的默认结果元数据会省略;例如,普通 AST 代码引用不会重复包含 classification: "ast"、match_kind: "code" 或 line_truncated: false。
代码智能输出统一使用 path。单文件工具返回一个规范化路径,而 find_definition 和 find_references 返回共享的 root,以及匹配项和跳过文件详情的相对路径。对于含义不明确的 get_call_graph 候选项,会省略重复路径,因为顶层的 path 适用于所有候选项。
compare_directories 默认返回仅含清单的 JSON 结果;需要统一差异时,设置 include_content_diff=true。compare_symbols 返回统一差异和符号元数据,不会在 left 和 right 中重复包含两个完整的符号正文。
字节大小输出字段统一使用 _bytes 后缀:单个条目使用 size_bytes,目录比较使用 left_size_bytes/right_size_bytes。
有界集合输出使用 complete、limit_reached 和 limit_reason。有界嵌套列表使用 entries_complete、details_complete 或 candidates_complete 等名称;只有实际缩短了返回的文本或字节内容时,才使用 truncated。
数据与诊断
| 工具 | 描述 |
|---|---|
peek_archive | 列出最多 1,000 个归档条目,或读取一个最大为 10 MiB 的内部文件。 |
server_health | 报告运行时长、工作区和索引健康状况。 |
index_gc | 检查持久化索引存储,并可选择删除指定的过时或孤立索引。 |
content_index_status | 报告指定文件或目录的 Tantivy 内容索引状态。 |
warm_content_index | 预热 Tantivy 内容索引分区,以便重复搜索。 |
batch_tool_call | 按顺序运行最多 20 个工具,并共享截止时间、取消机制、公平的输出预算和有界的单次调用结果。 |
内容索引状态会区分仍在扫描的已注册工作区(workspace_scanning)与不属于任何已注册工作区的路径。被中断进程留下的持久化 warming 状态会重新加载为 stale,并可再次预热。刷新一个分区不会导致其他已索引分区不可用。就绪的父级分区会覆盖嵌套范围;嵌套的预热、搜索和写入刷新会复用该父级分区,而不是创建冗余的子分区。
工具执行失败时会返回机器可读的 { "error": { "code", "message" } } 载荷,其中也包括 read_snippets 的单项失败和 batch_tool_call 的子调用失败。结构化写入工具的失败会标记为 MCP 错误,并省略旧版顶层别名 success、error_code、message 和 reason。
tools/list 会保留每个工具的描述和完整的验证约束,但会省略冗余标题和每个属性的说明。服务器会保留完整的内部架构,用于参数规范化和验证。
warm_content_index 会返回 outcome(scheduled、ready 或 nothing_to_warm)以及易于理解的 message。除非设置了 include_ignored=true,否则被忽略的范围会返回 ignored_by_ignore_rules;包含忽略项的预热所选出的候选项,仍会从普通父级范围搜索中筛除。如果所有请求路径都不可用,MCP 结果会标记为 isError: true,同时保留结构化的逐路径状态。内容索引写入会跨进程串行执行;如果 Tantivy 写入器繁忙,系统会重试,而不是立即将工作区标记为失败。默认源内容预算为每个文件 2 MiB、每个分区 128 MiB、每个工作区累计 256 MiB;达到上限的分区会报告 partial: true。
batch_tool_call 会在默认 55 秒的批次截止时间和共享的 1 MiB 输出预算内,按顺序执行子调用。其文本载荷以精简的 summary 开头;成功结果和错误消息都会占用公平的单次调用预算,过大的载荷会替换为有界预览,而无法启动的调用会报告为 skipped_deadline、skipped_cancelled 或 skipped_output_budget,不会被直接省略。
server_health 会报告已配置的工作区、活动工作区上下文、索引候选项及拒绝原因、安全预算、持久索引根目录的总大小,以及已加载、未加载和孤立工作区索引的数量。每个已配置的工作区都会分别报告推断得出的 workspace_root,以及精确的 declared_roots 和 write_roots。它会报告 write_scope: "risk_aware";写入征询的兼容字段保持禁用且为空。除非设置 apply=true,否则 index_gc 仅执行试运行;它可以针对工作区根目录,并采用与启动时相同的默认保留策略。活动索引受跨进程共享锁保护。
支持的语言
基于 AST 的工具使用 Tree-sitter 支持 Rust、C、C++、Go、Java、C#、PHP、Ruby、JavaScript、TypeScript、Python、Swift 和 Objective-C。
list_imports 和 list_exports 支持 Rust、JavaScript/TypeScript、Swift、Objective-C、Python、Go、Java 和 C#。Python 导出遵循公共名称约定(顶层声明名称不以下划线 _ 开头);Go 导出遵循导出标识符首字母大写的规则。文件、搜索和工作区工具适用于任何语言的文本文件。
共享文件限制
文件内容限制集中定义在 src/limits.rs 中;当这些限制会影响结果时,架构或响应中会报告相关信息。
| 操作 | 默认值或上限 |
|---|---|
| UTF-8 行范围和尾部读取 | 流式读取;不限制输入文件大小 |
| 完整文件文本解码、单文件编辑、事务文件、符号回退读取和归档条目 | 10 MiB |
| AST 解析、定义候选项和默认比较内容读取 | 每个文件 2 MiB |
| 引用候选项 | 每个文件 5 MiB |
file_summary 完整行数统计 | 50 MiB;更大的文件会返回 line_count_skipped: true |
workspace_stats 行数统计 | 默认每个文件 2 MiB,可配置至 20 MiB |
start_byte 输出窗口 | 默认 64 KiB |
json_pointer 序列化值 | 默认 1 MiB |
会跳过超大文件的扫描工具会返回有界的路径、大小和限制详情,并在需要时附上省略详情的数量。
大型仓库指南
- 将
paths限定在尽可能小且有用的子树中。 - 尽可能优先使用字面量
text_search,以便 Tantivy 缩小候选文件范围。 - 使用具体的基本文件名或路径标记调用
fuzzy_find。 - 保持
project_map的深度较浅,例如max_depth <= 2。 - 使用递归排除项,例如
third_party/**、node_modules/**、target/**、dist/**和out/**。 - 搜索结果出来后,使用
read_snippets,而不是读取整个文件。
text_search、compare_directories 和内容索引使用相同的生成目录/供应商目录策略,包括 build、dist、obj、out、target、node_modules、vendor 和 third_party。只有在已识别的 .NET/Java 工作区中,bin 才会被视为构建输出,因此 Node、Ruby 等项目中作为源代码目录的 bin/ 仍可搜索。若直接将 text_search 的范围指定为排除目录,则会绕过这些默认设置。
索引存储
服务会为每个经批准的规范工作区根目录保留一个索引。嵌套的客户端根目录可以共享推断出的祖先索引/搜索工作区;发现时,优先选择带有 VCS 标记(.git、.hg 或 .svn)的祖先,而不是带有嵌套语言清单的目录。推断出的祖先不会成为声明的根目录;在该仓库其他位置写入时,会收到上文所述的中风险警告。索引批准决定存储在可读的 index-v2/workspaces.json 中;已启用的工作区会在不同会话间重新加载,而拒绝建议后,30 天内不会再收到建议。
- Windows:
%LOCALAPPDATA%\codeloupe-mcp\index-v2\<workspace_hash>\ - Linux/macOS:
$XDG_CACHE_HOME/codeloupe-mcp/index-v2/<workspace_hash>/或~/.cache/codeloupe-mcp/index-v2/<workspace_hash>/ - 自定义根目录:
<CODELOUPE_MCP_INDEX_DIR>\index-v2\<workspace_hash>\ - Tantivy 辅助目录:
<workspace_index_dir>\tantivy-content\ - 上次使用记录辅助文件:
<workspace_index_dir>\last-used
<workspace_hash> 是规范化规范根目录的稳定 FNV-1a 哈希,因此更改 Rust 工具链不会导致所有缓存目录都重命名。通过 meta.json 找到匹配的 1.0 之前版本缓存目录时,会在打开前将其重命名为稳定哈希。
启动时,索引 GC 会在 7 天宽限期后移除工作区已不存在的索引,移除 90 天未使用的索引,并按最近最少使用顺序将总容量限制在 2 GiB。新建索引前也会检查相同的总容量和可用空间预算。元数据扫描会在达到配置的条目数或时间预算后停止,并持久化记录 too_large,但不会创建工作区索引目录。已加载或被其他进程锁定的索引绝不会被删除。Tantivy 存储可搜索字段和文件元数据,但不存储文件内容或路径词元载荷。
工作区根目录是动态的:先批准显式 CLI/环境变量根目录;客户端根目录、类似项目的进程当前目录,以及从工具路径推断出的工作区根目录都会更新活动上下文。索引会在后台加载,使初始化和无关请求保持响应;运行时正在加载时,工具会回退到有界文件系统访问。已加载的运行时使用内存 LRU 预算,逐出后可以从磁盘索引重新打开。可识别的清单包括 Rust、Node、Python、Go、Java/Gradle、Bazel、.NET(*.sln、*.slnx、global.json、Directory.Build.props)、CMake、PHP Composer、Ruby、Elixir 和 Scala/SBT 项目。没有可识别工作区标记的工具路径仍可通过有界文件系统访问使用,但不会收到索引建议。即使没有标记,显式客户端根目录仍是有效的活动上下文;是否建立索引取决于 CODELOUPE_MCP_INDEX_MODE 或已保存的批准决定。
发布
发布通过以下两个渠道分发:
- GitHub Releases:例如
v1.0.0这样的 semver 标签会在 macOS、Linux 和 Windows 上为 x64/arm64 构建原生归档/安装程序。Linux 归档使用静态 musl 目标,因此不需要较新的 glibc,并可在 Alpine 等基于 musl 的发行版上运行。 - npm/npx:
@ndhkaeru/codeloupe-mcp是一个小型 JavaScript 启动器。npm 会安装一个包含对应原生二进制文件的操作系统/CPU 专用可选包,而不是下载全部六个平台的包。
发布检查清单:
- 更新
Cargo.toml、Cargo.lock、packages/npm/package.json、每个packages/npm-platforms/*/package.json以及server.json中的版本。 - 运行
rust.yml中的检查:格式检查、clippy、测试、审计、deny 和 typos。 - 推送
main,然后检查 GitHub Actions 是否有失败。 - 推送 semver 标签,例如
v1.0.0。 - 确认发布资源、全部六个平台的 npm 包以及启动器 npm 包均已成功发布。
- 对
npx -y @ndhkaeru/codeloupe-mcp@<version>进行冒烟测试。
开发
cargo fmt
cargo clippy --all-targets --all-features -- -D warnings
cargo test --release
许可证
Apache-2.0。参见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。