mcpField
M
Mcp Codebase Index

Mcp Codebase Index

本地服务
github.com/MikeRecognex开发工具6335 周前更新

关于 Mcp Codebase Index

mcp-codebase-index 是一个结构化代码库索引器,并提供 MCP 服务,帮助 Claude Code 等客户端在不读取完整文件的情况下浏览代码。它面向使用 AI 辅助开发的开发者,依赖少,基于 Python ast 模块和正则解析多种语言。

主要功能

  1. 01函数、类、导入与依赖图分析
  2. 02变更影响与调用链查询
  3. 03Git 变更时增量重新索引
  4. 04磁盘缓存加快服务启动
  5. 05支持 Python、TypeScript、Go、Rust、C# 等语言

适用场景

  1. 01在大型代码库中定位符号的定义位置
  2. 02评估重构前的变更影响范围
  3. 03减少 AI 助手读取整个文件带来的 token 消耗

MCP 相关

该项目是一个 MCP 服务,向 Claude Code 等 MCP 客户端提供 18 个代码查询工具。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"codebase-index": {
"command": "uvx",
"args": [
"mcp-codebase-index"
]
}
}
}
启动命令uvx mcp-codebase-index

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

安装包
pypimcp-codebase-index0.2.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

mcp-codebase-index

PyPI version CI Python 3.11+ License: AGPL-3.0 MCP Zero Dependencies

一款结构化代码库索引工具,提供用于 AI 辅助开发的 MCP 服务。运行时零依赖——使用 Python 的 ast 模块分析 Python,并通过基于正则表达式的解析来分析 TypeScript/JS、Go、Rust 和 C#。需要 Python 3.11+。

功能介绍

通过解析源文件并提取结构化元数据(包括函数、类、导入、依赖关系图和跨文件调用链)来为代码库建立索引,然后通过模型上下文协议提供 18 种查询工具,让 Claude Code 和其他 MCP 客户端无需阅读整个文件即可高效浏览代码库。

自动增量重新索引: 在 Git 仓库中,索引会自动保持最新。每次查询前,服务都会检查 git diff 和 git status(约 1-2ms)。如果文件发生变化,只会重新解析这些文件,并重建依赖关系图。编辑文件、切换分支或拉取更新后,无需手动调用 reindex。

持久化磁盘缓存: 每次构建后,索引都会保存到 pickle 缓存文件(.codebase-index-cache.pkl)中。后续启动服务时,系统会加载缓存,并根据当前的 Git HEAD 进行验证——如果引用匹配,启动即可瞬间完成。如果只有少量文件发生变化(≤20),系统会加载缓存索引并进行增量更新,而不是从头开始重建。这消除了重启 Claude Code 会话、重启 MCP 服务或上下文压缩后恢复工作时的冷启动延迟。

语言支持

