{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.chrischall/therapyportal-mcp","description":"TherapyNotes client portal: appointments, documents, billing, messages; confirm-gated sends, uploads","repository":{"url":"https://github.com/chrischall/therapyportal-mcp","source":"github"},"version":"0.2.0","packages":[{"registryType":"npm","identifier":"@chrischall/therapyportal-mcp","version":"0.2.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your practice's portal code: the part after /p/ in its TherapyPortal URL (www.therapyportal.com/p/<code>/).","isRequired":true,"format":"string","name":"THERAPYPORTAL_PRACTICE"},{"description":"The email you sign in to TherapyPortal with. Set with the password to sign in server-side; leave both empty to relay through your signed-in browser tab.","format":"string","name":"THERAPYPORTAL_EMAIL"},{"description":"Your TherapyPortal password. A rejected sign-in is never retried automatically.","format":"string","isSecret":true,"name":"THERAPYPORTAL_PASSWORD"},{"description":"Only if the portal asks for a date of birth at sign-in: that date, as MM/DD/YYYY. Tried once; never retried, because the portal limits attempts.","format":"string","isSecret":true,"name":"THERAPYPORTAL_DOB"},{"description":"server or fetchproxy. Default: server when email and password are both set, otherwise fetchproxy.","format":"string","name":"THERAPYPORTAL_TRANSPORT"},{"description":"fetchproxy concentrator port (fetchproxy transport only, default 37149). The whole fleet shares this one port; override only when hosting.","format":"string","name":"THERAPYPORTAL_WS_PORT"},{"description":"Where downloaded files are written on the server transport (a path-delimiter list; ~ expands). Default ~/Downloads and ~/Documents. A per-call dest must resolve inside one of these.","format":"string","name":"THERAPYPORTAL_OUTPUT_DIR"},{"description":"true returns downloaded bytes inline (base64) instead of writing to disk, for a hosted runner whose disk you cannot reach. Default false.","format":"string","name":"THERAPYPORTAL_INLINE_DOWNLOADS"},{"description":"Folders an upload's file_path must be inside (a path-delimiter list; ~ expands). Default ~/Downloads, ~/Documents and ~/Desktop; $MCP_DATA_DIR/uploads when hosted.","format":"string","name":"THERAPYPORTAL_UPLOAD_DIR"},{"description":"Confirm-gate mode for every write (secure messages, document uploads). ask-user (default) returns a preview + confirmToken and needs a second call with that token; auto lets a capable host confirm in one step; an unrecognised value fails closed (refuse).","format":"string","name":"MCP_CONFIRM_MODE"},{"description":"on (default) lets the host confirm a write interactively; off forces the confirmToken round-trip.","format":"string","name":"MCP_CONFIRM_ELICITATION"},{"description":"Bind interface for the fetchproxy concentrator, a literal IP only (default 127.0.0.1). Keep on loopback; it exists for hosted deployments that run each MCP in its own network namespace.","format":"string","name":"FETCHPROXY_WS_HOST"},{"description":"Absolute path where the fetchproxy long-term identity keypair is stored (default ~/.fetchproxy/identity/).","format":"string","name":"FETCHPROXY_IDENTITY_DIR"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-10-29T21:43:22.505811Z","publishedAt":"2026-10-29T21:43:22.505811Z","updatedAt":"2026-10-29T21:43:22.505811Z","isLatest":true}}}
