Skip to main content
Glama
README.md
# advisor-mcp

Claude Code(便宜执行者)通过 MCP 指挥 kimi code CLI(贵顾问 · 对话级会话记忆)在
蓝图 / 破局 / 验收三唤醒点把关。省钱:贵模型只在关键点进场 + 同一对话复用同一
kimi 会话(上下文延续,不重复喂历史)。

## 架构

```
CC 对话 (session_id,由 UserPromptSubmit hook 落盘)
   │ stdio MCP · 绑定表 <cwd>/.agent/advisor-tasks.json(键 = CC 对话 session_id)
   ▼
advisor-mcp server
   │ kimi -S <session_id> -p <msg> --output-format stream-json
   ▼
kimi 会话 (~/.kimi-code/sessions/ · 对话级记忆)
```

对话级绑定:一个 CC 对话(恢复/重启不换 session_id)对应一个 kimi 顾问会话。
consult 自动判定:有绑定直接续聊,无绑定自动开新 kimi 会话并记录 —— 无需先 create。

## 安装

```bash
cd cc_advisor_mcp
python -m pip install -e ".[dev]"
python -m advisor_mcp.install_agent   # 装顾问人格到 ~/.kimi-code/agents/advisor-mcp/
```

注意:kimi ≥0.34 的 agent 文件必须带 YAML frontmatter(`name`/`description`),
否则被发现时静默跳过——`kimi_agent/system.md` 已带,重装即可。

## 全局生效(推荐,用户级)

一次性配置到用户级,所有工程自动启用顾问纪律;不需要逐工程接线。

```bash
# ① 注册 MCP server 到用户级配置(写入 ~/.claude.json 顶层 mcpServers)
claude mcp add -s user advisor-mcp -- python -m advisor_mcp.server
claude mcp get advisor-mcp      # 应显示 Scope: User config / Status: ✔ Connected
```

② 装对话标识 hook(对话级绑定的前提):把 `templates/hook.py` 复制到
`~/.claude/advisor-hook.py`,并在用户级 `~/.claude/settings.json` 的
`hooks.UserPromptSubmit` 数组里**追加**一条(不动已有条目):

```json
{
  "hooks": [
    { "type": "command", "command": "python '<home>/.claude/advisor-hook.py'", "timeout": 10 }
  ]
}
```

`<home>` 换成你家目录的绝对路径(Windows 如 `C:/Users/<用户名>`;macOS/Linux 如
`/home/<用户名>`;JSON 里 `~` 不会展开,必须写绝对路径)。

hook 在每次你发消息时把当前对话的 `session_id` 按「事件 cwd hash + 会话前 8 位」写入
`~/.claude/advisor-current-session-<hash>-<sid8>.json`(每个 CC 窗口写各自文件,
同工程双窗口也互不覆盖);MCP server glob 全部候选文件,按文件内容里记录的 cwd
与 server 是否同工程(互为祖先/后代)过滤,取 mtime 最新的那个做绑定键
(崩溃残留的旧文件 mtime 必然最旧,不会当选,无需超时机制)—— 在 build
子目录里启动的窗口写出的文件,工程根目录的 server 同样认领。

③ 把 `templates/CLAUDE.md` 的「顾问纪律(advisor-mcp)」一节追加到 `~/.claude/CLAUDE.md`(纪律 ① · 三个唤醒点 + 复用纪律 + 成本纪律)。

④ 把 `templates/commands/*.md` 复制到 `~/.claude/commands/`(纪律 ② · /advisor /blueprint /review 全局可用):

```bash
mkdir -p ~/.claude/commands
cp templates/commands/*.md ~/.claude/commands/
```

⑤ 把 `templates/settings.json` 的 `permissions` 块并入 `~/.claude/settings.json`,并在 `env` 块加
`"MCP_TOOL_TIMEOUT": "600000"`(兜底:深度咨询超过 CC 的 120s 观察点时会转后台继续跑,
这个值保证不被更早 abort;纪律 ③ · 5 个工具中 3 个需要 ask 确认,list/poll 免确认):

```json
"permissions": {
  "allow": [
    "mcp__advisor-mcp__advisor_list_tasks",
    "mcp__advisor-mcp__advisor_poll"
  ],
  "ask": [
    "mcp__advisor-mcp__advisor_create_task",
    "mcp__advisor-mcp__advisor_consult",
    "mcp__advisor-mcp__advisor_close_task"
  ]
}
```

注意:settings.json 若已有 env / hooks / 其他字段,合并时不要覆盖,只新增 `permissions` 和 hook 条目。

## 工程级接线(不用全局时)

1. MCP 配置指向本 server:`advisor-mcp`(stdio;`cwd` 设为你的工程目录)
2. 项目 CLAUDE.md 并入 `templates/CLAUDE.md`
3. `templates/commands/*.md` 复制到项目 `.claude/commands/`
4. `templates/settings.json` 的 permissions 并入项目 `.claude/settings.json`
5. hook 仍需装(用户级或项目级 settings.json),对话级绑定依赖它

### cwd 说明

用户级注册时**不要指定 `cwd`**。stdio MCP 子进程继承 Claude Code 启动时的工作目录,
绑定表(`.agent/advisor-tasks.json`,目录不存在自动创建)落在每个工程的根目录,
按工程天然隔离。hook 文件里
记录了 cwd,MCP server 只认与自己工作目录一致的会话标识(防跨工程误绑)。

## 工具

