Skip to main content
Glama
CometixAI

Cometix Indexer

Official
by CometixAI
README.md
## Cometix Indexer(MCP 服务器)

语义代码搜索的本地索引与检索服务。该项目实现了一个基于 Model Context Protocol(MCP)的服务端,封装了对 Cursor 后端 RepositoryService 的建库、同步与搜索流程,通过两类 MCP 工具对外提供能力:项目索引(index_project)与语义搜索(codebase_search)。

### TODOs
- [x]  Cursor Indexing(ok)
- [ ] Warp Embedding
- [ ] Trae Indexing
- [ ] Augment Indexing
- [ ] Github Indexing(来源Copilot Indexing)

### 功能概述
- 索引:扫描本地工作区、生成文件清单、分批上传至 Cursor 服务端并完成建库标记。
- 增量同步:监听文件变更,按需进行轻量同步,保证搜索前的索引新鲜度。
- 语义搜索:调用远端检索接口并自动解密返回的加密路径,直观展示命中。
- 运行形态:作为 MCP 服务器通过 stdio 运行并响应工具调用。

## MCP
### Claude Code
#### npx格式
```
{
  "mcpServers": {
    "cometix-indexer": {
      "command": "npx",
      "args": [
        "-y",
        "--package=git+https://github.com/CometixAI/Cometix-Indexer.git",
        "cometix-indexer",
        "start"
      ],
      "env": {
        "CURSOR_AUTH_TOKEN": "",
        "CURSOR_BASE_URL": "https://api2.cursor.sh"
      }
    }
  }
}
````

#### npm格式(Local)
```
{
  "mcpServers": {
    "cometix-indexer": {
      "command": "npm",
      "args": [
        "--prefix",
        "<path>",
        "run",
        "start"
      ],
      "env": {
        "CURSOR_AUTH_TOKEN": "",
        "CURSOR_BASE_URL": "https://api2.cursor.sh"
      }
    }
  }
}
```

### MCP 工具
- `index_project`
  - 入参:`{ workspacePath: string; verbose?: boolean }`
  - 行为:初始化/刷新索引,按批全量上传并计划自动同步;当 `verbose=true` 时,额外返回本轮上传的相对路径文件列表。
  - 返回:`{ codebaseId, uploaded, batches, nextSyncAt }`

- `codebase_search`
  - 入参:`{ query: string; paths_include_glob?: string; paths_exclude_glob?: string; max_results?: number }`
  - 行为:在“唯一一个”已索引工作区内进行搜索;支持包含/排除 glob 过滤(基于工作区相对路径),并在搜索前进行按需增量同步。
  - 返回:`{ total, hits: Array<{ path, score, startLine, endLine }> }`

示例(概念性):
```json
{
  "name": "index_project",
  "arguments": { "workspacePath": "E:/project" }
}
```
```json
{
  "name": "codebase_search",
  "arguments": { "query": "What is the xxx paper", "paths_include_glob": "src/**/*.rs", "paths_exclude_glob": "**/tests/**", "max_results": 50 }
}
```

### 目录结构(核心)
- `src/index.ts`:进程入口。解析 CLI/环境变量,创建 MCP `Server` 并接入 stdio 传输。
- `src/server.ts`:注册 MCP 工具:`index_project` 与 `codebase_search`。
- `src/services/repositoryIndexer.ts`:索引与同步核心逻辑(初次建库、分批上传、增量同步、定时器)。
- `src/services/codeSearcher.ts`:搜索逻辑(预同步、远端搜索、结果解密与规整)。
- `src/services/fileWatcher.ts`:文件变更监听,标记 `pendingChanges`。
- `src/services/stateManager.ts`:工作区状态持久化(`state.json`)。
- `src/crypto/pathEncryption.ts`:路径分段加解密方案与 Windows/Posix 互转。
- `src/client/proto.ts`:加载 `proto/repository_service.proto` 并以 protobuf 编解码发送 HTTP 请求。
- `src/client/cursorApi.ts`:封装调用的具体 RepositoryService 接口。
- `src/utils/env.ts`:配置解析、默认参数与请求头。
- `src/utils/fs.ts`:忽略规则、文件遍历与可嵌入文件清单读取。
- `src/utils/semaphore.ts`:并发控制与带重试的信号量。

### 工作原理
1) 初次索引
- 扫描工作区(忽略 `node_modules/`、`.git/`、`dist/` 等)并生成默认清单 `embeddable_files.txt`(每个工作区独立存放)。
- 基于 `@anysphere/file-service` 的 `MerkleClient` 构建目录 Merkle 树,获取 `rootHash` 与 `simhash`。
- 生成路径加密密钥(`pathKey`),并以 `V1MasterKeyedEncryptionScheme` 对相对路径逐段加密。
- 将文件按批(`INITIAL_UPLOAD_MAX_FILES`)执行完整流程:
  - `FastRepoInitHandshakeV2` 握手(返回 `codebaseId`)。
  - 上传本批文件(`FastUpdateFileV2`)。
  - `EnsureIndexCreated` 与 `FastRepoSyncComplete` 标记索引完成。
- 将 `codebaseId`、`pathKey`、`orthogonalTransformSeed` 等持久化到工作区状态 `state.json`。

2) 增量同步
- `chokidar` 监听文件变更,只标记 `pendingChanges = true`(轻量)。
- 搜索或定时器触发时,如存在变更:
  - 使用 `SyncMerkleSubtreeV2` 对目录节点进行比对,定位不匹配的子树与文件。
  - 对变更文件执行同批上传与 `EnsureIndexCreated`/`FastRepoSyncComplete`。
  - 清理 `pendingChanges` 标记并持久化。

3) 语义搜索
- 搜索前先触发一次按需增量同步以保证结果新鲜。
- 调用 `SearchRepositoryV2` 并对返回的加密路径用本地 `pathKey` 解密为 Posix 相对路径,输出 `{ path, score, startLine, endLine }`。

### 运行要求
- Node.js >= 18
- `proto/repository_service.proto` 必须存在(仓库已附带)。

### 启动(npx)
```bash
npx -y --package=git+https://github.com/CometixAI/Cometix-Indexer.git cometix-indexer -- --auth-token "$CURSOR_AUTH_TOKEN" --base-url https://api2.cursor.sh
```

### 启动(npm scripts)
```bash
# 安装依赖并构建
npm install
npm run build

