@chrischall/therapyportal-mcp 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +36 -0
- package/.claude-plugin/plugin.json +23 -0
- package/.mcp.json +14 -0
- package/LICENSE +21 -0
- package/README.md +108 -2
- package/dist/bundle.js +71713 -0
- package/mint.yaml +122 -0
- package/package.json +62 -4
- package/server.json +84 -0
- package/skills/therapyportal-fpx/SKILL.md +77 -0
- package/skills/therapyportal-fpx/references/endpoints.md +77 -0
- package/skills/therapyportal-fpx/scripts/therapyportal +153 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "therapyportal-mcp",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "Chris Hall",
|
|
6
|
+
"email": "chris.c.hall@gmail.com"
|
|
7
|
+
},
|
|
8
|
+
"metadata": {
|
|
9
|
+
"description": "MCP server for TherapyNotes client portals (TherapyPortal) — read appointments, paperwork, forms, balances, receipts and secure messages, and download completed documents and receipts. Signs in server-side with the portal password, or relays requests through the user's signed-in browser tab via the ContextMint Bridge extension.",
|
|
10
|
+
"version": "0.1.0"
|
|
11
|
+
},
|
|
12
|
+
"plugins": [
|
|
13
|
+
{
|
|
14
|
+
"name": "therapyportal-mcp",
|
|
15
|
+
"displayName": "TherapyPortal",
|
|
16
|
+
"source": "./",
|
|
17
|
+
"description": "Read a TherapyNotes client portal (TherapyPortal) — upcoming appointments, paperwork, practice forms, balances, receipts and secure messages, plus document and receipt downloads. Signs in server-side or relays through the user's signed-in browser tab.",
|
|
18
|
+
"version": "0.1.0",
|
|
19
|
+
"author": {
|
|
20
|
+
"name": "Chris Hall"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/chrischall/therapyportal-mcp",
|
|
23
|
+
"repository": "https://github.com/chrischall/therapyportal-mcp",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"keywords": [
|
|
26
|
+
"therapyportal",
|
|
27
|
+
"therapynotes",
|
|
28
|
+
"patient-portal",
|
|
29
|
+
"behavioral-health",
|
|
30
|
+
"therapy",
|
|
31
|
+
"fetchproxy"
|
|
32
|
+
],
|
|
33
|
+
"category": "productivity"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "therapyportal-mcp",
|
|
3
|
+
"displayName": "TherapyPortal",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Read a TherapyNotes client portal (TherapyPortal) — upcoming appointments, paperwork, practice forms, balances, receipts and secure messages, plus document and receipt downloads.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Chris Hall",
|
|
8
|
+
"email": "chris.c.hall@gmail.com"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/chrischall/therapyportal-mcp",
|
|
11
|
+
"repository": "https://github.com/chrischall/therapyportal-mcp",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"therapyportal",
|
|
15
|
+
"therapynotes",
|
|
16
|
+
"patient-portal",
|
|
17
|
+
"behavioral-health",
|
|
18
|
+
"therapy",
|
|
19
|
+
"mcp"
|
|
20
|
+
],
|
|
21
|
+
"skills": "./skills/",
|
|
22
|
+
"mcpServers": "./.mcp.json"
|
|
23
|
+
}
|
package/.mcp.json
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Chris Hall
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,109 @@
|
|
|
1
|
-
#
|
|
1
|
+
# therapyportal-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
MCP server for **TherapyPortal**, the client portal of TherapyNotes
|
|
4
|
+
(`https://www.therapyportal.com/p/<practice>/`). It reads upcoming therapy
|
|
5
|
+
appointments, paperwork the practice sent, the practice's standing forms,
|
|
6
|
+
balances due, payment receipts and secure messages, and downloads completed
|
|
7
|
+
documents and receipts as PDFs.
|
|
8
|
+
|
|
9
|
+
> This project was developed and is maintained by AI. Use at your own discretion.
|
|
10
|
+
> It reads mental-health records, and only ever from the signed-in user's own account.
|
|
11
|
+
|
|
12
|
+
## Read-only
|
|
13
|
+
|
|
14
|
+
Every tool is a read. It sends no message, signs no form, uploads nothing and
|
|
15
|
+
makes no payment. A download is logged by the practice, the same way the
|
|
16
|
+
portal logs the click.
|
|
17
|
+
|
|
18
|
+
On the privacy side, `therapyportal_list_clients` returns names and date of
|
|
19
|
+
birth only. The portal's client record also carries the address, phones,
|
|
20
|
+
email, an SSN field, billing notes and free-text comments, and none of those
|
|
21
|
+
are ever passed through, on any `view`.
|
|
22
|
+
|
|
23
|
+
## Tools
|
|
24
|
+
|
|
25
|
+
| Tool | What it returns |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `therapyportal_list_clients` | the clients linked to this login (for a parent, each child), with the `patientId` other tools take |
|
|
28
|
+
| `therapyportal_list_appointments` | upcoming appointments: time, clinician, telehealth or location, which client; pending requests; practice phone. The portal shows **no past visits** |
|
|
29
|
+
| `therapyportal_list_documents` | paperwork requests (`pending` / `completed` / `all`) and their documents, with `portalDocumentId` |
|
|
30
|
+
| `therapyportal_list_forms` | the practice's always-available forms (sign or upload as needed) |
|
|
31
|
+
| `therapyportal_get_document_counts` | per client, documents waiting to be completed or approved |
|
|
32
|
+
| `therapyportal_list_balances` | the balance due per client, and whether autopay is on |
|
|
33
|
+
| `therapyportal_list_receipts` | payments, with the dates of service each covered, and `paymentId` |
|
|
34
|
+
| `therapyportal_list_message_threads` | one client's secure-message conversations (does not mark read) |
|
|
35
|
+
| `therapyportal_get_thread_messages` | the messages in one conversation (does not mark read) |
|
|
36
|
+
| `therapyportal_download_document` | a completed form (rendered to PDF) or a file the practice uploaded |
|
|
37
|
+
| `therapyportal_download_receipt` | a payment receipt PDF |
|
|
38
|
+
| `therapyportal_healthcheck` | connectivity, from whichever transport is live |
|
|
39
|
+
|
|
40
|
+
Read tools take `view`. The default is `compact` (projected to the useful
|
|
41
|
+
fields); `full` and `raw` return more. Text the practice wrote (document
|
|
42
|
+
titles, instructions, messages) comes back inside an untrusted-content
|
|
43
|
+
envelope.
|
|
44
|
+
|
|
45
|
+
**Message tools are not verified against real messages.** The account this was
|
|
46
|
+
built against had none, so these two return the portal's payload exactly as
|
|
47
|
+
sent rather than a projection.
|
|
48
|
+
|
|
49
|
+
## Transports
|
|
50
|
+
|
|
51
|
+
| | Server (default when credentials are set) | Browser bridge |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| How | signs in itself with your email and password; holds a cookie jar in memory | relays every request through your signed-in Chrome tab via the ContextMint Bridge extension |
|
|
54
|
+
| Needs | `THERAPYPORTAL_EMAIL`, `THERAPYPORTAL_PASSWORD` (and `THERAPYPORTAL_DOB` if the portal asks) | the extension, and a signed-in portal tab |
|
|
55
|
+
| Hostable (claude.ai, phone) | yes | only as a bridged registration |
|
|
56
|
+
| Downloads | written to `THERAPYPORTAL_OUTPUT_DIR`, or inline | saved by the browser to its download folder |
|
|
57
|
+
|
|
58
|
+
The two can run side by side. A server-side sign-in does **not** end your
|
|
59
|
+
browser's portal session (checked live), and the portal signs out an idle
|
|
60
|
+
browser tab on its own after a while; that is the usual reason the bridge
|
|
61
|
+
reports "not signed in".
|
|
62
|
+
|
|
63
|
+
A rejected password or date of birth is **never retried**. The date-of-birth
|
|
64
|
+
check locks after a few wrong dates, so the server tries it once.
|
|
65
|
+
|
|
66
|
+
## Configuration
|
|
67
|
+
|
|
68
|
+
| Variable | |
|
|
69
|
+
|---|---|
|
|
70
|
+
| `THERAPYPORTAL_PRACTICE` | **required.** The code after `/p/` in your portal URL (a full URL also works) |
|
|
71
|
+
| `THERAPYPORTAL_EMAIL` | the email you sign in with |
|
|
72
|
+
| `THERAPYPORTAL_PASSWORD` | your portal password |
|
|
73
|
+
| `THERAPYPORTAL_DOB` | only if the portal asks for a date of birth at sign-in: `MM/DD/YYYY` (`M/D/YYYY` and `YYYY-MM-DD` are accepted) |
|
|
74
|
+
| `THERAPYPORTAL_TRANSPORT` | `server` or `fetchproxy`. Default: `server` when email and password are set |
|
|
75
|
+
| `THERAPYPORTAL_WS_PORT` | fetchproxy concentrator port, default `37149` (shared by the whole fleet) |
|
|
76
|
+
| `THERAPYPORTAL_OUTPUT_DIR` | where downloads are written (path-delimiter list; `~` expands). Default `~/Downloads` and `~/Documents`; a per-call `dest` must be inside one |
|
|
77
|
+
| `THERAPYPORTAL_INLINE_DOWNLOADS` | `true` returns downloads inline (base64), for a hosted runner |
|
|
78
|
+
| `FETCHPROXY_WS_HOST`, `FETCHPROXY_IDENTITY_DIR` | fetchproxy bind address and identity directory (advanced) |
|
|
79
|
+
|
|
80
|
+
Copy `.env.example` to `.env` for a local install.
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"mcpServers": {
|
|
85
|
+
"therapyportal": {
|
|
86
|
+
"command": "npx",
|
|
87
|
+
"args": ["-y", "@chrischall/therapyportal-mcp"],
|
|
88
|
+
"env": { "THERAPYPORTAL_PRACTICE": "<code>" }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Without the server
|
|
95
|
+
|
|
96
|
+
`skills/therapyportal-fpx` does the same reads from a shell with the `fpx` CLI,
|
|
97
|
+
through the signed-in tab. See its `SKILL.md`.
|
|
98
|
+
|
|
99
|
+
## Development
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
npm install
|
|
103
|
+
npm run build
|
|
104
|
+
npm test # typecheck + vitest, all mocked
|
|
105
|
+
npm run test:coverage # 100% threshold
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The wire protocol (tokens, sign-in, download jobs) is in
|
|
109
|
+
[`docs/THERAPYPORTAL-API.md`](docs/THERAPYPORTAL-API.md).
|