mcpField
C
codesurface

codesurface

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

关于 codesurface

codesurface 是一个 MCP 服务,在启动时索引代码库的公开 API,并通过紧凑的工具响应提供查询,相比直接读取源文件可以节省 token。它面向使用 Claude Code、Cursor、Windsurf 等工具的开发者,支持多种编程语言。

主要功能

  1. 01启动时索引公开的类、方法和属性
  2. 02支持 C#、C++ 头文件、Go、Java、Python 和 TypeScript/JavaScript
  3. 03提供按名称或完全限定名获取签名的工具
  4. 04提供包含所有公开成员的类参考卡片
  5. 05返回行号以便进行定向读取
  6. 06支持基于 mtime 的增量重新索引

适用场景

  1. 01在大型代码库中快速查找某个类或方法的签名
  2. 02在编辑前获取类的完整公开成员列表
  3. 03减少 AI 编码代理读取整文件时的 token 消耗

MCP 相关

该项目是 MCP 服务,向 MCP 客户端暴露 search、get_signature、get_class、get_stats 和 reindex 等工具用于查询代码库 API。

配置

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

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

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

安装包
pypicodesurface0.8.0

工具

还没有获取到工具列表

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

详细介绍

codesurface

PyPI Version PyPI Downloads MCP Registry GitHub Stars GitHub Last Commit Languages License: MIT Python 3.10+ Blog Post

一个 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_*

测试项目

项目语言文件数记录数耗时
vscodeTypeScript6,61188,2939.3s
PaperJava2,90933,9732.3s
client-goGo2192,7600.4s
langchainPython1,88012,4181.1s
pydanticPython3659,6480.3s
guavaJava8918,3772.4s
immichTypeScript9197,9570.6s
fastapiPython8815,7130.5s
ant-designTypeScript2,9475,4520.9s
difyTypeScript4,9035,0381.9s
crawlee-pythonPython3862,4730.3s
flaskPython63872<0.1s
cobraGo15249<0.1s
ginGo41574<0.1s
Unity 游戏(私有)C#1291,0180.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 步跨领域研究工作流。

总 Token 数:跨语言对比

语言项目文件数记录数MCP熟练 Agent简单 AgentMCP 比熟练 Agent 少
C#Unity 游戏1291,0341,0214,45311,825少 77%
TypeScriptimmich6948,3441,4514,50014,550少 68%
Javaguava8918,3771,8514,20026,700少 56%
Gogin385341,7912,77015,300少 35%
Pythoncodesurface9407532,00010,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(),强制进行增量更新

联系方式

[email protected]

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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