simplepractice-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SIMPLEPRACTICE_PRACTICE | Yes | Portal slug or host (required) | |
| SIMPLEPRACTICE_SESSION_FILE | No | Session path (default ~/.simplepractice-mcp/session.json) | ~/.simplepractice-mcp/session.json |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| simplepractice_session_statusA | Report whether this server holds a Client Portal session, for which practice, and how that practice was determined (from a sign-in link, from SIMPLEPRACTICE_PRACTICE, or remembered from the stored session). Reads local state only — makes no network call. |
| simplepractice_request_sign_in_linkA | Ask SimplePractice to email a sign-in link to a Client Portal address. The portal has no password — this is how you sign in. Sends a real email and is rate-limited per email address AND per IP, so it requires confirm:true. A success does not prove the address has an account: the API answers identically for unknown addresses by design. |
| simplepractice_verify_sign_in_tokenA | Exchange an emailed sign-in link (or the token in it) for a Client Portal session. Accepts the whole link or just the part after the "#". Prefer passing the WHOLE link: its address names the practice, so no practice has to be configured, and this server remembers it afterwards. Tokens are single-use and last 24 hours. |
| simplepractice_verify_sign_in_pinA | Exchange a 6-digit Client Portal sign-in PIN for a session, for practices that email a code instead of a link. Single-use. |
| simplepractice_sign_outA | Discard the stored Client Portal session from local state. |
| simplepractice_get_accountA | The practice, the signed-in client, and every client this login can see. One portal login is a "client access" and may cover more than one client — a parent seeing two children, say — so clients is always a list. |
| simplepractice_list_appointmentsA | Appointments from the Client Portal. status "scheduled" returns confirmed/upcoming ones; "requested" returns those still awaiting the practice's confirmation. Pages by number. |
| simplepractice_list_billing_itemsA | Invoices, statements, superbills, receipts, or account history from the Client Portal. An empty list is a real answer — many practices bill entirely outside the portal. Pages by cursor: pass the returned nextCursor as "before". |
| simplepractice_get_billing_overviewA | Balance due and per-category counts for the Client Portal account. Cheaper than paging the billing collections just to find out whether anything is there. |
| simplepractice_list_payment_methodsA | Payment methods saved to the Client Portal — brand, last four digits, and expiry. No full card numbers. |
| simplepractice_list_document_requestsA | Paperwork the practice has sent — consents, questionnaires, contact and insurance forms, Good Faith Estimates, shared files. Use outstandingOnly to see just what still needs the client's attention. |
| simplepractice_get_document_requestA | One document request in full, including its body or its questions and the answers already given. |
| simplepractice_list_documentsC | Files the practice has shared through the Client Portal. |
| simplepractice_list_announcementsB | Announcements the practice has posted to the Client Portal. readAt is null on unread ones. |
| simplepractice_healthcheckA | Resolves the credential the way real tools do, then makes one authenticated request to clientsecure.me. Reports which source supplied the credential, whether clientsecure.me accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a clientsecure.me-side problem'. Read-only; never returns the credential itself. Call this when a real tool fails and you want to know which hop broke. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 15 tools
Each tool targets a distinct resource or step: collection reads use list_*, single-item reads use get_*, auth tools are separated by link versus PIN, and session_status/healthcheck are clearly local versus network diagnostics. Descriptions draw clear lines between similar-sounding pairs like document_requests versus documents and billing_overview versus billing_items.
The simplepractice_ prefix and snake_case are used throughout, and most tools follow a verb_noun pattern such as list_appointments, get_account, or verify_sign_in_token. Minor deviations are session_status and healthcheck, which are noun-style names rather than verb-first actions.
Fifteen tools sits at the upper end of the well-scoped range, but every tool has a distinct job: three auth tools, three session/diagnostic helpers, and focused list/get tools for each Client Portal resource. No tool appears redundant or purely decorative.
The read-side is broad: account, appointments, billing, payment methods, document requests, documents, and announcements are all represented. However, the server is almost entirely read-only; there is no way to submit answers to a document request, make a payment, add a payment method, or otherwise complete a client action, leaving important portal workflows as dead ends.