关于 insync-mcp
insync-mcp 将 MCP 客户端连接到 InSync Healthcare(Qualifacts)患者门户,以读取健康记录和传输文件。它也能发送消息和护理请求,写入操作须先预览并确认。
主要功能
- 01读取预约、药物和过敏信息
- 02读取消息、表单、问卷和个人资料
- 03下载门户文件和附件
- 04上传保险卡图片
- 05经确认后发送消息和护理请求
适用场景
- 01查看预约、药物和门户消息
- 02下载文件或上传保险卡
- 03发送消息、续药请求或预约请求
MCP 相关
向 MCP 客户端提供门户读取、文件传输、消息发送和护理请求工具。写入操作需要预览和确认令牌;身份验证可使用门户凭据或已登录的浏览器桥接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @chrischall/insync-mcpINSYNC_PORTALYour practice's portal, scheme and host only, e.g. https://<practice>intouch.insynchcs.com.INSYNC_USERNAMEPortal username. Set with INSYNC_PASSWORD to sign in server-side. Leave both empty to relay through your signed-in browser tab.INSYNC_PASSWORD密钥Portal password. A rejected sign-in is never retried automatically, because the portal counts failures toward a lockout.INSYNC_TRANSPORTserver or fetchproxy. Default: server when both credentials are set, otherwise fetchproxy.INSYNC_WS_PORTOverride the fetchproxy WebSocket port (default 37149).INSYNC_OUTPUT_DIRWhere downloaded files are written locally (a path-delimiter list; ~ expands). Default ~/Downloads and ~/Documents. A per-call dest must resolve inside one of these.INSYNC_INLINE_DOWNLOADSLocal installs: true returns a downloaded file inline (up to 10 MiB) instead of writing it to disk; larger files are still saved. Ignored when hosted, which always delivers inline or by signed link. Default false.FETCHPROXY_WS_HOSTBind interface for the fetchproxy concentrator, a literal IP only (default 127.0.0.1). Keep on loopback; it exists for hosted deployments that run each MCP in its own network namespace.FETCHPROXY_IDENTITY_DIRAbsolute path where the fetchproxy long-term identity keypair is stored (default ~/.fetchproxy/identity/).本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
insync-mcp
面向 InSync Healthcare(Qualifacts) 患者门户的 MCP 服务——即位于 https://<practice>intouch.insynchcs.com 的行为健康门户(所有者使用的是 pfbhintouch)。它可读取预约、药物、过敏信息、安全消息、表单、调查问卷、文档、个人资料和账户余额;下载门户文件;上传保险卡图片;并发送安全消息、续药请求、预约请求和取消请求。
此项目由 AI 开发并维护。请自行决定是否使用。 它会读取个人健康信息,且只会读取已登录用户本人账户中的信息。
不只是只读
此服务并非只读。除读取操作外,它还会:
-
下载消息附件和账户文档(下载不会更改门户状态,且有逆操作——即不保存,因此下载工具仍标注为
readOnly); -
上传保险卡图片到你自己的个人资料——这是诊所可见的真实写入操作,且无法通过此服务删除或撤销,因此标注为
destructive,并且需要确认(见下文); -
打开未读消息时,
insync_get_message可能会将其标记为已读,此操作对诊所可见,且无法撤销。此工具标注为destructive,并受allow_mark_read控制(默认为 false):在你传入该参数前,工具只会返回列表行元数据和说明,不会获取详情; -
向诊所发送内容,每项操作都需要确认并标注为
destructive,因为这些内容都无法通过此服务撤回或取消:工具 发送内容 先使用以下工具查询 insync_send_message向诊所群组发送一条新的安全消息 insync_list_message_recipientsinsync_reply_message回复一条消息(除非设置了 allow_mark_read,否则不会回复未读消息)insync_list_messagesinsync_request_refill为当前药物申请续药 insync_get_refill_optionsinsync_request_appointment申请预约一个开放时段(由诊所确认) insync_find_appointment_slotsinsync_cancel_appointment提交带有原因的取消请求(由诊所审核) insync_list_appointments
尚未实现:消息附件、消息中的患者签名、“灵活时间窗口”预约请求、撤回请求、付款和表单提交。
两种身份验证方式
| 模式 | 使用条件 | 持有的凭据 |
|---|---|---|
| 无桥接模式(默认) | 已设置 INSYNC_USERNAME + INSYNC_PASSWORD | 你的门户密码,在进程运行期间保存在内存中 |
| 浏览器桥接模式 | 未配置凭据 | 无 |
无桥接模式会在服务端使用自己的 Cookie 容器登录——无需浏览器或扩展——因此可以托管运行。密码登录已于 2026-10-28 在所有者的诊所进行实际验证:只需向 Login/userLogin 发送一次 POST,无需 MFA 或设备验证。登录遭拒时,绝不会自动重试,因为门户会将失败次数计入账户锁定阈值。Cookie 容器在进程运行期间保存在内存中;不会写入磁盘。
浏览器桥接模式通过 fetchproxy 桥接和 ContextMint Bridge 扩展,将请求转发到你自己的已登录门户标签页,并复用该会话。它完全不持有凭据——这是它唯一的优点——因此,除非你特别需要托管的无桥接模式,否则建议优先使用此模式。
系统会自动选择模式:设置了两项凭据时使用 server,否则使用 fetchproxy。设置 INSYNC_TRANSPORT=server|fetchproxy 可强制指定一种模式。
存储配置仅保存,不会直接使用
登录响应中包含一些对象存储配置。本服务绝不会直接使用这些配置与对象存储通信——所有文件传输都通过门户自身的、经会话授权的端点进行,因此每次读取和写入都受门户针对每位患者的授权控制。此类配置只会保存到会话中,并会按值从每个工具结果、错误和日志中彻底清除。除非下载 URL 位于 *.insynchcs.com 下,否则一律拒绝。
写入尚未经过线上验证
写入工具进行的每项查询——收件人、回复表单、续药选项列表、机构、提供者、就诊类型、时间段和取消时限——均已在线只读验证。发送操作则根据门户自身的 JavaScript 和局部视图推导而来。新消息(insync_send_message)和回复(insync_reply_message)已于 2026-10-28 在所有者监督的测试中在线验证;续药、预约和取消的发送操作尚未测试,因为每项操作都会创建一条供诊所处理的请求。如果门户对发送操作返回 5xx,或连接中断,则会报告 status: "unknown",而不是报错,以便模型先检查相应列表,再决定是否重试,避免重复发送。请参阅
docs/INSYNC-API.md。
保险卡上传
保险卡上传格式根据门户自身的 JavaScript 推导而来,但尚未经过线上 POST 验证:没有任何自动化运行会执行真实上传,因为这会修改诊所可见的状态。之后将通过所有者监督的在线测试进行确认。确认门控、文件检查以及写入后重新读取的指引均已就绪;目前仅待确认线上成功信号。请参阅 docs/INSYNC-API.md。
确认门控
每次写入都通过 @chrischall/mcp-utils 的 confirmWrite 进行门控,调用方式为 defineWrite / registerWrite。首次调用不会发送任何内容,而是返回预览和一个 confirmToken;只有在你批准预览后,第二次调用携带该令牌才会发送。发送/请求工具在预览时可能会读取门户(以解析名称并检查时间段或收件人);上传预览不会读取任何内容。确切的请求正文(上传时为图像字节)和显示的预览都会与令牌绑定,因此,如果参数、文件或门户状态在预览后发生变化,操作将被拒绝并返回 DRAFT_CHANGED。可通过 MCP_CONFIRM_MODE / MCP_CONFIRM_ELICITATION 调整这些设置(请参阅环境变量表)。
安装
{
"mcpServers": {
"insync": {
"command": "npx",
"args": ["-y", "@chrischall/insync-mcp"],
"env": {
"INSYNC_PORTAL": "https://<practice>intouch.insynchcs.com",
"INSYNC_USERNAME": "your-portal-username",
"INSYNC_PASSWORD": "your-portal-password"
}
}
}
}
如需改用浏览器桥接,请不要设置 INSYNC_USERNAME / INSYNC_PASSWORD;此方式需要安装 ContextMint Bridge 和 fetchproxy 浏览器扩展,扩展可从其发布页面获取,并且需要打开门户并登录。然后调用 insync_healthcheck;首次调用会打印一组配对码,供你在扩展弹出窗口中确认一次。
配置
| 变量 | 必填 | 默认值 | 用途 |
|---|---|---|---|
INSYNC_PORTAL | 是 | — | 你的诊所门户,仅包含协议和主机名(https://<practice>intouch.insynchcs.com),不含路径。门户因诊所而异,因此主机名错误会读取其他诊所的数据。 |
INSYNC_USERNAME | 仅限无桥接模式 | — | 门户用户名。与密码一起设置后,可在服务端登录。 |
INSYNC_PASSWORD | 仅限无桥接模式 | — | 门户密码。遭拒后不会重试(存在锁定风险)。 |
INSYNC_TRANSPORT | 否 | auto | server 或 fetchproxy。默认值:两项凭据都已设置时为 server,否则为 fetchproxy。 |
INSYNC_WS_PORT | 否 | 37149 | fetchproxy 集中器端口。整个集群共用此端口;仅在托管时覆盖。 |
INSYNC_OUTPUT_DIR | 否 | ~/Downloads, ~/Documents | 下载文件的保存位置(以路径分隔符分隔的列表;~ 会展开)。每次调用的 dest 必须解析到其中一个位置内。 |
INSYNC_INLINE_DOWNLOADS | 否 | false | true 会以内联方式返回下载内容(base64),而不是写入磁盘——适用于无法访问其磁盘的托管运行器。 |
MCP_CONFIRM_MODE | 否 | ask-user | 每次写入操作的确认门控模式。ask-user = 预览 + confirmToken 往返确认;auto 允许有能力的宿主一步完成确认;无法识别的值会安全拒绝(refuse)。 |
MCP_CONFIRM_ELICITATION | 否 | on | on 允许宿主以交互方式确认写入操作;off 强制执行 confirmToken 往返确认。 |
本地开发时会读取 .env;实际环境变量始终优先。请参阅
.env.example。
fpx 技能
skills/insync-fpx/ 下附带了一个轻量替代方案,无需运行此服务:insync-fpx 技能通过已登录的浏览器标签页,在 shell 中读取同一门户,使用
fpx CLI(捕获一次会话,
然后通过 curl 调用端点)。当你想在脚本中获取门户数据,或不安装 MCP 时,可使用此方案。MCP 提供更丰富的功能;该技能则是快捷方式。
上下文分组
除 insync_healthcheck 外,每个工具都会发布 _meta.mint 提示(分组
health),供 mcp-host 的上下文分组使用:对其他任何客户端而言,这都是无操作的数据。三个规范读取工具——insync_list_appointments(有哪些安排)、
insync_list_messages(有哪些新内容)和 insync_list_forms(有哪些待处理事项)——也接受
view: "brief",以不可信数据信封中的每项一行形式返回,格式为 title — <ISO date | no date> — <status>。其他 view 值保持不变。
工作原理
该门户使用 ASP.NET MVC。已退出登录的会话永远不会返回 401:它会返回状态码为 200 的登录页面(<title>Portal :: Login)、{"isTimeout":true} 响应体,或重定向到 /Login 的 302。此服务通过内容检测到这种情况,并返回一条可采取行动的“未登录”错误,指出当前使用的传输方式。所有端点格式——读取、文件传输和上传——均记录在 docs/INSYNC-API.md 中,仅列出键(不含值,因为值属于 PHI)。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。