关于 therapyportal-mcp
therapyportal-mcp 是面向 TherapyNotes 客户门户用户的 MCP 服务,可读取预约、表单、账单、收据和安全消息,并下载 PDF。发送消息与上传文件需经确认门控;不签署表单或付款。
主要功能
- 01查看预约、表单和余额
- 02读取安全消息与收据
- 03下载表单和收据 PDF
- 04确认后发送或回复消息
- 05确认后上传所需文件
- 06限制传递的个人信息
适用场景
- 01查看即将到来的治疗预约
- 02检查待完成的门户文件
- 03下载已完成表单或付款收据
- 04向诊所发送消息或上传文件
MCP 相关
作为 MCP 服务,向客户端提供 TherapyPortal 账户的读取、下载及确认门控的消息发送和文件上传工具。支持凭据登录服务端传输,也支持通过已登录 Chrome 标签页的浏览器桥接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @chrischall/therapyportal-mcpTHERAPYPORTAL_PRACTICEYour practice's portal code: the part after /p/ in its TherapyPortal URL (www.therapyportal.com/p/<code>/).THERAPYPORTAL_EMAILThe email you sign in to TherapyPortal with. Set with the password to sign in server-side; leave both empty to relay through your signed-in browser tab.THERAPYPORTAL_PASSWORD密钥Your TherapyPortal password. A rejected sign-in is never retried automatically.THERAPYPORTAL_DOB密钥Only if the portal asks for a date of birth at sign-in: that date, as MM/DD/YYYY. Tried once; never retried, because the portal limits attempts.THERAPYPORTAL_TRANSPORTserver or fetchproxy. Default: server when email and password are both set, otherwise fetchproxy.THERAPYPORTAL_WS_PORTfetchproxy concentrator port (fetchproxy transport only, default 37149). The whole fleet shares this one port; override only when hosting.THERAPYPORTAL_OUTPUT_DIRWhere downloaded files are written on the server transport (a path-delimiter list; ~ expands). Default ~/Downloads and ~/Documents. A per-call dest must resolve inside one of these.THERAPYPORTAL_INLINE_DOWNLOADStrue returns downloaded bytes inline (base64) instead of writing to disk, for a hosted runner whose disk you cannot reach. Default false.THERAPYPORTAL_UPLOAD_DIRFolders an upload's file_path must be inside (a path-delimiter list; ~ expands). Default ~/Downloads, ~/Documents and ~/Desktop. Local installs only: a hosted server refuses file_path and takes uploads by upload slot or inline base64.MCP_CONFIRM_MODEConfirm-gate mode for every write (secure messages, document uploads). ask-user (default) returns a preview + confirmToken and needs a second call with that token; auto lets a capable host confirm in one step; an unrecognised value fails closed (refuse).MCP_CONFIRM_ELICITATIONon (default) lets the host confirm a write interactively; off forces the confirmToken round-trip.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+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
16收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| view | enum | 否 | 响应格式:"compact"(默认)会省略响应中已在其他位置提供的字段;"full" 会返回此服务支持的所有字段。compact 会将每条记录裁剪为调用方要操作的字段;"full" 会保留此服务支持的所有字段。(不支持 "raw":记录在此处组装,而非从某个端点直接传递。)compact | full |
详细介绍
therapyportal-mcp
适用于 TherapyPortal 的 MCP 服务。TherapyPortal 是 TherapyNotes 的客户端门户
(https://www.therapyportal.com/p/<practice>/)。它会读取即将进行的治疗预约、诊所发送的文书、诊所的常驻表格、应付余额、付款收据和安全消息,并将已完成的文档和收据下载为 PDF。它还可以发送安全消息,并在确认门禁后上传文件以响应文档请求。
此项目由 AI 开发并维护。请自行斟酌使用。 它会读取心理健康记录,且始终只读取已登录用户本人账户中的记录。
并非只读
大多数工具用于读取。有三个工具会执行写入操作,每个操作都会发送到诊所,且无法通过此服务撤销:
| 工具 | 发送内容 | 先使用以下工具查询 |
|---|---|---|
therapyportal_send_message | 为一位客户端创建新的安全消息对话,并指定主题 | therapyportal_list_message_topics |
therapyportal_reply_message | 在现有对话中回复(除非设置 mark_thread_read,否则不会更改已读状态) | therapyportal_list_message_threads |
therapyportal_upload_document | 上传本地文件以响应待处理的文档请求,或上传要求上传的常驻表格 | therapyportal_list_documents、therapyportal_list_forms |
以上三个工具均标记为 destructive,并受确认门禁控制(见下文)。此服务不会为任何表格签名、填写表格或进行付款。任何需要签名的事项(PatientSignatureRequired)都会被拒绝,并提示用户前往门户。
诊所会记录下载操作,就像门户会记录点击一样。
在隐私方面,therapyportal_list_clients 只会返回姓名和出生日期。门户中的客户端记录还包含地址、电话号码、电子邮件、SSN 字段、账单备注和自由文本评论;无论通过何种 view,这些信息都绝不会被传递出来。
工具
| 工具 | 返回内容 |
|---|---|
therapyportal_list_clients | 与此登录账号关联的客户端(家长账号会列出每个孩子),并提供其他工具所需的 patientId |
therapyportal_list_appointments | 即将到来的预约:时间、临床医生、远程医疗或地点、对应的客户端;待处理的预约请求;诊所电话。门户不显示 过往就诊记录 |
therapyportal_list_documents | 文书请求(pending / completed / all)及其文档,包含 portalDocumentId,并注明每份文档是否需要上传或签名 |
therapyportal_list_forms | 诊所随时提供的表单(按需签名或上传),包含 libraryDocumentId |
therapyportal_get_document_counts | 每位客户端待完成或待批准的文档数量 |
therapyportal_list_balances | 每位客户端的应付余额,以及是否已开启自动付款 |
therapyportal_list_receipts | 付款记录,包含每笔付款涵盖的服务日期和 paymentId |
therapyportal_list_message_threads | 一位客户端的安全消息对话(不会标记为已读) |
therapyportal_get_thread_messages | 一个对话中的消息(不会标记为已读) |
therapyportal_download_document | 已完成的表单(呈现为 PDF),或诊所上传的文件 |
therapyportal_download_receipt | 付款收据 PDF |
therapyportal_list_message_topics | 客户端可发送消息的话题(包含 topicId,并注明每个话题会发送给临床、账务还是行政人员)、消息功能是否开启,以及客户端是否有指定的临床医生 |
therapyportal_send_message | 写入。 开始新对话(需确认) |
therapyportal_reply_message | 写入。 在对话中回复(需确认) |
therapyportal_upload_document | 写入。 为要求上传文件的文档上传 PDF、JPG、JPEG、PNG、HEIC 或 DOCX(最大 25 MB,需确认) |
therapyportal_healthcheck | 当前可用传输方式的连通性 |
读取工具接受 view。默认值为 compact(仅包含实用字段);full 和 raw 会返回更多内容。诊所撰写的文本(文档标题、说明、消息)会放在不可信内容信封中返回。
消息工具尚未通过真实消息验证。 用于构建此工具的账号没有消息,因此线程和消息读取工具会原样返回门户的负载,而不是投影后的内容。
写入操作
这三项写入操作均根据门户自身的 JavaScript 推导而来
(SecureMessagingDataService、CreateMessageViewV2、ThreadViewV2、
DocumentsDataService、文档视图控制器和 xhrfileuploader),且未在实际传输中验证:没有自动化运行会发送消息或上传文件,因为每项操作都会触达诊所。之后会在所有者监督下进行实时测试,以确认这些操作。它们首先执行的查询(消息设置、主题、指定临床医生检查、文档和表单列表)已通过实时只读验证。
显示预览之前,每项写入操作都会根据实时读取结果进行检查:客户端是你的客户端之一(therapyportal_list_clients)、诊所已启用安全消息功能、该客户端存在此主题;若要上传,还会检查文档或表单是否存在、是否尚未完成、是否要求上传且不需要签名。
- 消息。 纯文本,长度为 1 至 5000 个字符,发送方式与门户编辑器一致(每行对应一个 HTML 段落)。如果有多条消息尚未得到回复,诊所可能会拒绝新消息;拒绝时会说明原因。已归档的对话无法回复。
- 上传。 文件必须位于
THERAPYPORTAL_UPLOAD_DIR(默认为~/Downloads、~/Documents或~/Desktop;托管时为$MCP_DATA_DIR/uploads)中,且必须是普通文件(不能是符号链接),文件内容必须与扩展名相符。拒绝旧版.doc文件(上传前无法检查其格式);请将其另存为 PDF 或.docx。文件会分成 100 KB 的片段暂存,经门户验证后才会提交。只有提交操作会触达诊所。 - 只发送一次。 每项写入操作都会且只会提交一次。重新登录后,无论使用哪种传输方式,都不会重放操作。如果门户以 5xx 响应发送请求,或连接中断,则会报告
status: "unknown",而不是报错;这样模型会先检查对应列表,再决定是否重试,以避免重复发送。
确认门控
每项写入操作都通过 @chrischall/mcp-utils 的 confirmWrite 进行门控,该功能由 defineWrite / registerWrite 调用。首次调用不会发送任何内容,而是返回预览和一个 confirmToken;只有在你批准预览后,第二次调用携带该令牌才会发送。令牌会绑定确切请求(上传时包括文件名、类型、大小和 SHA-256)以及所显示的预览;因此,如果参数、文件或门户状态在预览后发生变化,操作会被拒绝,并返回 DRAFT_CHANGED。每次发送都会变化的值(上传 guid、文档日期)会在发送时生成,不会绑定到令牌。预览或结果中由诊所填写的文本(主题名称、文档标题、返回的对话)会被标记为不可信内容。MCP_CONFIRM_MODE /
MCP_CONFIRM_ELICITATION 可调整此门控(参见 Configuration)。
传输方式
| 服务(设置凭据时的默认方式) | 浏览器桥接 | |
|---|---|---|
| 工作方式 | 使用你的电子邮件和密码自行登录;在内存中保存 Cookie jar | 通过 ContextMint Bridge 扩展,将每个请求转发至你已登录的 Chrome 标签页 |
| 要求 | THERAPYPORTAL_EMAIL、THERAPYPORTAL_PASSWORD(以及门户要求时的 THERAPYPORTAL_DOB) | 扩展,以及一个已登录的门户标签页 |
| 可托管(claude.ai、手机) | 可以 | 仅限桥接注册 |
| 下载 | 写入 THERAPYPORTAL_OUTPUT_DIR,或以内嵌形式返回 | 由浏览器保存到其下载文件夹 |
两种方式可以并行运行。服务端登录不会结束你的浏览器门户会话(已通过实时检查),而门户会在一段时间后自行退出空闲的浏览器标签页;这是桥接报告“not signed in”的常见原因。
密码或出生日期验证失败后,绝不会重试。出生日期检查在输错几次后会锁定,因此服务只会尝试一次。
配置
| 变量 | |
|---|---|
THERAPYPORTAL_PRACTICE | 必填。 门户 URL 中 /p/ 后面的代码(也可填写完整 URL) |
THERAPYPORTAL_EMAIL | 用于登录的邮箱 |
THERAPYPORTAL_PASSWORD | 门户密码 |
THERAPYPORTAL_DOB | 仅当门户在登录时要求提供出生日期时使用:MM/DD/YYYY(也接受 M/D/YYYY 和 YYYY-MM-DD) |
THERAPYPORTAL_TRANSPORT | server 或 fetchproxy。默认值:设置了邮箱和密码时为 server |
THERAPYPORTAL_WS_PORT | fetchproxy 集中器端口,默认值为 37149(整个集群共用) |
THERAPYPORTAL_OUTPUT_DIR | 下载文件的保存位置(以路径分隔符分隔的列表;~ 会展开)。默认值为 ~/Downloads 和 ~/Documents;每次调用的 dest 必须位于其中一个目录内 |
THERAPYPORTAL_INLINE_DOWNLOADS | true 会以内联方式返回下载内容(base64),供托管运行器使用 |
THERAPYPORTAL_UPLOAD_DIR | 上传文件的 file_path 必须位于此处(以路径分隔符分隔的列表;~ 会展开)。默认值为 ~/Downloads、~/Documents 和 ~/Desktop;托管时为 $MCP_DATA_DIR/uploads |
MCP_CONFIRM_MODE | 每次写入操作的确认门控模式。ask-user(默认值)= 预览 + confirmToken 往返;auto 允许具备相应能力的宿主一步确认;无法识别的值会安全拒绝(refuse) |
MCP_CONFIRM_ELICITATION | on(默认值)允许宿主交互式确认写入操作;off 强制执行 confirmToken 往返 |
FETCHPROXY_WS_HOST、FETCHPROXY_IDENTITY_DIR | fetchproxy 绑定地址和身份目录(高级选项) |
本地安装时,将 .env.example 复制为 .env。
{
"mcpServers": {
"therapyportal": {
"command": "npx",
"args": ["-y", "@chrischall/therapyportal-mcp"],
"env": { "THERAPYPORTAL_PRACTICE": "<code>" }
}
}
}
不使用服务端
skills/therapyportal-fpx 可通过已登录的标签页,在 shell 中使用 fpx CLI 执行相同的读取操作(不包括写入操作)。
请参阅其 SKILL.md。
开发
npm install
npm run build
npm test # typecheck + vitest, all mocked
npm run test:coverage # 100% threshold
线路协议(令牌、登录、下载任务、写入结构)见
docs/THERAPYPORTAL-API.md。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。