| 工具 | 作用 |
|---|---|
| advisor_consult | 咨询(默认当前对话绑定),**自动绑定**:有绑定续聊,无绑定自动建新 kimi 会话并记录(建会话与首答一次完成,不用先 create);**异步发起**:立即返回任务号,用 advisor_poll 查结果;mode 可选 blueprint/unstick/review(自动带指令前缀);task_id 可显式指定其他会话 |
| advisor_create_task | 可选:显式登记/改名任务,预设 goal 背景,force_new=True 开新 kimi 会话(默认流程无需它) |
| advisor_poll | 查咨询任务状态:⏳ 运行中(已耗时) / ✅ 结果 / ❌ 失败原因 |
| advisor_list_tasks | 列出本工程绑定(会话名 / 状态 / kimi 会话) |
| advisor_close_task | 关闭当前对话(或 task_id 指定)的绑定,会话保留在 kimi 侧可回看 |

## 异步咨询(poll)

`advisor_consult` 只做同步校验(绑定存在、mode 合法),随后后台线程跑 kimi,立即返回
`⏳ 咨询已发起 #t1`。之后用 `advisor_poll("t1")` 轮询:

- 运行中:`⏳ 顾问仍在思考(已 34s)· 稍后再 poll`
- 完成:顾问的完整答复(含重建提示/工具动作摘要)
- 失败:`❌ 咨询失败: <原因>`

任务表存在 server 进程内,重启后需重新发起咨询。consult 保持 ask 权限
(花钱的操作要确认),poll 免确认(纯查询)。

## 手动验证矩阵(验收标准)

| # | 场景 | 预期 |
|---|---|---|
| 1 | create → consult 两次 | 第二次顾问记得第一轮上下文(跨轮记忆) |
| 2 | 同对话二次 create | 复用同一 kimi 会话(只改名,不新开) |
| 3 | consult(mode=blueprint) | 输出为施工单结构(清单/禁区/顺序/验收标准) |
| 4 | resume 会话后 consult | 绑定延续(session_id 不变) |
| 5 | 同工程双窗口各 create/consult | 两个 CC 对话各绑各的,互不串 |
| 6 | `/blueprint` slash command | 完整流程走通(create→consult→执行) |
| 7 | CC 中调用 advisor_consult | ask 权限弹窗出现,批准才执行 |
| 8 | 其他工程裸跑 `kimi` | 行为不变(advisor-mcp agent 不影响 default) |
| 9 | `pytest`(单测) | 全过,e2e 默认排除 |
| 10 | `pytest -m e2e`(需 kimi 登录) | 真实链路:create 两次复用同一会话,consult 记得暗号 |

## 自愈与防护

- **自动绑定**:consult 无绑定(或绑定已 closed)时自动开新 kimi 会话并记录,
  CC 无需先调 create;首答即咨询结果,不重复调用。
- **会话失效自愈**:kimi 侧会话被清理后,consult 检测到 `Session "…" not found`
  会自动按绑定表里持久化的 goal 重建会话并重试一次,输出带重建提示(原上下文丢失)。
- **超时防护**:kimi 无任何输出超过 30s 报「首字节超时」(挂死兜底);总时长不设限,
  深咨询可跑任意久,顾问一直在输出就一直等(poll 查询已耗时)。
- **绑定表多进程安全**:写操作(create/close/touch/重绑)在文件锁内先重读磁盘再写,
  同工程多窗口的多个 server 进程不会互相覆盖记录。
- **closed 记录归档**:同对话 close 后再次使用,旧记录归档保留(旧 kimi sid 可回看),
  不再被覆盖。

## 已知取舍

- `kimi -p` 无权限位,且 `--plan` 与 `-p` 不兼容(实测):顾问会话能改文件,只能
  靠人格指令约束——system.md 已删除「对方要求实现时可直接改文件」条款,顾问只读不写
- stream-json 无 reasoning 事件:顾问"思考过程"不可转发,在场感只到工具动作粒度
- 会话标识按「事件 cwd hash + 会话前 8 位」分文件,多窗口互不覆盖;server 按
  内容 cwd 同工程(祖先/后代)过滤后取 mtime 最新者——同工程双窗口靠
  「consult 总紧跟本窗口最近一次发言」的启发式成立,极端场景(另一窗口在你
  发言后、你 consult 前又发言)可能读错窗口,用 task_id 显式指定即可纠正
- 会话失效自愈以「重建」实现:新 kimi 会话不带原上下文,只有 goal 回喂

---

## 变更日志

<!-- 新条目添加在最上方 -->

### 2026-08-13

- **feat**: 绑定表落盘移入 `.agent` 目录,不存在时自动创建(`advisor-mcp`)

### 2026-08-12

- **fix**: 取消 600s 总时长上限 — 深咨询误杀修复,等待不设限,首字节 30s 仍兜底挂死(`advisor-mcp`)
- **feat**: consult 自动绑定 — 免 create 直聊,无绑定自动建会话并记录,首答即结果(子目录窗口靠祖先/后代过滤认领,TTL 移除)(`advisor-mcp`)
- **docs**: 同步自动绑定文档与顾问运行期纪律(poll 期间只监控、等回复)(`advisor-mcp`)

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly unique role: creating a task binding, initiating a consultation, polling status, listing sessions, and closing a session. There is no ambiguity between them.

Naming Consistency5/5

All tools use the consistent 'advisor_' prefix followed by a clear verb (and sometimes an object). The verb_noun pattern is uniform and predictable.

Tool Count5/5

With exactly five tools, the server is well-scoped for managing advisor consultations. Each tool earns its place in the lifecycle without redundancy.

Completeness5/5

The tool set covers the full lifecycle of a consultation task: create, start, poll, list, and close. No obvious missing operations are needed for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues