高驰运动 · dsh-coros-sport
在 DeepSeek Harness 桌面端里直接登录高驰(COROS)账号,查看你的设备、运动记录、恢复与体能状态、每日健康数据。
登录在应用窗口内完成 —— 不弹系统浏览器、不跳外部应用、不需要手工粘贴令牌。
当前版本
1.0.3。读取全部数据,写能力只有一处:「训练安排 → 详细」里的计划页可以把一份四周跑步计划创建到高驰账号里,写入前会先列出全部 16 节课、标出与已有计划重叠的日期,需要二次确认才真正写。/coros-plan指令生成的新计划只以文本形式返回,不自动写入。
目录
功能
安装后,桌面端左侧面板列表会出现「高驰运动」入口(位于「插件市场」之后、「自动化任务」之前)。点击进入:
| 区块 | 内容 | 数据来源(MCP 工具) |
|---|---|---|
| 账号 | 昵称、性别、身高、体重、生日 | queryUserInfo |
| 设备 | 绑定的高驰设备名称、蓝牙 ID、型号、序列号、保修到期 | queryDevices |
| 恢复 | 恢复百分比、状态等级、预计完全恢复时间 | queryRecoveryStatus |
| 体能 | VO₂max、跑力等级、阈值配速、5K/10K/半马/全马预测 | queryFitnessAssessmentOverview |
| 运动记录 | 近 7 天活动的类型、日期、地点、距离、时长、配速、平均心率、卡路里 | querySportRecords |
| 健康 | 逐日步数、卡路里、锻炼时长、压力、睡眠分期,以及静息心率与 HRV 基线 | queryDailyHealthData |
| 训练安排 | 本周安排的训练课;账号里是否已有训练计划(整份四周计划的详情在「训练安排 → 详细」里看) | queryTrainingSchedule、queryTrainingPlanLibrary |
七个区块并行加载,任何一个失败只影响它自己的卡片,不会让整页白屏。
安装
前提:DeepSeek Harness 桌面端已安装并至少启动过一次(需要 profile 目录已初始化)。
方式一:本地目录安装(推荐用于开发)
获取代码:
git clone <repo-url> dsh-coros-sport cd dsh-coros-sport在 Harness 会话里安装该目录:
plugin_manager action=install_bundle target=D:\path\to\dsh-coros-sport其中
target必须是绝对路径。安装工具会自行处理依赖与 profile 里的 bundle 注册,请不要手工编辑 profile 的package.json或cordis.patch.yml。重启桌面端,左侧面板列表即出现「高驰运动」。
方式二:从 npm 安装
plugin_manager action=install_bundle target=dsh-coros-sport
安装结果里 application 为 applied 才算生效;若出现 warnings,按其提示处理后再重启。
使用
- 点击左侧「高驰运动」。
- 首次进入是一个登录页,点「登录高驰账号」。
- 登录表单会在面板内部展开:输入高驰账号(邮箱/手机号)与密码,按页面提示完成授权。
- 授权成功后表单自动收起,数据立即加载。
- 之后每次打开都是直接显示数据,直到令牌过期。
令牌过期后页面会提示重新登录,点击即可,无需重新输入任何配置。
退出登录:面板右上角菜单可以清除本机保存的令牌。
生成训练计划
两个入口,走的是同一条链路:
入口一:/coros-plan 指令
在任意会话里输入 /coros-plan,后面跟一句你的目标:
/coros-plan 6 周后跑完 10 公里,每周能练 4 次
插件会读取你的账号数据(个人信息、恢复状态、体能评估、近期训练、本周安排、已有计划),把结果整理成一份简报,连同这句话一起交给模型,由模型给出逐周训练表。
入口二:训练计划面板的「创建训练计划」
当面板显示「这个账号还没有训练计划」时,卡片上会出现「创建训练计划」按钮。点击后:
- 自动打开一个新会话;
- 输入框里已经填好
/coros-plan(光标在指令之后),你直接补上目标即可发送。
按钮只在账号里一个训练计划都没有时出现。「本周暂无训练课」不等于没有计划 —— 那可能只是休息周,此时不会再给创建入口,避免建出两个重叠的计划。计划总是从下一个周一开始,所以刚建完计划的那一周,卡片会补一句「训练从 MM-DD 开始」,而不是让你对着下方列出的计划怀疑自己看错了。
生成出来的计划是文本。要把它落到账号里,用面板「训练安排」右上角的「详细」:进去后按周列出整份四周计划,确认后才写进高驰。
如果提示「现在打不开新会话」,说明当前没有可用的工作区:先在左侧工作区新建一个会话,再手动输入 /coros-plan。
训练计划
训练计划是「训练安排」的详情页,不在看板上直接铺开 —— 看板只留当天要看的数字。看板「训练安排」标题右侧有一个「详细」,点进去是这一页;页头左上角的「返回看板」回到看板。这两个视图只是面板内部的切换,不写 URL、也不进浏览历史:面板是宿主的一个 slot,URL 归宿主管,从 slot 里 push 一条路由会和宿主自己的导航打架。
打开本页时自动读一次计划库(只读),把插件内置的四周计划整份列出来:每周的周标题、周量,以及这一周每节课的日期、星期、时间、时长和距离;当前所在的那一周带「本周」标记。四周一次看全,不再翻页。整份计划共 16 节、约 149 km。
这一页也要读账号,所以它也可能会先发现令牌过期。这时不会停在「重新读取」上(那个按钮重试多少次都还是过期),而是直接切回登录卡片;登录回来仍然停在这一页。
确认无误后点「创建训练计划」,按钮变成「确认创建,写入 16 节」并给出不可撤销的提示 —— 第一次点击只改本地状态,第二次才真的调用 createTrainingPlan,一次性把整份计划建到账号里。
计划内容是固定的四周循环(基础 2 周 / 强化 1 周 / 减量 1 周),不随对话漂移 —— 面板和命令行用的是同一份 lib/plan-workouts.js,而写请求由宿主机端按自己的代码重建 payload,客户端传上来的课程内容一律不采用。这样即使页面被改过或者缓存的计划已过期,也写不进意料之外的课。
四周的结构(起点是创建时最近的周一):
| 周 | 主题 | 周量 | 周四质量课 |
|---|---|---|---|
| 1 | 建立节奏 | 37.7 km | 阈值 3 × 8′ |
| 2 | 加长阈值 | 41.0 km | 阈值 2 × 15′ |
| 3 | 短间歇 | 40.1 km | 间歇 4 × 1000 m |
| 4 | 减量恢复 | 30.6 km | 轻松跑 + 6 × 30″ 加速 |
每周四节,固定周一 / 周二 / 周四 / 周日:周三、周五、周六全休,周二与周四之间留 48 小时。周一至周四的重课在 18:30,周日的长距离在 17:30。
三条限制值得先知道:
- 没有开始时间。
createTrainingPlan的课程入参只有日期 + 课程内容,没有时间字段。18:30 / 17:30 写在课程说明里,不会变成日历提醒或手表提示。 - 不能删。高驰的 MCP 接口没有删除训练计划的工具,写错了只能在高驰 App 里逐节改。这也是为什么必须先看一眼清单。
- 不覆盖,但会重叠。高驰不会把新计划合并到已有计划上,日期重叠时两份计划会同时存在、同一天出现两节课。所以预览会读一遍计划库,把重叠的旧计划列出来提醒你。
工作原理
高驰官方 MCP 服务使用 OAuth 2.0 授权码 + PKCE。本插件的完整流程:
点击登录
↓
动态注册客户端 (POST /connect/register) → client_id
↓
创建 CLI 登录会话 (POST /api/v1/cli/login-sessions) → loginUrl
↓
在面板内用 iframe 打开 loginUrl ← 你在这里输入账号密码并授权
↓
轮询会话状态 (POST .../claim, X-Poll-Token) → authorized + loginTicket
↓
用 loginTicket 换授权码 (GET /oauth2/authorize?login_ticket=...)
↓
换令牌 (POST /oauth2/token, PKCE code_verifier) → access_token + refresh_token
↓
调用 MCP 工具 (POST /mcp, JSON-RPC tools/call)
几个实现上的关键点:
- 令牌 30 天、refresh token 180 天,且每次刷新都会换发新的 refresh token。所以刷新必须串行(单飞),否则并发刷新会让其中一个令牌作废。
loginTicket一次性:拿到后必须立刻兑换授权码,不能存起来稍后再用。- 高驰的
tools/call返回的是一段人类可读的纯文本,不是 JSON,所以每个区块都有对应的文本解析器。 - MCP 传输是无状态的(
protocolVersion 2025-06-18),不需要Mcp-Session-Id,也不发notifications/initialized。
数据与隐私
- 密码不落盘。密码只在你本机的浏览器环境里提交给高驰的登录页(
opencn.coros.com),插件本身从不读取、不存储、不转发它。 - 只保存令牌。令牌存在 Harness 的
credentials服务里(CredentialKey = coros-sport:oauth);该服务不可用时退回~/.dsh-coros-sport/token.json,文件权限0600。 - 不经过第三方服务器。所有请求从你的机器直连高驰官方端点(
mcpcn.coros.com/mcpeu.coros.com/mcpus.coros.com),插件没有自建后端。 - 退出登录会删除本机令牌,并在高驰侧调用
revoke端点尝试吊销。 - 面板默认只读取数据。唯一会写入的路径是「训练计划」:它先发一次只读请求(列出整份四周计划 + 计划库里日期重叠的旧计划),再由你点击确认才调用高驰的
createTrainingPlan写入一份计划。 - 写入不可撤销。高驰的 MCP 接口没有删除训练计划的工具,也没有「移动」:写错了只能在 App 里逐节修改或删除。所以面板把确认做成两步,并在确认前显示完整计划。
- 会与旧计划重叠。高驰不合并计划:日期重叠时两份计划同时存在,同一天会出现两节课。预览会读一次计划库并列出重叠的旧计划,但不会阻止你创建。
- 写入没有开始时间。
createTrainingPlan的课程入参里没有时间字段(只有日期和课程内容),所以 18:30 / 17:30 只会出现在课程名和说明文字里,不会变成日历提醒或手表提示。 /coros-plan只读取数据并把结果作为文字交给模型,不写回账号。- 账号数据会被送到模型:使用
/coros-plan时,插件把你账号里的昵称、身体指标、恢复与体能数据、近期训练记录、本周安排和已有计划整理成一段文本,作为一条用户消息发给当前会话的模型(与你在对话框里粘贴这些内容等价)。不用这个指令就不会发送;面板本身只在本地渲染。
区域
高驰把服务分成三个集群,账号属于哪个就选哪个,选错会登录失败或查不到数据:
| 区域 | 端点 |
|---|---|
| 中国大陆(默认) | https://mcpcn.coros.com |
| 欧洲 | https://mcpeu.coros.com |
| 北美 | https://mcpus.coros.com |
默认是 cn。如果你在海外注册的账号,可在 Harness 的插件配置里改 region 为 eu 或 us。
配置
插件配置项(在 profile 的 bundle patch 里可覆盖):
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
region |
"cn" | "eu" | "us" |
"cn" |
高驰服务区域 |
issuer |
string |
空 | 直接指定 issuer,覆盖 region 的推导(自建代理时用) |
overviewDays |
number |
7 |
运动记录与健康数据的默认回溯天数 |
故障排查
左侧没有出现「高驰运动」
- 确认安装结果的
application是applied,且已重启桌面端。 - 若面板列表被折叠到「更多」里,点「更多」查看;侧栏折叠成图标轨道时面板列表整列隐藏,展开侧栏即可。
- 插件加载失败时入口不会出现 —— 查看 Harness 日志里的
dsh-coros-sport相关报错。
登录页白屏或一直转圈
- 这台机器需要能访问
opencn.coros.com与mcpcn.coros.com。企业网络可能拦截。 - 若内嵌登录页被网络策略拦截,面板会提示改用系统浏览器完成登录(同一套授权流程,只是窗口不同)。
登录后立刻又要求登录
- 多半是区域选错。确认账号归属后用对应的
region重试。
数据区块显示「加载失败」
- 单个区块失败不影响其他区块。重新加载页面即可重试。
- 若全部失败且提示未授权,说明令牌已过期,重新登录。
授权成功但卡在等待
loginTicket是一次性的,若同一授权重复被消费会失败。关闭面板重新登录一次即可。
开发
dsh-coros-sport/
├── lib/
│ ├── index.js Host 半边:Cordis 插件入口、HTTP 路由、数据聚合
│ ├── plan-workouts.js 训练计划的课程内容与 payload 构造、结构校验(纯数据,无 I/O)
│ ├── plan-writer.js 写入策略:查计划库 → 校验 → 创建一次
│ ├── coros-auth.js 登录会话与令牌生命周期(单飞刷新、轮换)
│ ├── coros-api.js 纯协议层:OAuth 请求、MCP 调用、文本解析器
│ └── client.js Client 半边:侧栏入口 + 主面板 UI
├── locale/{zh,en}.json 插件元数据(标题、描述)
├── icon.svg 侧栏与插件列表图标
├── cordis.patch.yml bundle patch
└── package.json
lib/plan-workouts.js 与 lib/plan-writer.js 都不依赖 Cordis 与宿主,可以离线跑:
node scripts/test-plan.mjs # 39 项断言:日期归整、四周 16 节、payload 结构、periodization、窗口、失败即停
node scripts/test-routes.mjs # 用假 ctx 驱动 apply(),走完 8 条路由(加 --write 才真写)
node scripts/test-client.mjs # 手写 React 桩渲染组件:计划页的读取→确认→创建,以及看板 ↔ 计划页的进出
不开面板也能建计划。宿主模块只在重启后重新加载,所以新路由要等重启才生效;在那之前(或任何时候)都可以用命令行,走的是同一套 lib/plan-writer.js:
node scripts/plan-create.mjs # 只读:列出整份计划和冲突
node scripts/plan-create.mjs --start 2026-11-16
node scripts/plan-create.mjs --yes # 真写
--start 接受 YYYY-MM-DD 或 yyyyMMdd,非周一会自动归整到那一周的周一(课程按周一偏移排),不存在的日期直接报错而不是顺延。
这几个脚本只用于开发,不在 package.json 的 files 里。
lib/coros-api.js 不依赖 Cordis、DSH 或文件系统,可以脱离宿主直接测试:
node -e "import('./lib/coros-api.js').then(m => console.log(m.parseDevices(text)))"
调试路由(Host 半边暴露的本地 HTTP 接口):
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /coros-sport/status |
当前登录状态 |
| POST | /coros-sport/login/start |
创建登录会话,返回 loginUrl |
| POST | /coros-sport/login/poll |
轮询会话状态 |
| POST | /coros-sport/login/cancel |
取消登录 |
| POST | /coros-sport/logout |
退出登录并清除令牌 |
| GET | /coros-sport/overview |
聚合后的面板数据 |
| GET | /coros-sport/plan/preview?startDate=&lang= |
只读:整份四周计划、结构问题、计划库里的重叠计划 |
| POST | /coros-sport/plan/write |
写入,body 需 {confirm: true, startDate, lang};缺 confirm 返 400 unconfirmed |
startDate 缺省为下周一,非周一值会归整到该周周一,不存在的日期返 400;超出「今天 ~ 今天+14 天」返 400 out-of-window。
UI 约定:面板只用 Harness 主题令牌(--dsw-alias-*),不引入任何 @deepseek-ai/dsh-client-* 包;React 由宿主的浏览器模块表提供。
许可
MIT © 2026 dsh-coros-sport contributors
本项目与高驰(COROS)官方无隶属关系,是第三方开源集成。「COROS」「高驰」是其各自权利人的商标,此处仅用于说明对接对象。
No comments yet. Be the first to write one.