@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.
@@ -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
@@ -0,0 +1,14 @@
1
+ {
2
+ "mcpServers": {
3
+ "therapyportal": {
4
+ "command": "npx",
5
+ "args": [
6
+ "-y",
7
+ "@chrischall/therapyportal-mcp"
8
+ ],
9
+ "env": {
10
+ "THERAPYPORTAL_WS_PORT": "37149"
11
+ }
12
+ }
13
+ }
14
+ }
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
- # Temporary Holding Version
1
+ # therapyportal-mcp
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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).