关于 codesurface
codesurface 是一个 MCP 服务,在启动时索引代码库的公开 API,并通过紧凑的工具响应提供查询,相比直接读取源文件可以节省 token。它面向使用 Claude Code、Cursor、Windsurf 等工具的开发者,支持多种编程语言。
主要功能
- 01启动时索引公开的类、方法和属性
- 02支持 C#、C++ 头文件、Go、Java、Python 和 TypeScript/JavaScript
- 03提供按名称或完全限定名获取签名的工具
- 04提供包含所有公开成员的类参考卡片
- 05返回行号以便进行定向读取
- 06支持基于 mtime 的增量重新索引
适用场景
- 01在大型代码库中快速查找某个类或方法的签名
- 02在编辑前获取类的完整公开成员列表
- 03减少 AI 编码代理读取整文件时的 token 消耗
MCP 相关
该项目是 MCP 服务,向 MCP 客户端暴露 search、get_signature、get_class、get_stats 和 reindex 等工具用于查询代码库 API。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
codesurface
一个 MCP 服务,可在启动时为代码库的公共 API 建立索引,并通过精简的工具响应提供服务,相比读取源文件可节省 Token。
解析源文件,提取公共类、方法、属性、字段和事件,并通过 5 个 MCP 工具提供服务。适用于 Claude Code、Cursor、Windsurf 或任何兼容 MCP 的 AI 工具。
支持的语言: C#(.cs)、C++ 头文件(.h、.hpp、.hxx、.h++)、Go(.go)、Java(.java)、Python(.py)、TypeScript/JavaScript(.ts、.tsx、.js、.jsx)
快速开始
将其添加到你的 .mcp.json:
{
"mcpServers": {
"codesurface": {
"command": "uvx",
"args": ["codesurface", "--project", "/path/to/your/src"]
}
}
}
将 --project 指向包含受支持源文件的任意目录(例如 Unity 的 Assets/Scripts 文件夹、Spring Boot 项目、.NET 的 src/ 目录树、Node.js/React 项目、Python 包等)。系统会自动检测语言。
重启你的 AI 工具并询问:“MyService 有哪些方法?”
CLAUDE.md 片段
将以下内容添加到项目的 CLAUDE.md(或同类说明文件)中。**这一步很重要。**如果没有这一步,AI 虽然可以使用这些工具,却不知道何时该调用它们。
## Codebase API Lookup (codesurface MCP)
Use codesurface MCP tools BEFORE Grep, Glob, Read, or Task (subagents) for any class/method/field lookup. This applies to you AND any subagents you spawn.
| Tool | Use when | Example |
|------|----------|---------|
| `search` | Find APIs by keyword | `search("MergeService")` |
| `get_signature` | Need exact signature | `get_signature("TryMerge")` |
| `get_class` | See all members on a class | `get_class("BlastBoardModel")` |
| `get_stats` | Codebase overview | `get_stats()` |
Every result includes file path + line numbers. Use them for targeted reads:
- `File: Service.cs:32` → `Read("Service.cs", offset=32, limit=15)`
- `File: Converter.java:504-506` → `Read("Converter.java", offset=504, limit=10)`
Never read a full file when you have a line number. Only fall back to Grep/Read for implementation details (method bodies, control flow).
工具
| 工具 | 用途 | 示例 |
|---|---|---|
search | 按关键词查找 API | "MergeService"、"BlastBoard"、"GridCoord" |
get_signature | 按名称或 FQN 获取准确签名 | "TryMerge"、"CampGame.Services.IMergeService.TryMerge" |
get_class | 获取包含所有公共成员的完整类参考卡片 | "BlastBoardModel" → 所有方法/字段/属性 |
get_stats | 查看已建立索引的代码库概览 | 文件数、记录数、命名空间分类 |
reindex | 增量更新索引(基于 mtime) | 仅重新解析已更改、新增或删除的文件。查询无结果时也会自动运行 |
search、get_signature 和 get_class 支持两个可选筛选条件:
file_path:将结果限定为某个目录前缀或确切文件(例如"src/services/"或"src/services/MergeService.ts")include_tests:在结果中包含测试文件(默认值为false)。可检测__tests__/、tests/、test/、*.test.*、*.spec.*、*_test.*、test_*
测试项目
| 项目 | 语言 | 文件数 | 记录数 | 耗时 |
|---|---|---|---|---|
| vscode | TypeScript | 6,611 | 88,293 | 9.3s |
| Paper | Java | 2,909 | 33,973 | 2.3s |
| client-go | Go | 219 | 2,760 | 0.4s |
| langchain | Python | 1,880 | 12,418 | 1.1s |
| pydantic | Python | 365 | 9,648 | 0.3s |
| guava | Java | 891 | 8,377 | 2.4s |
| immich | TypeScript | 919 | 7,957 | 0.6s |
| fastapi | Python | 881 | 5,713 | 0.5s |
| ant-design | TypeScript | 2,947 | 5,452 | 0.9s |
| dify | TypeScript | 4,903 | 5,038 | 1.9s |
| crawlee-python | Python | 386 | 2,473 | 0.3s |
| flask | Python | 63 | 872 | <0.1s |
| cobra | Go | 15 | 249 | <0.1s |
| gin | Go | 41 | 574 | <0.1s |
| Unity 游戏(私有) | C# | 129 | 1,018 | 0.1s |
针对性读取的行号
每条记录都包含 line_start 和 line_end(从 1 开始计数)。多行声明会覆盖完整签名:
[METHOD] com.google.common.base.Converter.from
Signature: static Converter<A, B> from(Function<...> forward, Function<...> backward)
File: Converter.java:504-506 ← multi-line signature
[METHOD] server.AlbumController.createAlbum
Signature: createAlbum(@Auth() auth: AuthDto, @Body() dto: CreateAlbumDto)
File: album.controller.ts:46 ← single-line
这样 AI Agent 就能进行针对性读取,而不必读取整个文件:
# Instead of reading the entire 600-line file:
Read("Converter.java") # 600 lines, ~12k tokens
# Read just the method + context:
Read("Converter.java", offset=504, limit=10) # 10 lines, ~200 tokens
基准测试
在 5 种语言的 5 个真实项目中进行测量,每个项目都采用 10 步跨领域研究工作流。