语言方法提取内容
Python(.py)AST 解析函数、类、方法、导入、依赖关系图
TypeScript/JS(.ts、.tsx、.js、.jsx)基于正则表达式函数、箭头函数、类、接口、类型别名、导入
Go(.go)基于正则表达式函数、方法(基于接收者)、结构体、接口、类型别名、导入、文档注释
Rust(.rs)基于正则表达式函数(pub/async/const/unsafe)、结构体、枚举、trait、impl 块、use 语句、属性、文档注释、macro_rules
C#(.cs)基于正则表达式类、接口、结构体、枚举、记录、方法、构造函数、using 指令、[Attributes]、/// XML 文档注释
Markdown/文本(.md、.txt、.rst)标题检测章节(# 标题、下划线、编号标题、全大写标题)
其他通用仅统计行数

安装

pip install "mcp-codebase-index[mcp]"

[mcp] extra 包含 MCP 服务依赖项。如果只需要编程 API,可以省略它。

开发环境安装(从本地克隆的仓库):

pip install -e ".[dev,mcp]"

MCP 服务

运行
# As a console script
PROJECT_ROOT=/path/to/project mcp-codebase-index

# As a Python module
PROJECT_ROOT=/path/to/project python -m mcp_codebase_index.server

PROJECT_ROOT 用于指定要建立索引的目录。默认值为当前工作目录。

持久化缓存

在 Git 仓库中,服务会自动将索引缓存到项目根目录下的 .codebase-index-cache.pkl。启动时:

  1. 缓存命中(完全匹配): 如果缓存的 Git ref 与当前 HEAD 匹配,索引会立即从磁盘加载,无需解析或遍历文件。
  2. 缓存命中(变更较少): 如果自缓存的 ref 以来变更的文件数 ≤20,缓存的索引会被加载,并在首次查询时增量更新。
  3. 缓存未命中: 如果变更较多或不存在缓存,则会执行完整重建并保存新缓存。

将 .codebase-index-cache.pkl 添加到 .gitignore 中——它是仅存于本地的构建产物。

使用 OpenClaw 配置

在运行 OpenClaw 的机器上安装软件包:

# Local install
pip install "mcp-codebase-index[mcp]"

# Or inside a Docker container / remote VPS
docker exec -it openclaw bash
pip install "mcp-codebase-index[mcp]"

将 MCP 服务添加到 OpenClaw Agent 配置(openclaw.json)中:

{
  "agents": {
    "list": [{
      "id": "main",
      "mcp": {
        "servers": [
          {
            "name": "codebase-index",
            "command": "mcp-codebase-index",
            "env": {
              "PROJECT_ROOT": "/path/to/project"
            }
          }
        ]
      }
    }]
  }
}

重启 OpenClaw 并验证连接:

openclaw mcp list

你的 Agent 将可以使用全部 18 个工具。

性能说明: 服务会在每次查询前通过 git diff 自动检测文件变更(约 1–2ms),并仅对变更部分进行增量重新索引。不过,OpenClaw 默认通过 mcporter 集成 MCP,每次调用工具都会启动一个新的服务进程,因此会丢弃内存中的索引,并在每次调用时强制完整重建(小型项目约 1–2 秒,大型项目则更久)。借助持久化缓存,现在冷启动会快很多——服务会从磁盘缓存加载,而不是重新解析整个代码库。若要建立持久连接(甚至避免加载缓存的开销),请使用 openclaw-mcp-adapter 插件。它会在启动时连接一次,并让服务持续运行:

pip install openclaw-mcp-adapter
使用 Claude Code 配置

将以下内容添加到项目的 .mcp.json 中:

{
  "mcpServers": {
    "codebase-index": {
      "command": "mcp-codebase-index",
      "env": {
        "PROJECT_ROOT": "/path/to/project"
      }
    }
  }
}

也可以直接使用 Python 模块(适用于安装在虚拟环境中的情况):

{
  "mcpServers": {
    "codebase-index": {
      "command": "/path/to/.venv/bin/python3",
      "args": ["-m", "mcp_codebase_index.server"],
      "env": {
        "PROJECT_ROOT": "/path/to/project"
      }
    }
  }
}
使用 Hooks 强化工具使用

即使 codebase-index 可用,Claude Code 通常仍会默认使用内置的 Glob/Grep/Read 工具。除了在 CLAUDE.md 中添加说明(见下文)之外,你还可以添加 Hooks,在每次提示词提交时触发,以强化这一行为。将以下内容添加到 .claude/settings.local.json 中:

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo 'CRITICAL REMINDER: Use codebase-index MCP tools FIRST for ALL code navigation (find_symbol, get_function_source, search_codebase, get_dependencies, etc). Only fall back to Glob/Grep/Read for non-code files.'"
          }
        ]
      }
    ],
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo 'Use codebase-index MCP tools first for code navigation.'"
          }
        ]
      }
    ]
  }
}

Hook 的标准输出会作为上下文注入,供 Claude 在回复前查看。SessionStart 会在启动、恢复会话和上下文压缩时触发。UserPromptSubmit 会在每轮对话中触发。

重要:确保 AI 确实使用已索引的工具

默认情况下,AI 助手会忽略已索引的工具,转而使用 Glob/Grep/Read 读取整个文件。像“优先使用”这样委婉的措辞很容易被搁置。请在项目的 CLAUDE.md(或同等的说明文件)中使用强制性措辞添加以下内容:

## Codebase Navigation — MANDATORY

You MUST use codebase-index MCP tools FIRST when exploring or navigating the codebase. This is not optional.

- ALWAYS start with: get_project_summary, find_symbol, get_function_source, get_class_source,
  get_structure_summary, get_dependencies, get_dependents, get_change_impact, get_call_chain, search_codebase
- Only fall back to Read/Glob/Grep when codebase-index tools genuinely don't have what you need
  (e.g. reading non-code files, config, frontmatter)
- If you catch yourself reaching for Glob/Grep/Read to find or understand code, STOP and use
  codebase-index instead

“优先使用”这样的措辞力度不足——模型会将其视为建议,并默认使用熟悉的工具。使用强制性措辞并明确规定回退条件,才能真正改变行为。

可用工具(18)
工具描述
get_project_summary文件数量、包、主要类/函数
list_files列出已索引文件,可选 glob 筛选器
get_structure_summary文件或整个项目的结构
get_functions列出函数及其名称、行号和参数
get_classes列出类及其名称、行号、方法和基类
get_imports列出导入项及其模块、名称和行号
get_function_source函数/方法的完整源码
get_class_source类的完整源码
find_symbol查找符号的定义位置(文件、行号、类型)
get_dependencies符号调用/使用的对象
get_dependents调用/使用某个符号的对象
get_change_impact直接及传递依赖项
get_call_chain最短依赖路径(BFS)
get_file_dependencies指定文件导入的文件
get_file_dependents导入指定文件内容的文件
search_codebase使用正则表达式搜索所有文件(最多 100 个结果)
reindex强制完整重新索引(很少需要——git 仓库会自动增量更新)
get_usage_stats会话效率统计:工具调用次数、返回字符数与源码总字符数、估算节省的 token 数

