心肌健康-mcp
MCP 服务器 MyAtrium健康协会 - 原子健康协会 图片 MyChart
病人门户网站 my.atriumhealth.org读取检测结果,药物,过敏,
免疫接种、健康问题、目标和访问.
该项目由大赦国际制定并维护。 自行取用. 它读取个人健康信息,并且只能从登录用户自己的账户中读取.
两种认证方式
| 模式 | 何时 | 全权证书 |
|---|---|---|
| 浏览器桥 (默认) | 没有配置证书 | 无 |
| 无桥 | MAH_USERNAME + 键 MAH_PASSWORD 设定 | 在磁盘上的门户密码 |
服务器侧的无桥日志——没有浏览器,没有扩展,这就是为什么
可能托管。 校验为 人类在跳动:门户挑战,
mah_sign_in 报告您账户允许的频道,门户发送代码给
你们,以及 mah_verify_code 仅提交您提供的材料。 这里没有东西绕过
第二个因素.
届会结束时 你这样做 没有 重新连接 MCP 或重新启动任何内容 。 这个
下个工具调用返回一个可操作错误, 命名频道和您的掩码
目的地; 您选择一个, 门户文本或电子邮件 你们,以及 mah_verify_code
复会。 人们记得一个有待解决的挑战,因此进一步的工具呼吁
而不是每次重写密码.
从何处读出全权证书. 真实的 MAH_USERNAME 编号 : MAH_PASSWORD 输入
环境总是赢。 服务器没有读取第一个 .env 它发现,在
此顺序 : MAH_DOTENV,则 ~/.myatriumhealth-mcp/.env,则 ./.env。 。 。 .
中间一个存在是因为 MCP 客户端从任意目录启动服务器
他们碰巧在,所以 .env 坐在检查室里是看不见的
失败是安静的:如果没有证书,服务器会回到浏览器桥上,
绑定一个端口并等待一个签入的标签。 如果你打算跑去无桥和看到
桥开始,这就是发生的事情; 启动线现在这样说.
届会是如何持续进行的. 经过一次验证 饼干罐被存储(0600, 绑入账户)并重新使用,因此重新启动当前会话,而不是 再次签名——在会话失效前没有浏览器和进一步代码.
持续了多久, 测量而不是假设. 每十块饼干
MyChart 集为 第二届会议 饼干,没有带 expires 或者说 max-age 所以说
寿命是服务器的独处,不能从罐中读取。 还剩一罐 闲置
219分钟 不再认证: 下通电话被打入新登录
并被挑战 立即一个代码.
其作用和作用是: 闲置 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}而且什么都不说 关于一个活跃的。 测量无法分辨 闲置的超时绝对, 此类门户通常因不活动而失效——因此,稳步使用的会议可能 活得比活得快3.6h舒适,而一个人独活是不会的。 计划重新核实周围 使用中的差距而不是在墙上的时间.
为何罐子被写回会中. 每一个反应 Set-Cookie 被吸收,
当一个值发生实际变化时,罐子会被重新粘贴(transport-server.ts
在每次请求之后; 无旋转时不写 。 这不是簿记:如果
传送门刷新了门票 因为会话被使用 刷新门票只活过
进程通过到达磁盘重新启动。 在规模到零的东道主上——孩子离开的地方
在工具调用之间 —— 回写是扩展会话仍然存在的全部原因
在下一个电话, 而不是复制 冻结在登录.
有两样东西没有改变: 失败仍然需要一个代码,而不是重新连接,
单凭侦测就一无所获 mah_sign_in 请求传送门户
任何东西.
衡量而不是假设什么是行不通的: 页:1
RememberDeviceId这个 门户返回为 没有 一个设备跟踪ID 它会接受回。 也没有寄出去 - 它打破了挑战,离开了 二级校正页templateContext所以反伪造的标志 无法读取SendCode返回 500。 账户报告RememberMeSettings.EnrollDeviceTracking: False这很合适 因此,这个标志 存储但刻意不发送.
桥梁模式的真正优点在于它能保持 根本没有全权证书更喜欢 除非你特别需要无桥梁.
如何运作
每一个MyChart饼干都是 HttpOnly 并登录为 MFA ,所以会话不能为
复制出浏览器,并从节点重放。 因此,转发请求
通过用户自己的登录标签
获取代理 桥和上下文闪烁桥
浏览器扩展名, 重用其认证的会话 . 服务器从不读取或存储
届会饼干.
该门户网站的网络应用在两代后期与一个JSON API交谈——现代
POST api/<area>/<Action> 和遗留格式编码 POST <Area>/<Controller>/<Action>。 。 。 .
两者都有记录,有活捉形状,在
docs/MYATRIUMHEALTH-API.md。 。 。 .
安装
{
"mcpServers": {
"myatriumhealth": {
"command": "npx",
"args": ["-y", "@chrischall/myatriumhealth-mcp"]
}
}
}
桥梁模式需求 上下文闪烁桥,从它安装
页 次 在克罗姆,
解开 chrome 拉链,然后通过 chrome://extensions + 开发者模式 + 装入
解开了 暂时使用 Chrome : Safari 建筑将在 ContexMint app 内运送,
还没有公开下载.
ContextMint Bridge是取回的代理浏览器扩展名, 在其新名称下, 从
相同的维护者——取代碼自有 读取
标出. 它的来源是公开的
无网应用/结晶桥: 建造它
自己,或者对照 .sha256 旁边公布的文件
(单位:千美元)shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256) (中文(简体) ).
那就签到 my.atriumhealth.org 在浏览器中调用 mah_healthcheck编辑
第一通电话打印出一对代码——一次在ContextMint Bridge弹出中批准.
| 信封 | 默认 | 目的 |
|---|---|---|
MAH_USERNAME | —— 说 | MyAtriumHealth用户名. 设定 与 MAH_PASSWORD 以启用无桥模式. |
MAH_PASSWORD | —— 说 | 门户口令. 两者都需要;只设置一个倒回桥上(带有警告). |
MAH_DEVICE_FILE | ~/.myatriumhealth-mcp/device.json | 会话状态( 0600). 拿着 活饼干罐 以及设备符号——作为证书处理. |
MAH_WS_PORT | 37149 | 获取正中央端口( 仅桥模式) 。 整个舰队共享这一个端口;只有在托管时才会覆盖. |
MAH_READ_ONLY | false | true 拒绝 mah_reply_message 发送( 预览仍在工作) 。 该工具无论哪种方式都保留列表 . |
MCP_CONFIRM_MODE | ask-user | 无法显示确认提示的客户端的回复(claude.ai, Claude Desktop)是怎样做的. ask-user:分出两个步骤——第一通电话不发送任何信息,返回一个预览加一个符号,模型在再次与它通话之前,必须先在聊天中得到你的同意. auto:相同的两个步骤,但模型在审查预览本身后可能会使用符号. refuse:拒绝这些客户的答复。 能显示提示的客户端( Claude Code) 总是得到真正的提示, 除非 MCP_CONFIRM_ELICITATION=off。未识别值作为 refuse。 。 。 . |
MCP_CONFIRM_ELICITATION | on | off 从不显示确认提示, 所以每个客户端都会收到 MCP_CONFIRM_MODE 路径。 设定为声称支持快讯但从未显示一个的客户端(回复被挂起-opencode 2.0.x). 任何其它数值保留 on上面写着警告. |
MCP_CONFIRM_TTL_SECONDS | 600 | 一个符号保持有效多久. |
MCP_CONFIRM_SECRET | 每个进程随机 | 签名密钥; 仅在令牌必须在服务器重新启动后幸存时设置它 . |
MCP_BLOB_BASE_URL 编号 : MCP_BLOB_SIGNING_KEY | —— 说 | 由 mcp- host 设定, 绝不用手设定: 后面的每个注册上传商店 mah_upload_slots。在本地安装上取消,其中只有基数64 attachments 工作时. |
工具
所有只读除二. mah_set_active_patient 只改变哪个病人
连接器读取——它不会写入任何图表. mah_reply_message 发送消息
一个提供者会看到,不能撤销:见 答复。 。 。 .
每个读取工具返回 { patient, data }因此,一个响应的图表是
说明而不是推断.
| 工具 | 它的回报 |
|---|---|
mah_list_allergies | 反应过敏和严重性 |
mah_list_health_issues | 问题列表 |
mah_list_immunizations | 按组织分列的免疫情况和日期 |
mah_list_medications | 配有剂量说明书和处方药的药品 |
mah_list_test_results | 实验室和成像:名称、异常旗帜、日期、供应商评论 |
mah_list_upcoming_visits | 即将作出的和正在作出的任命 |
mah_list_past_visits | 按组织分列的以往访问情况 |
mah_list_goals | 患者目标 |
mah_get_health_summary | 保健摘要标题和行动计划 |
mah_list_message_folders | 未读数的邮件中心文件夹 |
mah_list_messages | 信件中心对文件夹的对话,每个文件夹都有 conversationId 答复 |
mah_reply_message | 作为活跃的病人对谈话作出答复——请您首先确认:客户端支持一个的提示,否则是预览和一个 confirmToken (不可逆转) |
mah_upload_slots | 仅主机: 签名上传 URL 文件附加到回复中, 命名回 mah_reply_message 以 blobKeys发送 |
mah_list_insurance | 备案保险 |
mah_list_care_team | 内外护理团队提供者 |
mah_list_billing_accounts | 计费账户和余额(与 HTML 分隔) |
mah_healthcheck | 连接健康——在服务器端签名时的中继、证书和会话状态 |
mah_auth_status | 是否恢复会话以及是否存储设备令牌 |
mah_sign_in | 在服务器侧签名; 如果需要代码, 报告验证通道 (需要全权证书) |
mah_send_verification_code | 请门户向账户持有人发送代码 (需要全权证书) |
mah_verify_code | 提交用户收到的代码 (需要全权证书) |
mah_list_patients | 这种登录可以打开的病人——账户持有人和任何代理主体 |
mah_get_patient_context | 读者所服务的病人,通过门户确认 |
mah_set_active_patient | 将每个读者都指向其中一位病人;幸存下来的病人重新开始。 通过浏览器桥,这个也切换你自己的分页,一个读数拒绝而不是切换回来,如果你在那里换病人的话 |
每个读取工具都使用 view数字 : compact (默认)或 full。原始信封
测试结果为33KB,药物为30KB,所以 compact 这是你想要的
浏览,和 full 返回 MyAtriumHealth 的有效载荷.
compact 总是将图像和外观 URL 剥离出并无法丢出
没人知道 10个读者将每个记录 都减少到临床水平
因为它们的真正有效载荷被俘获,并产生投影
他们: mah_list_allergies, (中文(简体) ), mah_list_health_issues, (中文(简体) ), mah_list_immunizations, (中文(简体) ),
mah_list_medications, (中文(简体) ), mah_list_care_team, (中文(简体) ), mah_list_goals, (中文(简体) ), mah_list_test_results, (中文(简体) ),
mah_list_past_visits, (中文(简体) ), mah_list_insurance 财务报告和审定财务报表 mah_list_messages。 。 。 .
其他读者只获得URL条. 该字段清单适用于
已实际建立,没有其它地点——以上列表来自
PROJECTED_ENDPOINTS 并对照 project() 通过测试呼叫网站,所以
不能悄悄地偏离密码 如果传送门的形状漂移
投影警告为 stderr 并返回 { projectionFailed: true, endpoint, topLevelKeys, note } 而不是一个空列表——只有关键名字,从来没有原始的健康记录
view: 'full' 去看传送门的载荷.
三个读者也拿 view: 'brief' ——每件一行, title — <ISO date | no date> — <status>,最多120个字符,在领先之后 -- patient: <label> 说明
以 -- 是说明,不是项目)——针对按上下文分类的MCP组主机
(每个工具携带) _meta.mint 提示; 此服务器位于 health 组 :
mah_list_messages (有什么新鲜事), mah_list_upcoming_visits (这是什么)和
mah_list_billing_accounts (到期的;只有余额的账户). 即将到来的访问
线条读取 VisitTypeName 财务报告和审定财务报表 PrimaryDate,没有对照
捕获了即将到来的有效载荷,所以它又回到 Appointment — no date 而不是猜测.
会话结束,他们悄悄地做
MyChart 回答一个 hTTP 200 已过期会话, 其正文为登录页永远
a 401,然后JSON终点返回 {}。工具生成“未签名”错误
而不是报告空洞的结果。 会话寿命短; 需要签名
在用途之间.
没有MCP
skills/myatriumhealth-fpx 做同样的事情 从一个
带有外壳 fpx CLI — 没有服务器可运行 。 内容 references/endpoints.md 携带
现场核查 jq 每一个终点的配方.
信件
mah_list_messages 是无法用空机构调用的一个终点。 这个
需要一个五键请求 PageNonce cSP 不为 /app/* 页面,以及
谁 externalLoadParams 列出 非当地 组织——通过
本地组织返回 HTTP 500。 客户端从
conversations/GetOrganizations 及其明确的 isLocal 旗帜.
api/item-feed/FetchItemFeed 仍然需要尚未捕获的参数.
答复
mah_reply_message 使用一个 conversationId 从 mah_list_messages,简洁文本
body,以及可选文件—— attachments (基数64)和(或) blobKeys (主机上传).
它的答复 以活动病人为准。 。 。 .
- 它在发送前问起. 可以显示确认提示的客户端( Claude)
代码)获得一条有线,收件人,正文和附件,除非
MCP_CONFIRM_ELICITATION=off在其他地方,第一个 呼叫不发送,返回预览加一confirmToken; 只有重复通话 与同样的论据 和标志发送.MCP_CONFIRM_MODE(以上)决定 该模型在使用前是否必须得到您在聊天中的认可( )ask-user,则 默认),可自行使用(auto)或被拒绝(refuse) (中文(简体) ). 发送者本身是 不可逆且可提供者. - 发送必须遵循自己的预览 . 信物与病人,线,
显示预览( 机队共享机制来自
@chrischall/mcp-utils) (中文(简体) ). 拒绝其它任何内容: 不同的回复或线索 (单位:千美元)DRAFT_CHANGED,带有新的预览和新标志),10分钟后 (单位:千美元)TOKEN_EXPIRED),一个已经使用的符号(TOKEN_REUSED)或未为本答复印发 (单位:千美元)TOKEN_INVALID) (中文(简体) ). 每个预览都授权发送一次, 一旦发送, 就会使用此令牌 因此,任何重试,即使失败 之前,任何事情出,需要一个 新的预览 。 所以这个模型读到的短信不能用单调发送 用户从未看到. MAH_READ_ONLY=true拒绝每一个发送. 该工具保留注册——一个主机 连接器会发布一个没有内存的孩子的工具列表, 所以工具可以 只有在允许写作时 才会消失.- 限制来自门户: 500个字符, 3个附件, 10 MB 每个文档或 图像(每盘64 MB),BMP/DOC/DOCX/JPEG/JPG/PDF/PNG/TIF/TIFF和常见的视频类型.
- 附上文件的两种方式.
attachments工具调用中包含基数64:精细 对于一个小文件,但是在主机部署中,每个字节的运行在一个请求中(mcp-host) 封口为~9.9 MiB),模型必须作为文本发出. 对于任何更大的, 一个电话 照片,扫描的 PDF 电话mah_upload_slots({files:[{filename}]})(仅主办),PUT每个文件到其签名uploadUrl(每个插槽都装有准备)curl然后通过 已返回blobKeys改为mah_reply_message两种类型一起计算 门户的限制,通过相同的检查. - 文件受其字节的约束. 预览会读取每个文件 — base64 已解码
严格地说,短程有效载荷被拒绝,而不是送去腐败;读取blob
从上传商店回来——确认书将每个文件的SHA-256绑定. 一个小块
预览被拒绝后在商店中替换(
DRAFT_CHANGED) (中文(简体) ). 没什么 发送批准前上传到门户网站. - 上传的拷贝仅在回复发送后被删除. 答复失败,或
可能出去了,留着,所以一样
blobKeys可以在插槽之前重试 过期。 报告发送后失败的删除uploadStore.notDeleted, (中文(简体) ), 从不是一种失败——商店的保留地收回它. - 附件需要无桥模式. 获取代理中继请求正文作为文本, 而文本 二进制上传无法幸存,所以通过浏览器桥接一个与 任何附件在上传前都会被拒绝 .
- 寄信者从不复试. 如果会话在确认之间重新校正 故你当坚忍地和派遣地,不要派遣任何物。一个新的迹象供记帐人使用 回答会跟他们一样 如果传送门对发送的回答无法读取,则 结果是回答 可能 已发送——在再次尝试之前检查线索.
- 如果成功,它会返回新消息
wmgId财务报告和审定财务报表deliveryInstantISO时 读取线程回(发送本身只返回线程 id).
发展
npm install
npm test # typecheck + vitest
npm run build
许可证
麻省理工学院