内容
# 量化平台MCP - Zed扩展
将平台的MCP表面暴露给Zed的代理面板:回测、优化、蒙特卡罗和规则重要性来自Jesse核心,以及此仓库的实时会话工具。
## 状态
| | |
|---|---|
| 与`zed_extension_api` 0.7.0进行类型检查 | 是 |
| 编译为`wasm32-wasip1`并组件化 | 是 |
| 在Windows上由Zed 1.12.1加载 | 是 — 扩展加载,`context_server_command`运行 |
| 服务器观察到提供工具 | 是 — 56个研究 / 12个实时,通过stdio |
| 发布到zed.dev/extensions | 尚未 |
## 构建
**Zed加载wasm组件,而不是核心模块。** `cargo build`生成后者,而Zed拒绝它,提示:
```
failed to compile wasm component: failed to parse WebAssembly module:
attempted to parse a wasm module with a component parser
```
早期CI检查仅断言构建产物不为空,这也满足核心模块的要求 — 因此它在Zed无法加载的文件上变为绿色。组件化步骤是必需的:
```bash
rustup target add wasm32-wasip1
cargo install wasm-tools --locked
curl -sSfL -o adapter.wasm \
https://github.com/bytecodealliance/wasmtime/releases/download/v27.0.0/wasi_snapshot_preview1.reactor.wasm
cargo build --release --target wasm32-wasip1
wasm-tools component new target/wasm32-wasip1/release/quant_platform_mcp.wasm \
--adapt wasi_snapshot_preview1=adapter.wasm -o extension.wasm
```
验证您构建的内容 — 标头的第4个字节是区分两者的唯一标识,`0x01`代表核心模块,`0x0d`代表组件:
```bash
head -c 8 extension.wasm | xxd -p # want 0061736d0d000100
```
`zed: install dev extension` 命令面板操作为您执行所有这些操作;上面的手动路径是CI运行的内容。
## 工作树信任
Zed以**受限模式**打开未识别的文件夹,这明确阻止了“MCP服务器集成安装”。扩展程序将加载但不执行任何操作,直到文件夹被信任 — 点击未识别项目横幅上的**信任并继续**。有一个全局`session.trust_all_worktrees`设置,但它会禁用对每个文件夹的保护;信任一个项目是更窄的选择。
## 扩展程序能检查和不能检查的内容
它在**带有虚拟文件系统的WASI沙箱**中运行,因此无法检查主机路径。早期版本使用`fs::metadata`验证`python_path`并拒绝存在且工作的路径 — 一个只能说否定的检查。从这里只能验证空;解释器的存在由Zed在启动进程时发现,借助真实文件系统准确说明。
## 服务器为什么需要新的传输
Zed启动MCP服务器本身,并通过子进程的stdin/stdout与其通信。我们的服务器默认为`:9003`上的长期运行的HTTP监听器,Zed将启动并等待,管道中没有任何内容。因此,`--transport stdio`被添加到`jesse_live.mcp.server`中,与现有的HTTP路径一起,后者保持不变且仍为默认值。
在stdio下,**stdout属于JSON-RPC流**。写入其中的单行日志会损坏帧,客户端会断开连接并出现无法解析的错误。因此,在第一个日志行之前,日志记录被移动到stderr。有一个测试断言没有处理程序指向stdout。
## 设置
```jsonc
// ~/.config/zed/settings.json
{
"context_servers": {
"quant-platform": {
"source": "extension",
"settings": {
// 安装了jesse_live的解释器。
// 不是裸的“python3”:在Windows上,这是WindowsApps存根,而venv的Scripts/没有python3.exe。
"python_path": "/absolute/path/to/.venv/bin/python",
"project_path": "/absolute/path/to/your/jesse/project",
"api_url": "http://localhost:9000",
"surface": "research"
}
}
}
}
```
`surface`选择代理可以访问的内容:
| 值 | 工具 |
|---|---|
| `research`(默认) | 回测、优化、蒙特卡罗、显著性、蜡烛、指标 |
| `live` | 仅实时会话工具 — 无回测曲面 |
| `both` | 所有 |
**它默认设置为`research`。** 编辑器代理获得只读曲面,除非有人故意将其扩大。`live`包括`start_live_session`,虽然该路径受到保护(范围绑定臂令牌,`_check_start`对抗`guard.json`,审计记录必须在实时启动之前可写),但最便宜的控制是不将其交给仅需要运行回测的代理。
**保持`password`未设置。** Zed的`settings.json`不是秘密存储库,会被例行复制到错误报告中。未设置时,服务器读取项目的`.env`文件。如果必须设置,扩展程序通过环境传递它,而不通过argv传递 — argv在`ps`中对机器上的每个用户可见。
## 与量化平台的关系
此仓库是**公开且故意薄**:一个清单和~200行Rust代码,返回一个命令。它不包含策略、凭证、场地驱动器或许可代码。启动的平台(`Flychithecoder/quant-platform`)保持私有。
这种分离存在,因为Zed的注册表将您的仓库作为[`zed-industries/extensions`](https://github.com/zed-industries/extensions)中的**git子模块**添加,因此仓库必须是公开的。发布此仓库无需任何成本;发布平台将意味着发布实时层、场地驱动器和许可系统。
## 发布到注册表
```bash
# 1. 此仓库必须是公开的、标记的,并且CI是绿色的
# 2. 派生 zed-industries/extensions
git submodule add https://github.com/Flychithecoder/mcp-server-quant-platform \
extensions/mcp-server-quant-platform
# 3. 将条目添加到顶级extensions.toml,然后
pnpm sort-extensions
# 4. 打开PR
```
`scripts/check_manifest.py`断言Zed在审查时拒绝的规则 — 必需字段、保留字在id(`zed`、`extension`)中、批准的许可证、实际的`[context_servers.*]`表,以及`src/lib.rs`实现`context_server_command`而不是仅仅声明它。它在CI中运行,并且经过了突变测试:五个故意损坏的清单,五个拒绝。