docs(scheduler-agent): add Claude Code integration guide to verification manual

New §5 in src/docs/chatbot-verification.md: how to connect Claude Code to
the scheduler-agent MCP server. Covers building the mcp-server binary,
`claude mcp add` CLI registration (verified against installed CLI
v2.1.220), the .mcp.json project config schema, the three scopes
(local/user/project), the first-run approval gate, verification commands,
and stdio/env gotchas. Original §5-§7 renumbered to §6-§8.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
lei.chen 2026-08-02 04:26:23 +00:00
parent 56da673b22
commit 4a4ae16725
2 changed files with 91 additions and 6 deletions

View file

@ -22,7 +22,7 @@
| scheduler | `xce_scheduler` | t1 | 7890 |
| worker | `xcecd` | t1 / t2 / t3 | — |
**拓扑说明**:本次验证采用 **t1 单节点 controller**(3 节点 HA 选举因遗留 term 状态卡在 STANDBY,见 §6 已知问题)。单节点用 `--peers` 省略即可。
**拓扑说明**:本次验证采用 **t1 单节点 controller**(3 节点 HA 选举因遗留 term 状态卡在 STANDBY,见 §7 已知问题)。单节点用 `--peers` 省略即可。
---
@ -207,11 +207,93 @@ JOB=$(curl -s -X POST -H "Authorization: $KEY" -H "Content-Type: application/jso
curl -s -H "Authorization: $KEY" "$BASE/xce/v1/jobs"
```
**当前限制**:`hold/release/cancel`(job control)返回 **HTTP 500** —— apiserver 预存 bug(bug-1490),见 §6。
**当前限制**:`hold/release/cancel`(job control)返回 **HTTP 500** —— apiserver 预存 bug(bug-1490),见 §7。
---
## 5. schedulerclient / mcp-server 本地验证
## 5. 接入 Claude Code
让 Claude Code(终端里的 AI 助手)直接用自然语言操作集群。Claude Code 通过 MCP 协议连接我们的 `mcp-server`,后者再经 `schedulerclient` 调 apiserver。
```
Claude Code ──stdio/MCP──> mcp-server ──HTTP──> apiserver ──> controller
(我们的二进制)
```
### 5.1 构建 mcp-server 二进制
```bash
cd /home/lchen/code/xce/src/frontend/mcp-server
go build -o /tmp/xce-mcp ./cmd/main.go
# 产物 ~12MB,CGO_ENABLED=0 纯静态(生产可放到 /usr/local/bin/xce-mcp)
```
> 前置:集群必须已在跑(见 §3),且有 `mcp_operator` API Key(见 §4.1)。
### 5.2 方式 A:CLI 注册(推荐)
`claude mcp add` 会写配置并校验语法(Claude Code v2.x 验证过的格式):
```bash
claude mcp add xce-scheduler -s project \
-e XCE_API_URL=http://172.31.1.30:8080 \
-e XCE_API_KEY=<你的 mcp_operator key> \
-- /tmp/xce-mcp
```
- `xce-scheduler`:服务器名(Claude 看到的工具前缀)
- `-s project`:写进项目根 `.mcp.json`(可随 git 共享给团队)。其他选项:`local`(默认,只在本机本项目)、`user`(本机所有项目)
- `-e`:传给二进制两个环境变量(`XCE_API_URL` 是 apiserver 地址;`XCE_API_KEY` 必填,缺了 mcp-server 会 `log.Fatal`)
- `--` 之后是二进制路径 + 参数;`-e/-s` 等标志必须在 `--` 之前
- stdio 是默认传输,无需 `-t stdio`
### 5.3 方式 B:手写 `.mcp.json`
项目根 `.mcp.json`(当前是空的 `{"mcpServers": {}}`)填成:
```json
{
"mcpServers": {
"xce-scheduler": {
"type": "stdio",
"command": "/tmp/xce-mcp",
"args": [],
"env": {
"XCE_API_URL": "http://172.31.1.30:8080",
"XCE_API_KEY": "<你的 mcp_operator key>"
}
}
}
}
```
- `"type": "stdio"` 必须(本地子进程服务器);远程 HTTP 服务器用 `"type": "http"` + `"url"`
- `command` 可以是绝对路径
- `env` 支持 `${VAR}` 插值——**不要提交明文 key**,推荐写成 `"XCE_API_KEY": "${XCE_API_KEY}"`,启动 Claude Code 前 `export XCE_API_KEY=...`
### 5.4 验证接入
```bash
claude mcp list # 列出所有服务器,带健康检查
claude mcp get xce-scheduler # 查看某服务器的详情(类型/命令/env/状态)
claude mcp remove xce-scheduler # 移除
claude mcp reset-project-choices # 重新触发审批
```
- 项目级(`.mcp.json`)服务器**首次需审批**:`claude mcp list` 显示 `⏸ Pending approval`,下次在项目里启动 `claude` 时接受即可。`local`/`user` 级无需审批。
- 会话内可用 `/mcp` 命令查看/重连服务器,无需重启。
- 审批通过后,Claude 就能用这些工具了。可以问:**"查看集群里有哪些作业在排队"**(走 `scheduler_list_jobs`)或 **"帮我提交一个 sleep 60 的作业"**(走 `scheduler_submit`,会先弹 review 卡确认)。
### 5.5 注意事项
- **stdio 约束**:mcp-server 只能往 stdout 写 MCP 协议消息;任何 `fmt.Println` 到 stdout 会损坏连接。本项目安全——`mcp-go` 的 `ServeStdio` 用 stdout 走协议,`main.go` 的 `log.Printf` 写 stderr。改代码时保持这个约定。
- **`XCE_API_URL` 必须显式设**:不设默认 `https://localhost:8080`,生产环境几乎肯定不对。
- **写操作默认要确认**:`scheduler_submit` 有 `dry_run` review 模式 + destructive 注解(Claude Code 会先弹确认);cancel/hold/release 也会弹确认。这是设计文档 §4.5 的"require confirm"在 MCP 层的体现。
- **当前 cancel/hold/release 不可用**:底层 apiserver control 链路有 bug(bug-1490,HTTP 500)。接入后 submit 可用,control 类工具会报错,直到 bug-1490 修复。
---
## 6. schedulerclient / mcp-server 本地验证
在本地仓库(`chatbot` 分支)可独立运行 Go 测试(不需要集群):
@ -251,7 +333,7 @@ go run /tmp/demo.go
---
## 6. 已知问题
## 7. 已知问题
| 问题 | 状态 | Bug |
|------|------|-----|
@ -263,7 +345,7 @@ go run /tmp/demo.go
---
## 7. 快速参考
## 8. 快速参考
| 操作 | 命令 |
|------|------|
@ -273,4 +355,4 @@ go run /tmp/demo.go
| apiserver 日志 | `sudo tail /opt/xce/apiserver/logs/apiserver_out.log` |
| 停 controller | `sudo fuser -k 9990/tcp` |
| 重启 apiserver | `kill $(fuser 8080/tcp); cd /opt/newxce && setsid ./run.sh apiserver -d /opt/xce/apiserver &` |
| 本地 Go 测试 | 见 §5 |
| 本地 Go 测试 | 见 §6 |