simplepractice-mcp 0.4.0 → 0.4.1

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.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "SimplePractice Client Portal tools for Claude",
9
- "version": "0.4.0"
9
+ "version": "0.4.1"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "simplepractice",
14
14
  "source": "./",
15
15
  "description": "Read a SimplePractice Client Portal — appointments, invoices and superbills, documents to sign, and practice announcements. Signs in with the portal's own passwordless emailed link; requests go straight to the portal's JSON:API over your own session.",
16
- "version": "0.4.0",
16
+ "version": "0.4.1",
17
17
  "author": {
18
18
  "name": "Chris Chall",
19
19
  "url": "https://github.com/chrischall"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simplepractice",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "SimplePractice Client Portal — appointments, billing, documents, and announcements",
5
5
  "author": {
6
6
  "name": "Chris Chall",
package/dist/bundle.js CHANGED
@@ -31600,7 +31600,7 @@ function toolAnnotations(opts = {}) {
31600
31600
  }
31601
31601
 
31602
31602
  // src/version.ts
31603
- var VERSION = "0.4.0";
31603
+ var VERSION = "0.4.1";
31604
31604
 
31605
31605
  // node_modules/@chrischall/mcp-utils/dist/session/index.js
31606
31606
  import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, renameSync, unlinkSync } from "node:fs";
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.0'; // x-release-please-version
5
+ export const VERSION = '0.4.1'; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simplepractice-mcp",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
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)",
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.0",
9
+ "version": "0.4.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "simplepractice-mcp",
14
- "version": "0.4.0",
14
+ "version": "0.4.1",
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