| 语言 | 项目 | 文件数 | 记录数 | MCP | 熟练 Agent | 简单 Agent | MCP 比熟练 Agent 少 |
|---|---|---|---|---|---|---|---|
| C# | Unity 游戏 | 129 | 1,034 | 1,021 | 4,453 | 11,825 | 少 77% |
| TypeScript | immich | 694 | 8,344 | 1,451 | 4,500 | 14,550 | 少 68% |
| Java | guava | 891 | 8,377 | 1,851 | 4,200 | 26,700 | 少 56% |
| Go | gin | 38 | 534 | 1,791 | 2,770 | 15,300 | 少 35% |
| Python | codesurface | 9 | 40 | 753 | 2,000 | 10,400 | 少 62% |

即使为了了解实现细节而进行后续读取,混合式 MCP + 针对性 Read 方法使用的 Token 仍比熟练的 Grep+Read Agent 少 44%,比简单 Agent 少 87%:

按问题细分

请参阅 workflow-benchmark.md,了解所有语言的完整逐步分析。
筛选索引内容
默认情况下,codesurface 会跳过常见的第三方依赖、构建和版本控制目录:node_modules、vendor、bin、obj、dist、build、target、.git、.venv、__pycache__ 以及其他几十个目录。Git 工作树和子模块也会被跳过。
如需排除其他路径:
项目级(提交到仓库): 在项目根目录下创建 .codesurfaceignore 文件,每行填写一个 glob 模式。
generated/**
docs/**
**/*.pb.go
实例级(CLI): 使用逗号分隔的 glob 模式传入 --exclude。
{
"command": "uvx",
"args": ["codesurface", "--project", "src", "--exclude", "generated/**,vendor/**"]
}
其他索引选项:
--include-submodules:为 Git 子模块建立索引(默认跳过)--language <name>:指定单个解析器(例如--language cpp),而不是自动检测
多个项目
每个 --project 标志都会为一个目录建立索引。要为多个代码库建立索引,请使用不同的服务名称分别运行多个实例:
{
"mcpServers": {
"codesurface-backend": {
"command": "uvx",
"args": ["codesurface", "--project", "/path/to/backend/src"]
},
"codesurface-frontend": {
"command": "uvx",
"args": ["codesurface", "--project", "/path/to/frontend/src"]
}
}
}
每个实例都有独立的内存索引和工具。AI Agent 可以同时看到这些实例,并跨项目查询。
设置详情
其他安装方法
使用 pip install:
pip install codesurface
{
"mcpServers": {
"codesurface": {
"command": "codesurface",
"args": ["--project", "/path/to/your/src"]
}
}
}
项目结构
codesurface/
├── src/codesurface/
│ ├── server.py # MCP server with 5 tools
│ ├── db.py # SQLite + FTS5 database layer
│ ├── filters.py # PathFilter (default exclusions, .codesurfaceignore, --exclude)
│ └── parsers/
│ ├── base.py # BaseParser ABC
│ ├── cpp.py # C++ header parser
│ ├── csharp.py # C# parser
│ ├── go.py # Go parser
│ ├── java.py # Java parser
│ ├── python_parser.py # Python parser
│ └── typescript.py # TypeScript/JavaScript parser
├── pyproject.toml
└── README.md
故障排除
“未索引代码库”
- 确保
--project指向包含受支持源文件(.cs、.h、.hpp、.go、.java、.py、.ts、.tsx、.js、.jsx)的目录 - 服务会在启动时建立索引。检查 stderr 中是否有
[codesurface] scanning N files...和[codesurface] done:行
服务无法启动
- 检查 Python 版本:
python --version(需要 3.10+) - 检查是否已安装
mcp[cli]:pip install mcp[cli]
编辑源文件后结果未更新
- 查询未命中时,索引会自动刷新。如果添加了新类并查询该类,服务会自动重新建立索引并重试
- 也可以手动调用
reindex(),强制进行增量更新
联系方式
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。