codesurface について
codesurface は、起動時にコードベースの公開 API を索引化し、コンパクトなツール応答として提供する MCP サーバーです。Claude Code、Cursor、Windsurf などを使う開発者向けで、ソースファイルを全文読み込む場合と比べてトークン使用量を抑えられます。
主な機能
- 01起動時に公開クラス、メソッド、プロパティ、フィールドを索引化
- 02C#、C++ ヘッダー、Go、Java、Python、TypeScript/JavaScript に対応
- 03名前または完全修飾名による正確なシグネチャの取得
- 04公開メンバーをすべて含むクラスの参照カード
- 05定向読み取りに使える行番号の提供
- 06ファイルの mtime に基づく増分再索引
活用シーン
- 01大規模なコードベースでクラスやメソッドのシグネチャを検索
- 02編集前にクラスの公開メンバー一覧を取得
- 03AI コーディングエージェントがファイル全体を読む際のトークン消費を削減
MCP 対応
本プロジェクトは MCP サーバーであり、search、get_signature、get_class、get_stats、reindex などのツールを MCP クライアントに公開してコードベース API を照会できるようにします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
codesurface
コードベースのパブリック API を起動時にインデックス化し、コンパクトなツール応答で提供する MCP サーバーです。ソースファイルを読む場合と比べてトークンを節約できます。
ソースファイルを解析して、パブリックなクラス/メソッド/プロパティ/フィールド/イベントを抽出し、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 は、次の 2 つのオプションフィルターを受け付けます。
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 エージェントはファイル全体を読むのではなく、対象を絞って読み取ることができます。
# 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 | 熟練 | 素朴 | MCP 対 熟練 |
|---|---|---|---|---|---|---|---|
| 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 と対象を絞った読み取りを組み合わせるハイブリッド方式では、熟練した Grep+Read エージェントと比べてトークンを 44% 削減でき、素朴なエージェントと比べると87% 削減できます。

質問ごとの内訳

すべての言語について、ステップごとの詳細な分析は workflow-benchmark.md を参照してください。
インデックス対象のフィルタリング
デフォルトでは、codesurface は一般的なベンダー、ビルド、VCS のディレクトリをスキップします。対象は node_modules、vendor、bin、obj、dist、build、target、.git、.venv、__pycache__ など、数十個に及びます。Git ワークツリーとサブモジュールもスキップされます。
追加のパスを除外するには、次のようにします。
プロジェクト単位(コミット対象): プロジェクトのルートに .codesurfaceignore ファイルを作成し、1 行につき 1 つの 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 フラグで 1 つのディレクトリをインデックスに登録します。複数のコードベースをインデックスに登録するには、サーバー名を変えて個別のインスタンスを起動します。
{
"mcpServers": {
"codesurface-backend": {
"command": "uvx",
"args": ["codesurface", "--project", "/path/to/backend/src"]
},
"codesurface-frontend": {
"command": "uvx",
"args": ["codesurface", "--project", "/path/to/frontend/src"]
}
}
}
各インスタンスは、それぞれ独自のインメモリーインデックスとツールを持ちます。AI エージェントから両方が見えるため、プロジェクトを横断してクエリできます。
セットアップの詳細
その他のインストール方法
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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。