基准测试

在配备 M 系列芯片的 MacBook Pro 上,对四个真实项目进行了测试,项目规模从小型项目到 CPython 本身(110 万行):

索引构建性能
项目文件数行数函数数类数索引时间峰值内存
RMLPlus367,762237550.9s2.4 MB
FastAPI2,556332,1604,1396175.7s55 MB
Django3,714707,49329,9957,37136.2s126 MB
CPython2,4641,115,33459,6209,03755.9s197 MB

启用持久缓存后,后续启动时无需再次完整构建。与解析相比,加载缓存所需时间微不足道——在 CPython 上命中缓存后,不到 1 秒即可恢复完整索引,而不是等待 56s。

查询响应大小与源码总量对比

查询 CPython——4100 万字符的源码:

查询响应源码总量缩减比例
find_symbol("TestCase")67 个字符41,077,561 个字符99.9998%
get_dependencies("compile")115 个字符41,077,561 个字符99.9997%
get_change_impact("TestCase")16,812 个字符41,077,561 个字符99.96%
get_function_source("compile")4,531 个字符41,077,561 个字符99.99%
get_function_source("run_unittest")439 个字符41,077,561 个字符99.999%

无论项目规模是 7K 行还是 110 万行,find_symbol 都只返回 54-67 个字符。响应大小取决于答案,而非代码库规模。

在 CPython 上,get_change_impact("TestCase") 在 0.45ms 内找到了 154 个直接依赖项和 492 个传递依赖项——没有依赖关系图,这类查询根本无法完成。使用 max_direct 和 max_transitive 将输出限制在 token 预算内。

查询响应时间

即使面对 CPython 的 110 万行代码,所有定向查询的返回时间都不到 1ms:

查询RMLPlusFastAPIDjangoCPython
find_symbol0.01ms0.01ms0.03ms0.08ms
get_dependencies0.00ms0.00ms0.00ms0.01ms
get_change_impact0.02ms0.00ms2.81ms0.45ms
get_function_source0.01ms0.02ms0.03ms0.10ms

运行基准测试:python benchmarks/benchmark.py

这与 LSP 有何不同?

LSP 回答“这个函数在哪里?”——mcp-codebase-index 回答“如果我修改它,会发生什么?”LSP 执行的是点查询:一个符号、一个文件、一个位置。它可以告诉你 LLMClient 的定义位置,以及哪些代码引用了它。但如果问“重构 LLMClient 会造成哪些传递性破坏?”,LSP 就无能为力了。这个工具只需一次调用,就能返回 11 个直接依赖项和 31 个传递性影响——仅 204 个字符。若要通过 LSP 得到相同答案,AI 必须递归地串联数十次查找引用调用,并在每一步读取文件,耗费数千个 token,才能重建依赖图早已掌握的信息。

LSP 还要求你为项目中的每种语言分别安装语言服务器——Python 用 pyright,TypeScript 用 vtsls,Go 用 gopls。每个语言服务器都是一个重量级二进制文件,各自有依赖项和配置。mcp-codebase-index 零依赖,开箱即用,支持 Python、TypeScript/JS、Go、Rust、C# 和 Markdown,并且每个响应都内置 token 预算控制(max_results、max_lines)。LSP 是为 IDE 构建的,而这是为 AI 构建的。

编程使用

from mcp_codebase_index.project_indexer import ProjectIndexer
from mcp_codebase_index.query_api import create_project_query_functions

indexer = ProjectIndexer("/path/to/project", include_patterns=["**/*.py"])
index = indexer.index()
query_funcs = create_project_query_functions(index)

# Use query functions
print(query_funcs["get_project_summary"]())
print(query_funcs["find_symbol"]("MyClass"))
print(query_funcs["get_change_impact"]("some_function"))

开发

pip install -e ".[dev,mcp]"
pytest tests/ -v
ruff check src/ tests/

参考资料

结构索引器最初是作为 RMLPlus 项目的一部分开发的,该项目是 Recursive Language Models 框架的一种实现。

许可证

本项目采用双重许可:

如果你将 mcp-codebase-index 用作独立的 MCP 服务进行开发,可免费遵循 AGPL-3.0 许可证。如果你将它嵌入专有产品,或将其作为托管服务的一部分提供,则需要商业许可证。详情请参阅 COMMERCIAL-LICENSE.md。

评论

支持 Markdown

第一次接触 MCP?

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

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