# 方式一:通过环境变量(PowerShell 示例)
$env:CURSOR_AUTH_TOKEN="你的Token"; npm run start

# 方式二:通过参数传递(-- 之后的参数会透传给脚本)
npm run start -- --auth-token 你的Token --base-url https://api2.cursor.sh --log-level info

# 开发模式(监听编译;运行需要另开终端执行 start)
npm run dev
# 另开一个终端
npm run start -- --auth-token 你的Token
```
可用环境变量:
- `CURSOR_AUTH_TOKEN`(必需)
- `CURSOR_BASE_URL`(默认 `https://api2.cursor.sh`)
- `LOG_LEVEL`(`debug` | `info` | `warning` | `error`,默认 `info`)

### 环境变量与默认值(可调优)
- `SYNC_CONCURRENCY`(默认 4)
- `SYNC_MAX_NODES`(默认 2000)
- `SYNC_MAX_ITERATIONS`(默认 10000)
- `SYNC_LIST_LIMIT`(默认 1000)
- `FILE_SIZE_LIMIT_BYTES`(默认 2MB,超出将跳过)
- `INITIAL_UPLOAD_MAX_FILES`(默认 10,初次索引分批大小)
- `PROTO_TIMEOUT_MS`(默认 30000)
- `PROTO_SEARCH_TIMEOUT_MS`(默认 60000)
- `AUTO_SYNC_INTERVAL_MS`(默认 5 分钟)

### 开发安装与构建
```bash
npm install
npm run build
```

### 状态与数据持久化
- 工作区专属数据目录:`%USERPROFILE%/.cometix/cursor-indexer/<safeName>-<hash>/`
  - `state.json`:保存 `codebaseId`、`pathKey`、`orthogonalTransformSeed` 等。
  - `embeddable_files.txt`:首次索引生成的可嵌入文件列表,可手动编辑以精确控制索引范围。

### 路径加密与兼容性
- 采用分段对称加密(`aes-256-ctr`)并在 Windows 相对路径(以 `./` 或 `.\` 起始)层面进行,避免泄露真实目录结构。
- 搜索结果会自动尝试使用本地 `pathKey` 解密为 Posix 相对路径,失败时回退为原始加密串。

### 忽略与限制
- 默认忽略:`node_modules/`、`.git/`、`.cursor/`、`dist/`、`build/`、`coverage/` 等。
- 超过 `FILE_SIZE_LIMIT_BYTES` 的文件会被跳过。

### 常见问题
- 报错 `repository_service.proto not found`:请确认项目根目录存在 `proto/repository_service.proto`。
- `Missing CURSOR_AUTH_TOKEN`:通过 `--auth-token` 传参或设置环境变量 `CURSOR_AUTH_TOKEN`。

### 许可
MIT