Install
openclaw skills install @ryanbihai/corporate-checkup-quoteopenclaw skills install @ryanbihai/corporate-checkup-quote全部能力来自 haola-pe MCP 服务。有两条通道可以连上它,至少有一条可用,才能给出具体的项目、金额、门店或可约时间。
每次会话开始、或第一次要用查询/预约类能力之前,先确认两件事:
tools/list 里能看到本服务的工具(vendor_list、faq、plan_quotation 等)vendor_brands,有数据返回两步都通过,按通道 A 工作。
本 skill 自带一个零依赖 Python 客户端,直连同一个端点,用户不需要配置任何东西。只要求 Python 3.9+,无第三方依赖。
python scripts/haola.py ping
python scripts/haola.py tools
python scripts/haola.py call vendor_brands '{}'
通道 B 只放行企业白名单(plan_quotation、vendor_brands、vendor_list、knowledge_get、faq、corp_inquiry、corp_contact、help、progress_report),其它工具名会直接被拒 —— 这是硬约束,不是能力缺失。
企业链路全程免登录,既不需要、也不应该运行登录命令。
大多数"连不上"并不是环境不行,而是客户端里还没加这个服务。按下面三步走,不要一上来就给用户贴 JSON 让他去改配置文件。
第 1 步|让用户把这句话原样发给客户端
帮我连接 MCP:https://ai.ihaola.com.cn/api/mcp/haola-pe
不少客户端(WorkBuddy 等)支持在对话里直接添加 MCP 服务:用户发出这句话,客户端自己就能加好,不需要用户改任何配置文件,也不需要管理员权限。
但要分清两件事:能加上 MCP ≠ 能调用全部工具。 加好之后白名单内的工具立刻可用;白名单外的工具要看客户端是否支持对应授权。能不能调、要不要登录,见「登录规则」。
如果用户是第一次用,可以让他把地址和需求写在同一条消息里,一次说完:
帮我连接 MCP:https://ai.ihaola.com.cn/api/mcp/haola-pe
我最近总是头晕,想约个体检,预算 800,先出方案,正式预约时再要登录信息
用户发完之后:
第 2 步|用通道 B 兜住可用能力
通道 B 不依赖客户端的 MCP 配置,白名单内的工具都能直接调。具体有哪些、要不要登录,见「登录规则」。
第 3 步|两步都不通,才说明限制
明确告诉用户:
「这个能力需要连接好啦体检服务才能使用。
你当前的环境既加不上 MCP 服务,也运行不了内置客户端,我暂时无法查门店、报价或预约。」
给出办法:
- 在客户端里添加 MCP 服务:
https://ai.ihaola.com.cn/api/mcp/haola-pe(Streamable HTTP)
- 或使用网页版入口 / 人工客服
然后停止。
判断标准只有一条:任何带具体项目名、具体金额、具体门店、具体可约时间的回答,都必须来自工具返回。没有工具返回,就不说。
不适用:个人单次体检预约、个人方案推荐、查个人报告 → 用 personal-checkup-booking
本链路全程免登录,开场即可说明这一点。
| 用户说的 | 走哪条 |
|---|---|
| 我们公司要做员工体检 | W1 |
| 你们覆盖哪些城市 / 有没有深圳的门店 | W2 |
| 要合同 / 要发票 / 想找人聊 | W3 |
| 员工个人想体检 | 转 personal-checkup-booking |
把范围写在这里,用户和审计都能直接核对,不用去读代码猜。
| 能力 | 用在哪 | 具体行为 |
|---|---|---|
| 网络(出站) | 调 haola-pe 服务 | 只连 https://ai.ihaola.com.cn,不连任何其他域名 |
| 执行命令(shell) | 跑 python scripts/haola.py | 只执行本 skill 自带的脚本;登录时用 --app 模式拉起 Edge/Chrome 小窗 |
| 写本地文件 | 存登录凭据(仅个人版) | 只写 ~/.haola/token.json,不写别处 |
| 读本地文件 | 读登录凭据(仅个人版) | 只读上面那个文件 |
明确不做的:
ai.ihaola.com.cn 以外的任何地址企业版(corporate-checkup-quote)不读也不写凭据文件,全程免登录。
https://ai.ihaola.com.cn/api/mcp/haola-pehaola-pe 1.0.0,协议版本 2025-06-18客户端配置(三种写法,按客户端要求选一种):
{"mcpServers":{"haola-pe":{"type":"streamable-http","url":"https://ai.ihaola.com.cn/api/mcp/haola-pe"}}}
{"mcpServers":{"haola-pe":{"type":"http","url":"https://ai.ihaola.com.cn/api/mcp/haola-pe"}}}
{"mcpServers":{"haola-pe":{"url":"https://ai.ihaola.com.cn/api/mcp/haola-pe"}}}
参数不确定时,先看 tools/list 返回的 inputSchema;还不够就调 help。不要凭记忆猜参数名。
连接失败时按顺序做,不要用"网页能不能打开"判断可用性。
initialize,再 tools/listvendor_brands(最轻,只返回品牌与门店数)第 4 步成功即表示连接正常。此后若某个工具返回 401,那是登录问题,不是连接问题。
| 返回 | 含义 | 处理 |
|---|---|---|
缺少 MCP 会话 / unknown MCP session | 会话已失效 | 重新 initialize 建新会话,不要判定服务不可用 |
| HTTP 401 | 端点正常,该工具需要登录 | 走登录流程,不是连接问题 |
HTTP 404 / 未知工具 | 地址或工具名不对 | 核对地址,看 tools/list |
| HTTP 502 / 超时 | 服务端或网络问题 | 重试一次;仍失败如实告知用户 |
无 HTTP 状态码 / not accessible | 被所在环境的网络策略拦截 | 检查网络策略;不行如实告知 |
| 握手成功但工具列表为空 | 服务端异常 | 重新 initialize 一次 |
tools/list 返回的每个工具描述开头都带标记,调用前就能看出是否需要登录:
[匿名可调用] —— 直接调用[需要登录] —— 调用前先确认已登录,否则会收到 401不要靠"撞 401"来判断,先看标记。
先走「连接:两条通道」里的连不上时三步。第 1 步是让用户把「帮我连接 MCP:<地址>」这句话发给客户端——不少客户端在对话里就能添加服务,用户不用改配置、也不需要管理员权限。三步都走完仍不行,才按第 3 步说明限制。
通道 B(内置 scripts/haola.py)在环境有 Python 时可用,能调哪些工具见「登录规则」。
不得声称连接成功,不得凭自身知识编造体检方案、项目或价格。
共 25 个工具。[免] = 免登录,[登] = 需要登录。
下表是全服务的契约参考。 本 skill 只调用企业白名单里的 9 个工具;其余工具(个人方案、联系人、预约、订单、报告)仅用于理解服务边界,不要调用 —— 员工个人需求让员工自己用 personal-checkup-booking。
| 工具 | 用途 | 登录 |
|---|---|---|
vendor_list | 查门店地址与位置 | [免] |
vendor_brands | 查品牌覆盖的城市与门店数 | [免] |
plan_quotation | 企业团检分档报价 | [免] |
knowledge_get | 读取领域知识 | [免] |
help | 查本体、工具与参数说明 | [免] |
faq | 体检常见问题 | [免] |
progress_report | 上报长耗时任务进度 | [免] |
corp_inquiry | 提交企业商务咨询 | [免] |
corp_contact | 获取商务对接人信息 | [免] |
plan_recommend | 个人体检推荐,返回 planId | [登] |
order_list | 查订单列表 | [登] |
order_detail | 查订单详情 | [登] |
welfare_list | 查用户体检件 | [登] |
welfare_detail | 查体检件详情 | [登] |
cautions | 查体检项目注意事项 | [登] |
contact_list | 查联系人 | [登] |
contact_get | 查联系人详情(含脱敏证件号) | [登] |
contact_create | 创建家属临时联系人 | [登] |
contact_update | 更新联系人信息 | [登] |
contact_profile_get | 查健康画像 | [登] |
contact_profile_save | 保存健康画像 | [登] |
reservation_book | 预约体检 | [登] |
reservation_cancel | 取消预约 | [登] |
reservation_modify | 修改预约日期 | [登] |
card_list | 按卡号查卡密与兑换情况 | [登] |
| 工具 | 列表在哪个字段 |
|---|---|
plan_quotation | data.list[],每档再套 planList[] |
vendor_list | data.hospitals |
vendor_brands | data.vendors |
faq | data.matches |
knowledge_get(不带 uri) | data.resources |
这几个字段名不一样,是服务端现状。 解析前先看这次实际返回的 key——不要因为 plan_quotation 是 list,就假设别的也是 list。按错的字段解析会得到空数组,看起来像"查不到",其实数据是有的。
plan_recommend 的每个项目自带两个判别字段,必须读,不能只看价格:
| 字段 | 取值 | 含义 |
|---|---|---|
constraint_id | mandatory | 体检件或合同强制要求,不能删 |
selected | 按用户情况选中,可增可减 | |
reason | Required by contract | 合同强制,同 mandatory |
Budget fill | 为把预算用掉而额外加的项 | |
| 具体理由 + 「依据:…」 | 针对用户情况,带文献依据 |
Required by contract和Budget fill是服务端内部标记,不是给用户看的文案,别原样念出来。 解释时用用户正在使用的语言:中文用户说「体检件要求必做」「预算内补充项」, 英文用户说 "required by contract" / "budget filler";也可以只讲结论不讲理由。
够用方案 = selected_items 里所有 reason ≠ "Budget fill" 的项目
用满方案 = selected_items 全部
差额就是 Budget fill 项目的金额合计。
实测参考(41 岁男性,主诉血糖偏高、过敏性鼻炎、轻度脂肪肝):
| 预算 | 总项 | 凑数项 | 凑数金额 | 去掉凑数后 |
|---|---|---|---|---|
| 800 | 16 | 1 | 3 元 | 794 元 |
| 2000 | 23 | 6 | 1117 元 | 883 元 |
| 3000 | 28 | 7 | 1661 元 | 1339 元 |
低预算时几乎不需要凑数,预算越高凑数占比越大——所以「用满」在 800 元档几乎等于「够用」,在 2000 元以上就未必。
cost_summary,不要自己逐项加总cost_summary = { totalSpent, remaining, overBudgetExtra }
remaining > 0:没用满overBudgetExtra > 0:超预算了adjustedScore 当价值判断plan_quotation 的项目带 adjustedScore,它是**「与所述健康关注点的贴合度」,不是必要性**。
实测反例(3000 元档男性方案):
内科 ¥8.8 score=68 ← 分数最高
彩超(心脏) ¥216.44 score=51
空腹血糖(GLU) ¥7.74 score=36 ← 基础必需项,分数很低
一般检查 ¥11.415 score=32
按分数排序会丢掉空腹血糖、留下内科。判断必要性只能靠 constraint_id 和 reason。
下表是全服务的契约参考。 本 skill 只调用企业白名单里的 9 个工具;其余工具(个人方案、联系人、预约、订单、报告)仅用于理解服务边界,不要调用 —— 员工个人需求让员工自己用 personal-checkup-booking。
下列约束来自各自的 inputSchema,违反会直接报错。
help():列出全部本体help({ontology}):列出该本体下的工具help({ontology, sub_action}):查看参数,sub_action 用完整名称,如 vendor.list、plan.quotationhospitalCode / longitude + latitude / province + city + districtvendorids 只接受 health100、haolaruicivendor_brandsquery 必须是 2–4 字短关键词(如「报告」「预约」「空腹」)query 则列出全部问题可用 URI 只有四个:
| URI | 内容 | 用在哪 |
|---|---|---|
objects/checkup-proposal | 企业团检方案顾问引导词 | 企业报价前必取 |
objects/contact | 联系人 | 建档 |
objects/contact-profile | 健康画像 | 画像读写 |
enums | 状态码 | 排错 |
quotes 是数组,每档一项 {tier, budget, healthConcerns}planList 是按人群的数组,不是"一档一个价"planId 是后续预约的唯一入口,必须原样保留必填四个参数:
planId, hospitalCode, vendorid, appointmentDate
hospitalCode + vendorid 两个contactId 时直接使用该就诊人planId,不能自己拼项目serviceid(预约订单号)、orderEntryUrl(订单列表页)、payUrl(支付链接,有效期 30 分钟)serviceid 与该订单的 payUrlstatus 是支付状态,预约状态以 rsvStatus 为准reservationId 取自 reservation_book 返回的 serviceidcheckPackage 查套餐注意事项时,必带 vendoridserviceid 仅允许查本人订单relation=self),不要用本工具建本人relation 必填;其余字段可后补,不必一次问全contactid;家人必须先解析唯一 contactid$gte / $lte 日期范围、$in / $or 多值匹配filter 中不用传 partnerid,服务端按调用方身份解析text 必填,是给用户看的可读进度,如「方案生成中,约 1 分钟」reservation_* / order_* / welfare_* / contact_* —— 个人预约与档案plan_recommend —— 个人推荐员工个人怎么约、怎么查报告,属于员工自己的事,不要替 HR 代做。遇到员工个人需求时,直接告知对方使用 personal-checkup-booking。
本 skill 全程免登录。 企业团检报价、门店查询、领域知识、FAQ、企业咨询都不需要登录。
本 skill 的脚本只放行这 9 个工具:plan_quotation、vendor_brands、vendor_list、knowledge_get、faq、corp_inquiry、corp_contact、help、progress_report。其它工具名会直接被拒。
即使这台机器上装过个人体检 skill、也存着个人凭据(~/.haola/token.json),
企业版也不会读取它,不会因为「本机已登录」而多放出任何工具。
个人健康类工具(plan_recommend、contact_*、reservation_*、order_*、welfare_*、cautions、card_list)
在本 skill 里一律不可用。员工要看自己的方案、预约或报告时,告知对方使用 personal-checkup-booking
—— 不要替员工操作,也不要用企业链路去查。
只收群体层面(久坐、夜班、女员工占比、年龄段分布)。不要索取或转述任何单个员工的 姓名、工号、诊断、病史。 提交前把要发出去的字段列出来给用户确认。
健康诉求只要群体层面的,不要个人层面的。
- 可以问:久坐、颈椎、夜班、女性占比、年龄段分布、行业常见职业病
- 不要问、不要记录、不要转述:任何单个员工的姓名、工号、诊断、病史、体检异常
- 如果客户主动贴了具体病历或某个员工的结果,不要把它写进
healthConcerns,只说「这部分不用于报价,如需个案处理请走单人流程」原因:
plan_quotation会把healthConcerns原样发给远端服务,报价只需要人群画像,不需要个体健康数据。
调 plan_quotation 之前,把将要发送的字段原样展示给用户,取得确认再发:
即将提交给好啦体检服务:
档位数:2
人均预算:800 / 1500
健康关注:久坐、颈椎不适
人群:男 / 女已婚 / 女未婚
确认后我就出方案。
用户确认前不要调用。
由 HR 决定要几个档位(1–N 档)。不要替客户定档数。
调用 knowledge_get({uri:"objects/checkup-proposal"}),约 1.1 万字,是「企业团检方案顾问」的完整引导词,含角色、服务范围、信息采集、输出范围裁定、输出模板、交付前自检。
报价前必须先取这一段,方案的写法由它决定。
调用 plan_quotation,入参形如:
{"quotes":[{"tier":"标准档","budget":800,"healthConcerns":"久坐、颈椎不适"}]}
一次可传多档。
这个调用约需 6 秒,属长耗时操作:调用期间用 progress_report 上报进度,避免用户以为卡死。
plan_quotation 的返回:
data.list[]
└─ 每档 { tier, budget, combinedPrice, discount, planList[] }
└─ 每个 planList 项 { population, price, items[], planId }
不要假设所有工具都返回
data.list。 每个工具的信封字段不一样(见「工具调用要点」的返回字段表)。拿不准就这次调用实际返回什么就读什么,不要按别的工具的形状去解析。
企业路径的项目没有
reason和constraint_id,只有itemId / name / price / adjustedScore。所以这里:
- 无法区分「必需项」和「凑数项」——不用去找标记,没有
- 也不能用
adjustedScore排序当价值判断(实测 3000 元档:内科 68 分、空腹血糖 36 分,按分数排会丢掉基础项)- HR 场景要的就是「用足人均预算」,直接给全量即可,不需要筛
要点:
planList 是按人群数组,不是一档一个价格discount 是折扣(如 5.5 表示 5.5 折),没有则不给planId 是后续预约要用的标识,必须原样保留,不要改写引导词里定义了固定章节结构与「交付前自检」,按其执行。
vendor_brands 查覆盖范围(品牌、城市数、门店数)vendor_list 查具体门店:按 province / city / district,或按经纬度vendorids 只接受 health100、haolaruicicorp_inquiry 提交corp_contactcontactId;不复述、不回显、不写进任何持久化文本partnerIdplanId,不能自己拼体检项目haolaruici)是什么:好啦体检 MCP 是面向体检场景的 MCP 服务,接入后可直接完成体检方案生成、门店查询、体检预约、改期取消与报告查询。
能做什么
覆盖范围:240+ 城市,540+ 可预约门店
接入方式:https://ai.ihaola.com.cn/api/mcp/haola-pe,Streamable HTTP
门店、知识、FAQ、企业报价类工具无需登录;个人方案、预约、报告类需要登录。
常见问法
不做什么:不做疾病诊断,不提供治疗建议