simplepractice-mcp 0.4.0 → 0.4.2
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 +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/bundle.js +6716 -2314
- package/dist/version.js +1 -1
- package/package.json +6 -6
- package/server.json +2 -2
- package/skills/simplepractice/SKILL.md +74 -3
package/dist/version.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Single source of truth for the server version. release-please rewrites the
|
|
3
3
|
* literal below; every other file imports VERSION rather than repeating it.
|
|
4
4
|
*/
|
|
5
|
-
export const VERSION = '0.4.
|
|
5
|
+
export const VERSION = '0.4.2'; // x-release-please-version
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simplepractice-mcp",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"mcpName": "io.github.chrischall/simplepractice-mcp",
|
|
6
6
|
"description": "SimplePractice Client Portal MCP server for Claude — developed and maintained by AI (Claude Code)",
|
|
@@ -34,17 +34,17 @@
|
|
|
34
34
|
"test:watch": "vitest"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@chrischall/mcp-utils": "^0.
|
|
38
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
37
|
+
"@chrischall/mcp-utils": "^0.26.1",
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
39
39
|
"dotenv": "^17.4.2",
|
|
40
|
-
"zod": "^4.4
|
|
40
|
+
"zod": "^4.5.4"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^26.0.0",
|
|
44
|
-
"@vitest/coverage-v8": "^
|
|
44
|
+
"@vitest/coverage-v8": "^5.0.0",
|
|
45
45
|
"esbuild": "^0.28.0",
|
|
46
46
|
"typescript": "^7.0.2",
|
|
47
|
-
"vitest": "^
|
|
47
|
+
"vitest": "^5.0.0",
|
|
48
48
|
"yaml": "^2.9.0"
|
|
49
49
|
}
|
|
50
50
|
}
|
package/server.json
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/chrischall/simplepractice-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.4.
|
|
9
|
+
"version": "0.4.2",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "simplepractice-mcp",
|
|
14
|
-
"version": "0.4.
|
|
14
|
+
"version": "0.4.2",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
|
@@ -53,18 +53,89 @@ again; that means another email.
|
|
|
53
53
|
several people (a parent for two children), so confirm *whose* record you
|
|
54
54
|
are about to report on before you report on it. It also returns the
|
|
55
55
|
practice's real cancellation policy and the client's feature permissions.
|
|
56
|
-
- `simplepractice_list_appointments` — `status: "scheduled"` for confirmed and
|
|
56
|
+
- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: "scheduled"` for confirmed and
|
|
57
57
|
upcoming, `"requested"` for ones the practice has not confirmed yet.
|
|
58
58
|
- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`
|
|
59
59
|
answers "is anything waiting for me?", which is the usual question.
|
|
60
|
-
- `simplepractice_get_billing_overview` — balance due and per-category counts.
|
|
60
|
+
- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.
|
|
61
61
|
Cheaper than listing the billing collections to find out they are empty.
|
|
62
|
-
- `simplepractice_list_billing_items` — invoices, statements, **superbills**
|
|
62
|
+
- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**
|
|
63
63
|
(the receipt to claim out-of-network insurance), receipts, or account
|
|
64
64
|
history. Pages by cursor: pass the returned `nextCursor` back as `before`.
|
|
65
65
|
- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,
|
|
66
66
|
`simplepractice_list_announcements`.
|
|
67
67
|
|
|
68
|
+
## Response shape (`view`)
|
|
69
|
+
|
|
70
|
+
Five of the reads take `view: "compact" | "full"`, and **`compact` is the
|
|
71
|
+
default**: `simplepractice_list_appointments`,
|
|
72
|
+
`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,
|
|
73
|
+
`simplepractice_get_document_request` and
|
|
74
|
+
`simplepractice_list_announcements`.
|
|
75
|
+
|
|
76
|
+
That default is the point of the parameter. This rung used to be a
|
|
77
|
+
`compact: false` boolean — opt-in, so a caller had to know the slim shape
|
|
78
|
+
existed and ask for it. An efficiency that has to be requested is one that
|
|
79
|
+
usually is not, and the caller paying for it is the one least able to know.
|
|
80
|
+
|
|
81
|
+
**Compact is not one thing here.** One of the tools gets a real field
|
|
82
|
+
projection; the other four get media stripping and no field projection at all,
|
|
83
|
+
and the difference matters because expecting a named field set from the second
|
|
84
|
+
group would be expecting something that was never going to be there.
|
|
85
|
+
|
|
86
|
+
- **`simplepractice_list_appointments` is projected**, down to
|
|
87
|
+
`{id, startTime, endTime, service, clinician, location, videoRoomUrl,
|
|
88
|
+
confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.
|
|
89
|
+
`clinician` is the first and last name JOINED into one string, and
|
|
90
|
+
`location` collapses the office record to `"telehealth"` or
|
|
91
|
+
`"name, city, state"` — so if you are reaching for `clinician.firstName` or
|
|
92
|
+
the `office` object, they are on `full` only.
|
|
93
|
+
- **`list_billing_items`, `get_billing_overview`, `get_document_request` and
|
|
94
|
+
`list_announcements` are media-stripped only.** No field projection is
|
|
95
|
+
claimed, and that is deliberate rather than unfinished: `billing-items` is
|
|
96
|
+
one polymorphic collection switched five ways (`invoice`, `statement`,
|
|
97
|
+
`superbill`, `receipt`, account history), and a field list picked for an
|
|
98
|
+
invoice would quietly drop half of a superbill. The same is true of
|
|
99
|
+
`document-requests`, where a consent form, a questionnaire and a Good Faith
|
|
100
|
+
Estimate are different shapes under one endpoint. What compact takes is the
|
|
101
|
+
practice logo and the clinician avatars; it touches nothing whose key names
|
|
102
|
+
an amount, a date, or a document link.
|
|
103
|
+
|
|
104
|
+
One consequence worth knowing on announcements: the rung drops media keys,
|
|
105
|
+
never nulls. `readAt: null` is data — it is what "unread" means — so it
|
|
106
|
+
survives, and the `unread` count stays reconcilable against the rows beneath
|
|
107
|
+
it.
|
|
108
|
+
|
|
109
|
+
`view: "full"` returns SimplePractice's whole record. There is **no `raw`
|
|
110
|
+
rung**: `full` already IS the untouched upstream payload, so a third value
|
|
111
|
+
could only alias it. And `view` never reaches SimplePractice — it is
|
|
112
|
+
destructured off before the request is built, because `client.list` turns
|
|
113
|
+
whatever it is handed into a JSON:API query string and a stray `view=compact`
|
|
114
|
+
would arrive as a filter SimplePractice never defined.
|
|
115
|
+
|
|
116
|
+
The other ten tools take no `view`, and each has its own reason:
|
|
117
|
+
|
|
118
|
+
- **`simplepractice_get_account`, `simplepractice_list_document_requests` and
|
|
119
|
+
`simplepractice_list_payment_methods` are ALREADY hand-written
|
|
120
|
+
projections** — every field on them was picked by name with knowledge of the
|
|
121
|
+
payload. There is no un-projected shape left underneath, so a `view` there
|
|
122
|
+
would be a parameter that changes nothing, and running a blind rung over that
|
|
123
|
+
output would let an un-grounded rule overrule a grounded one.
|
|
124
|
+
(`list_document_requests` also takes `includeBody`, a field the caller
|
|
125
|
+
explicitly asked for; a blind rung could only take back something chosen on
|
|
126
|
+
purpose.)
|
|
127
|
+
- **`simplepractice_list_documents` is the exception worth stating**: its
|
|
128
|
+
PRODUCT is the file references. A practice that shares a scan shares it as a
|
|
129
|
+
`.jpg` or `.png`, and the blind rung drops any string whose path ends in an
|
|
130
|
+
image extension — so compacting here would not shrink the answer, it would
|
|
131
|
+
empty exactly the rows you came for.
|
|
132
|
+
- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer
|
|
133
|
+
with status, not records.
|
|
134
|
+
- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,
|
|
135
|
+
`simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are
|
|
136
|
+
writes. A write's response is a receipt, with nothing to strip and everything
|
|
137
|
+
to keep.
|
|
138
|
+
|
|
68
139
|
## Reading the results honestly
|
|
69
140
|
|
|
70
141
|
- **An empty billing list is a real answer.** Plenty of practices invoice
|