feat: add MCP research access and browser key management

This commit is contained in:
yuxuanhui
2026-09-09 16:18:27 +08:00
parent 4debca7dbd
commit 45238280e3
47 changed files with 2642 additions and 44 deletions
@@ -0,0 +1,12 @@
# MCP Key 管理菜单与页面
Status: ready-for-agent
Type: task
实现 Cookie 管理接口、侧栏菜单、创建/单次明文/列表/撤销页面及必要测试;同步接入文档。
## Comments
- 用户已明确授权增加页面管理能力,替代首期仅 CLI 的范围限制。
- 已完成:`/api/v1/mcp-tokens` 管理接口,侧栏「系统管理 → MCP Key」,创建、单次明文、权限/有效期、分页列表、撤销,以及接入文档。
- 验证:后端全量 240 passed(79.24 秒),包含新增 2 项管理集成测试;新浏览器流程 1 passed(9.1 秒);前端构建、Ruff、受影响文件 Prettier 和 git diff --check 通过。
- 浏览器截图已检查,明文已遮罩。测试使用合成账户,无真实平台请求;未合并、推送或部署。
+7
View File
@@ -0,0 +1,7 @@
# MCP Key 网页管理
在已有 MCP 研究能力上增加系统管理菜单和页面,支持名称、1–365 天有效期、四种权限、默认只读、分页列表和撤销。复用原 PAT 签发与身份绑定,不新增迁移或改变 MCP 开关。
管理接口使用原 Cookie 会话及 X-WQ-Request / Origin 保护,PAT 不可管理 Key。明文提交成功后仅返回一次,不进入列表、日志、浏览器存储或助手上下文;关闭或离页销毁显示。列表显示有效、过期、撤销或绑定失效。服务关闭时可管理 Key,显示服务状态与连接地址。
验证覆盖认证隔离、请求保护、输入校验、默认权限、撤销即刻失效、分页无密文泄露及浏览器创建/离页/撤销。仅本地合成测试,不发布或创建生产令牌。
@@ -0,0 +1,16 @@
# 契约与增量迁移
Status: ready-for-agent
Blocked by: 无
按 ../spec.md 及会话批准计划实现并验证。
## Comments
- 已开始本地实现,禁止真实平台调用与部署。
## 实现结果
新增 typed contracts、三个持久模型、0010 增量迁移;SQLite 测试及 PostgreSQL 保留历史/回退重升级验证通过。
- 本地实现完成,未部署或使用真实平台。
@@ -0,0 +1,16 @@
# PAT、CLI 与 MCP 入口
Status: ready-for-agent
Blocked by: 01
按 ../spec.md 及会话批准计划实现并验证。
## Comments
- 已开始本地实现,禁止真实平台调用与部署。
## 实现结果
官方 SDK 2.2.0、ASGI lifespan、PAT 签发/列表/撤销、权限矩阵及 Host/Origin 校验已实现。官方客户端和容器代理验证通过。
- 本地实现完成,未部署或使用真实平台。
@@ -0,0 +1,16 @@
# 数据发现、刷新和历史检索
Status: ready-for-agent
Blocked by: 01,02
按 ../spec.md 及会话批准计划实现并验证。
## Comments
- 已开始本地实现,禁止真实平台调用与部署。
## 实现结果
数据目录、范围/算子/设置/字段可用性、显式缓存刷新、历史精确匹配及分页已实现。刷新错误有独立分页。
- 本地实现完成,未部署或使用真实平台。
@@ -0,0 +1,16 @@
# 直接提交幂等与控制
Status: ready-for-agent
Blocked by: 01,02,03
按 ../spec.md 及会话批准计划实现并验证。
## Comments
- 已开始本地实现,禁止真实平台调用与部署。
## 实现结果
直接候选提交、批内/历史重复策略、账户锁、成功请求幂等、控制重放及原队列唤醒已实现。PostgreSQL 并发和响应丢失测试通过。
- 本地实现完成,未部署或使用真实平台。
@@ -0,0 +1,16 @@
# 结果证据与网页留痕
Status: ready-for-agent
Blocked by: 04
按 ../spec.md 及会话批准计划实现并验证。
## Comments
- 已开始本地实现,禁止真实平台调用与部署。
## 实现结果
固定快照指标、非通过/未知检查、独立 PnL、证据分页、MCP 来源及运行定位已实现。浏览器相关四项测试通过。
- 本地实现完成,未部署或使用真实平台。
@@ -0,0 +1,16 @@
# 集成验收和使用文档
Status: ready-for-agent
Blocked by: 01,02,03,04,05
按 ../spec.md 及会话批准计划实现并验证。
## Comments
- 已开始本地实现,禁止真实平台调用与部署。
## 实现结果
已增加 MCP HTTP/官方客户端、PostgreSQL、浏览器及容器测试,使用文档已写入。最终回归结果见 ../verification.md。
- 本地实现完成,未部署或使用真实平台。
+22
View File
@@ -0,0 +1,22 @@
# MCP 研究能力
Status: ready-for-agent
按本会话确认的开发计划实现:远程 Streamable HTTP、个人访问令牌、11 个研究工具;复用现有业务模块和单进程回测队列。直接候选输入不要求研究资产。不上线、不签发生产令牌、不访问真实平台、不恢复定时研究。
## 契约
端点 /api/v1/mcp,默认关闭。权限 research:read、research:refresh、backtests:execute、backtests:control。PAT 绑定管理员与平台账户,默认 90 天,可撤销,仅保存哈希。提交最多 100 项,完整设置,重复默认拒绝,可明确 rerun。幂等范围为账户和操作;先幂等后去重,成功固定首次响应。停止不取消远程模拟,未知提交不重发。查询只读,刷新显式;摘要不隐藏失败、未知或缺失数据。
## 验收
认证与隔离、并发幂等、重复策略、重启与控制、固定结果快照、分页和 PnL、MCP 客户端与网页运行定位、迁移及回归。真实平台不在验收授权内。具体实现和实际检查记入 verification.md。
## 已实现结构
- MCP transport: backend/app/mcp_api/server.py;PAT: auth.py。独立 Bearer 身份、Host/Origin 校验、可撤销令牌 CLI。
- 共用业务: backend/app/research_access/contracts.py、service.py、queries.py。11 个有界工具,默认拒绝重复,成功请求原子固定响应。
- 迁移 0010 新增令牌、请求幂等和审计表。网页支持 #backtests?run_id=<ID>,来源显示与筛选 MCP。
- 配置 MCP_ENABLED 默认关闭,SDK 2.2.0 固定。首期没有 OAuth、远程取消、正式提交或定时研究。
完整输入输出、错误、权限和 CLI 说明见 ../../docs/mcp-research.md;实际检查见 verification.md。
+37
View File
@@ -0,0 +1,37 @@
# MCP 研究能力验证
日期:2026-09-09。仅本地合成平台;未部署、未签发生产令牌、未执行真实回测、未恢复定时研究。
## 实测
| 检查 | 结果 |
| --- | --- |
| `uv run pytest -q`(backend) | 238 passed,81.43 秒;包含新 MCP 9 项集成测试 |
| 官方 MCP ClientSession + Streamable HTTP | 初始化、11 工具发现、直接提交、结果查询及结构化错误通过;HTTP 边界连接真实应用,平台为 MockTransport |
| PAT | 缺失、过期、撤销、权限不足、账户变化、网页隔离、Host/Origin 拒绝与请求标识脱敏通过 |
| PAT CLI | 临时 SQLite 合成账户下,默认只读令牌签发、不含明文的列表和撤销通过 |
| PostgreSQL 17 隔离验收 | 并发提交/控制只创建一次,重启重放首次响应;0010 升级保留旧研究,回退/重升级通过 |
| Playwright backtests + research-navigation | 4 passed,42.6 秒;含实际 MCP 提交后同一运行的链接、刷新恢复和来源筛选 |
| 前端构建 | TypeScript + Vite 成功;现有第三方 lottie-web eval 提示仍存在 |
| 后端容器镜像 | Dockerfile.backend 成功构建,Linux Python 3.12 + MCP 2.2.0 |
| Caddy 容器代理 | 合成 PostgreSQL 后端经过现有 Caddyfile 验证:健康、无令牌401、有效令牌11工具、Origin拒绝、尾斜杠重定向通过 |
| 静态检查 | Ruff、受影响前端文件 Prettier、git diff --check 通过 |
PostgreSQL 使用独立 `wq_mcp_test` 数据库,不连接个人库;并发验收直接跨数据库事务调用共用业务模块,未依赖 MCP 进程内锁。响应丢失测试在服务完成后丢弃 HTTP 响应,重试只产生一个运行。
## 修正与核验
- Vite 原字符串代理改写 Host;改为显式 changeOrigin=false,与生产代理保持一致,未放宽 MCP 校验。
- SDK 2.x 模型属性使用 snake_case;协议线上的字段仍由 SDK 正确编码。
- pytest async fixture 的 MCP 生命周期放入同一任务进入/退出,避免 AnyIO cancel scope 跨任务退出。
- 审计请求标识保存哈希;管理员密码重置撤销 PAT;时区处理保留 aware datetime 的瞬时点;控制工具声明正确的副作用提示。
- 刷新任务错误独立分页;非通过检查和原始未知值完整保留,元数据刷新有30秒边界,不发布半成品。
- 独立业务核验已完成,未发现高置信的正确性缺陷;本地验收容器已清理。
## 实际边界
- 设置校验使用已缓存平台选项,缺快照返回 unknown;不宣称验证 FASTEXPR 语义或字段真实可用性。
- PnL 单独采集;snapshot 为脱敏历史快照,不是原始网络抓包。
- 平台远程取消、实际额度消耗、自动历史结果复用均不提供。
- Caddy 检查为本地 HTTP 容器链路,不替代公网 HTTPS、真实账户权限或真实客户端凭据配置验收。
- 容器代理检查使用构建后端镜像并只读挂载当前应用及合成测试工厂,测试代码由 .dockerignore 排除在发布镜像之外。