# @chrischall/myatriumhealth-mcp 中文文档

规范地址：https://npmcn.com/package/%40chrischall/myatriumhealth-mcp/

版本：1\.5\.1
npm 元数据更新时间：2026-11-07T12:05:23.507Z
中文译文更新时间：2026-11-09T23:07:56.015Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40chrischall/myatriumhealth-mcp
原文对照：https://npmcn.com/package/%40chrischall/myatriumhealth-mcp/?lang=original
项目主页：https://github.com/chrischall/myatriumhealth-mcp#readme
源码仓库：https://github.com/chrischall/myatriumhealth-mcp

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：3.2 MB，12 个文件
- 模块格式：ES Module
- TypeScript 类型：未声明
- 运行依赖：6 个
- 首次发布：2026-09-03T20:05:06.935Z
- 最新版本发布：2026-11-07T12:05:23.232Z
- 近 30 天下载量：1699（2026-10-10 至 2026-11-08，npm 官方下载统计）
- 已发布版本数：29（近 12 个月 29 个）

## 中文简介

MyAtrium Health的MCP服务器(Atrium Health's Epic MyChart patient portal)通过取回proxy浏览器桥.

## 安装

```sh
npm install @chrischall/myatriumhealth-mcp
```

也可以使用：`pnpm add @chrischall/myatriumhealth-mcp`、`yarn add @chrischall/myatriumhealth-mcp`、`bun add @chrischall/myatriumhealth-mcp`

## README

# 心肌健康-mcp

MCP 服务器 **MyAtrium健康协会** - 原子健康协会 [图片 MyChart](https://www.mychart.com/) 病人门户网站 `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 ,所以会话不能为 复制出浏览器,并从节点重放。 因此,转发请求 通过用户自己的登录标签 [获取代理](https://github.com/chrischall/fetchproxy) 桥和上下文闪烁桥 浏览器扩展名, 重用其认证的会话 . **服务器从不读取或存储 届会饼干.**

该门户网站的网络应用在两代后期与一个JSON API交谈——现代 `POST api/<area>/<Action>` 和遗留格式编码 `POST <Area>/<Controller>/<Action>`。 。 。 . 两者都有记录,有活捉形状,在 [`docs/MYATRIUMHEALTH-API.md`](https://npmcn.com/package/%40chrischall/myatriumhealth-mcp/docs/MYATRIUMHEALTH-API.md)。 。 。 .

## 安装

```jsonc
{
  "mcpServers": {
    "myatriumhealth": {
      "command": "npx",
      "args": ["-y", "@chrischall/myatriumhealth-mcp"]
    }
  }
}
```

桥梁模式需求 **上下文闪烁桥**,从它安装 [页 次](https://github.com/nullnet-app/contextmint-bridge/releases) 在克罗姆, 解开 `chrome` 拉链,然后通过 `chrome://extensions` + 开发者模式 + 装入 解开了 暂时使用 Chrome : Safari 建筑将在 ContexMint app 内运送, 还没有公开下载.

ContextMint Bridge是取回的代理浏览器扩展名, 在其新名称下, 从 相同的维护者——取代碼自有 [读取](https://github.com/chrischall/fetchproxy#extension) 标出. 它的来源是公开的 [无网应用/结晶桥](https://github.com/nullnet-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` **发送消息 一个提供者会看到**,不能撤销:见 [答复](https://npmcn.com/package/%40chrischall/myatriumhealth-mcp/#readme-replying)。 。 。 .

每个读取工具返回 `{ 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`](https://npmcn.com/package/%40chrischall/myatriumhealth-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).

## 发展

```sh
npm install
npm test          # typecheck + vitest
npm run build
```

## 许可证

麻省理工学院

## 常见问题

### @chrischall/myatriumhealth-mcp 是什么？

MyAtrium Health的MCP服务器\(Atrium Health's Epic MyChart patient portal\)通过取回proxy浏览器桥\.

### 如何安装 @chrischall/myatriumhealth-mcp？

在项目目录运行 npm install @chrischall/myatriumhealth-mcp，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 myatriumhealth-mcp，可以用 npx myatriumhealth-mcp 直接运行。

### @chrischall/myatriumhealth-mcp 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/chrischall\_\_myatriumhealth-mcp 是否存在。

### @chrischall/myatriumhealth-mcp 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @chrischall/myatriumhealth-mcp 可以商用吗？

@chrischall/myatriumhealth-mcp 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @chrischall/myatriumhealth-mcp 的下载量有多少？

根据 npm 官方下载统计，@chrischall/myatriumhealth-mcp 在 2026/10/10 – 2026/11/08 这 30 天内被下载 1,699 次，日均约 57 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @chrischall/myatriumhealth-mcp 还在维护吗？

最新版本 1\.5\.1 发布于 2026/11/07（2 天前）；至今共发布 29 个版本，其中过去 12 个月发布了 29 个；首次发布于 2026/09/04。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

