{"id":"c9e93948-8b3b-41d7-a459-54e427555698","entityType":"agent","slug":"clawhub-chrischall-simplepractice","name":"simplepractice","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-simplepractice","canonicalPath":"/agent/clawhub-chrischall-simplepractice","generatedAt":"2026-10-11T10:46:45.446Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T08:27:29.413Z","emptyReason":null},"description":"Read a SimplePractice Client Portal through the simplepractice-mcp server — upcoming appointments, invoices/statements/superbills/receipts, balance and saved cards, paperwork waiting to be signed, and practice announcements. Use when the user asks about their therapy or healthcare appointments, what they owe a practice, a superbill for insurance, or forms their provider has sent them.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:simplepractice","sourceUrl":"https://clawhub.ai/chrischall/simplepractice","homepage":"https://clawhub.ai/chrischall/skills/simplepractice","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/simplepractice","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/simplepractice","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"simplepractice technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T08:27:29.413Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T08:27:29.413Z","emptyReason":null},"stars":null,"forks":null,"downloads":1112,"packageName":null,"latestVersion":"1.2.6","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T08:27:29.354Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T08:27:29.413Z","lastCrawledAt":"2026-10-11T08:27:29.354Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T08:27:29.354Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.6","createdAt":"2026-10-09T23:31:00.276Z","changelog":"Version 1.2.6 - Updated SKILL.md with new details and minor clarifications. - Added explanation that `simplepractice_sign_out` only forgets the session locally (does not revoke it on the SimplePractice side). - Clarified confirmation logic for `simplepractice_request_sign_in_link`, noting the `MCP_CONFIRM_ELICITATION=off` environment variable. - Noted that document requests, documents, and announcements return only the newest `pageSize` rows and counts are limited to that page. - Removed the skill-card.md file.","fileCount":3,"zipByteSize":5552},{"version":"1.2.5","createdAt":"2026-10-07T13:38:47.460Z","changelog":"- Removed the file skill-card.md. - No changes to functionality or features; documentation and code remain unchanged.","fileCount":3,"zipByteSize":5226},{"version":"1.2.4","createdAt":"2026-10-05T02:52:29.010Z","changelog":"- Removed the file skill-card.md. - No user-facing functionality or API changes in this version.","fileCount":3,"zipByteSize":5280},{"version":"1.2.3","createdAt":"2026-10-03T01:42:07.077Z","changelog":"- Removed the skill-card.md file. - No changes to functionality or external behavior. - Documentation and user instructions remain unchanged.","fileCount":3,"zipByteSize":5253},{"version":"1.2.2","createdAt":"2026-09-30T17:02:21.702Z","changelog":"- Removed the file: skill-card.md - No functional or user-facing changes; documentation and functionality remain the same.","fileCount":3,"zipByteSize":5397},{"version":"1.2.1","createdAt":"2026-09-25T15:55:25.056Z","changelog":"- Removed the \"skill-card.md\" file. - No functional or user-facing changes to the skill's behavior. - Documentation for the skill remains unchanged.","fileCount":3,"zipByteSize":5314},{"version":"1.2.0","createdAt":"2026-09-24T15:13:19.894Z","changelog":"- Updated sign-in flow instructions: `simplepractice_request_sign_in_link` now supports a confirmation step with a `confirmToken` for clients that cannot show prompts, improving rate-limit safety and user experience. - Clarified confirmation logic in sign-in: first call returns a preview and token, with email only sent after explicit user approval. - Removed the `skill-card.md` file, consolidating documentation. - Minor improvements and clarifications to signing in steps and confirmation requirements in SKILL.md.","fileCount":3,"zipByteSize":5275},{"version":"1.1.4","createdAt":"2026-09-23T21:43:01.914Z","changelog":"- Removed the file skill-card.md. - No changes to functionality or features; documentation remains as before. - No impact on users; this is a documentation file removal only.","fileCount":3,"zipByteSize":5410}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:simplepractice","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:simplepractice` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/chrischall/simplepractice before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T10:46:45.443Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-simplepractice/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T08:27:29.413Z","emptyReason":null},"readme":"Skill: simplepractice\n\nOwner: chrischall\n\nSummary: Read a SimplePractice Client Portal through the simplepractice-mcp server — upcoming appointments, invoices/statements/superbills/receipts, balance and saved cards, paperwork waiting to be signed, and practice announcements. Use when the user asks about their therapy or healthcare appointments, what they owe a practice, a superbill for insurance, or forms their provider has sent them.\n\nTags: latest:1.2.6\n\nVersion history:\n\nv1.2.6 | 2026-10-09T23:31:00.276Z | auto\n\nVersion 1.2.6\n\n- Updated SKILL.md with new details and minor clarifications.\n- Added explanation that `simplepractice_sign_out` only forgets the session locally (does not revoke it on the SimplePractice side).\n- Clarified confirmation logic for `simplepractice_request_sign_in_link`, noting the `MCP_CONFIRM_ELICITATION=off` environment variable.\n- Noted that document requests, documents, and announcements return only the newest `pageSize` rows and counts are limited to that page.\n- Removed the skill-card.md file.\n\nv1.2.5 | 2026-10-07T13:38:47.460Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or features; documentation and code remain unchanged.\n\nv1.2.4 | 2026-10-05T02:52:29.010Z | auto\n\n- Removed the file skill-card.md.\n- No user-facing functionality or API changes in this version.\n\nv1.2.3 | 2026-10-03T01:42:07.077Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or external behavior. \n- Documentation and user instructions remain unchanged.\n\nv1.2.2 | 2026-09-30T17:02:21.702Z | auto\n\n- Removed the file: skill-card.md\n- No functional or user-facing changes; documentation and functionality remain the same.\n\nv1.2.1 | 2026-09-25T15:55:25.056Z | auto\n\n- Removed the \"skill-card.md\" file.\n- No functional or user-facing changes to the skill's behavior.\n- Documentation for the skill remains unchanged.\n\nv1.2.0 | 2026-09-24T15:13:19.894Z | auto\n\n- Updated sign-in flow instructions: `simplepractice_request_sign_in_link` now supports a confirmation step with a `confirmToken` for clients that cannot show prompts, improving rate-limit safety and user experience.\n- Clarified confirmation logic in sign-in: first call returns a preview and token, with email only sent after explicit user approval.\n- Removed the `skill-card.md` file, consolidating documentation.\n- Minor improvements and clarifications to signing in steps and confirmation requirements in SKILL.md.\n\nv1.1.4 | 2026-09-23T21:43:01.914Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or features; documentation remains as before.\n- No impact on users; this is a documentation file removal only.\n\nv1.1.3 | 2026-09-23T15:39:54.509Z | auto\n\n- Removed the file skill-card.md to streamline project documentation.\n- No changes to functionality or user experience; this update is documentation cleanup only.\n\nv1.1.2 | 2026-09-21T17:03:14.939Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or documentation within SKILL.md.\n\nv1.1.1 | 2026-09-21T04:12:26.324Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or user experience.\n\nv1.1.0 | 2026-09-20T02:53:17.281Z | auto\n\n- Removed the \"skill-card.md\" file.\n- No changes to functionality; documentation remains the same.\n- This update is a minor cleanup with no impact on user experience.\n\nv1.0.0 | 2026-09-19T11:18:51.208Z | auto\n\n- Removed the file: skill-card.md.\n- No changes to functionality or documentation, aside from the removed file.\n\nv0.4.2 | 2026-09-10T17:52:12.050Z | auto\n\n- Removed the file skill-card.md.\n- No functional or user-facing changes; all core features and documentation are unchanged.\n\nv0.4.1 | 2026-09-05T00:51:34.046Z | auto\n\n- Expanded documentation in SKILL.md to describe the new view parameter for several endpoints, explaining \"compact\" (now default) vs \"full\" response modes and their differences.\n- Added detailed explanation of which endpoints accept view, what \"compact\" means for each, and why some endpoints do not support it.\n- Included parameter details for endpoints in the SKILL.md documentation for increased clarity.\n- Removed the outdated skill-card.md file for a cleaner repository.\n\nv0.4.0 | 2026-09-04T22:21:33.686Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing features or functionality were changed.\n\nv0.3.0 | 2026-09-02T00:17:04.040Z | auto\n\n- Improved sign-in flow: now detects when a sign-in email is already present to avoid unnecessary repeat requests and rate limits.\n- The session status now reports the current practice and its source (link, environment, or session).\n- Clarified that sign-in tokens should be passed as full links, which embed both the token and practice info.\n- Practice configuration is now more flexible—typically no need to pre-set; it is inferred from sign-in links.\n- Removed the deprecated skill-card.md file.\n\nv0.2.0 | 2026-08-25T14:01:04.006Z | auto\n\n- Removed the file skill-card.md. \n- No other functional or documentation changes.\n\nv0.1.0 | 2026-08-24T22:31:56.649Z | auto\n\nInitial public release of the SimplePractice skill.\n\n- Read-only access to SimplePractice Client Portals via the simplepractice-mcp server.\n- Retrieve upcoming appointments, invoices/statements/superbills, balance, saved cards, forms to sign, and practice announcements.\n- Session management: secure, passwordless sign-in flow using emailed one-time links or PINs.\n- Supports multiple client profiles (e.g., parent managing for children).\n- Emphasizes privacy and accurate representation of available portal data.\n\nArchive index:\n\nArchive v1.2.6: 3 files, 5552 bytes\n\nFiles: skill-card.md (1872b), SKILL.md (9467b), _meta.json (133b)\n\nFile v1.2.6:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. A client that can show a prompt gets one\n   (unless the server sets `MCP_CONFIRM_ELICITATION=off`); otherwise the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n`simplepractice_sign_out` only forgets the session stored on this machine. It\ndoes not revoke it: SimplePractice is never told, so the session token stays\nvalid on SimplePractice's side until it expires there, and it does not sign the\nClient Portal out anywhere else. Do not tell the user they are \"signed out of\nSimplePractice\" — say the server forgot its session.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question. It (and\n  `list_documents` / `list_announcements`) reads only the newest `pageSize`\n  rows, max 50: when `hasMore` is `true` the `outstanding` / `unread` counts\n  cover that page only, so do not say nothing is outstanding.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.2.6:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.6\",\n  \"publishedAt\": 1791588660276\n}\n\nFile v1.2.6:skill-card.md\n\n## Description:\n\nHelps users read their SimplePractice Client Portal for appointments, billing, paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nClients and their authorized agents use this skill to check upcoming appointments, balances, invoices, superbills, requested forms, and announcements in a SimplePractice Client Portal.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The connected portal exposes sensitive healthcare and billing information.\n\nMitigation: Connect only with the user's permission and report only the requested person's relevant information.\n\nRisk: A local session may remain available after use, and forgetting it does not revoke the portal session.\n\nMitigation: Use a trusted server, protect access to its session, and do not treat local sign-out as remote revocation.\n\nRisk: A page-limited result or empty portal billing list may be mistaken for a complete account history.\n\nMitigation: Check for additional pages and distinguish missing portal records from a zero balance.\n\n## Reference(s):\n\n- [SimplePractice skill listing](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Summaries of portal records; some lists and counts cover only the newest page.]\n\n## Skill Version(s):\n\n1.2.6 (source: ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.5: 3 files, 5226 bytes\n\nFiles: skill-card.md (1744b), SKILL.md (8804b), _meta.json (133b)\n\nFile v1.2.5:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. Where the client cannot show a prompt, the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.2.5:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.5\",\n  \"publishedAt\": 1791380327460\n}\n\nFile v1.2.5:skill-card.md\n\n## Description:\n\nHelps users read their SimplePractice Client Portal for appointments, billing, paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nClients and their authorized representatives use this skill to check appointments, balances, billing records, paperwork, and announcements in a practice's client portal.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Connected portal access can expose sensitive healthcare and billing information, including records for multiple clients under one login.\n\nMitigation: Confirm whose record is requested, share only necessary details, and sign out when the session should not be reused.\n\nRisk: Repeated sign-in emails may trigger portal rate limits and interrupt access.\n\nMitigation: Check for an existing session or email first, request user confirmation before sending a sign-in link, and avoid repeated requests.\n\n## Reference(s):\n\n- [SimplePractice skill on ClawHub](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Plain text or Markdown]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only portal summaries; compact responses by default for supported reads.]\n\n## Skill Version(s):\n\n1.2.5 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.4: 3 files, 5280 bytes\n\nFiles: skill-card.md (1973b), SKILL.md (8804b), _meta.json (133b)\n\nFile v1.2.4:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. Where the client cannot show a prompt, the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.2.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.4\",\n  \"publishedAt\": 1791168749010\n}\n\nFile v1.2.4:skill-card.md\n\n## Description:\n\nReads a SimplePractice client portal to help users review appointments, billing records, paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nClients and authorized caregivers use this skill to review appointments, billing records, outstanding paperwork, and practice announcements in a SimplePractice client portal.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Portal results can reveal sensitive healthcare and billing information, including records for more than one person on the same login.\n\nMitigation: Confirm whose record is being discussed and share only the requested information with authorized users.\n\nRisk: Requesting sign-in links sends real, rate-limited email and repeated requests can impede access.\n\nMitigation: Check for an existing session or email first, obtain confirmation before sending, and avoid repeated requests.\n\nRisk: An empty portal billing list can be mistaken for a zero balance when a practice bills outside the portal.\n\nMitigation: State only that no billing records appear in the portal; do not infer that nothing is owed.\n\n## Reference(s):\n\n- [SimplePractice skill listing on ClawHub](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Markdown]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Summaries of read-only portal records; may contain sensitive healthcare and billing information.]\n\n## Skill Version(s):\n\n1.2.4 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.3: 3 files, 5253 bytes\n\nFiles: skill-card.md (1805b), SKILL.md (8804b), _meta.json (133b)\n\nFile v1.2.3:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. Where the client cannot show a prompt, the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.2.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.3\",\n  \"publishedAt\": 1790991727077\n}\n\nFile v1.2.3:skill-card.md\n\n## Description:\n\nGuides an agent in reading a user's SimplePractice Client Portal for appointments, billing, paperwork, payment methods, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nClients and authorized representatives use the skill to ask an agent about their portal appointments, balances, insurance superbills, outstanding forms, and announcements. The agent should confirm which client's record is being discussed when a login covers multiple people.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Portal reads can expose sensitive medical, billing, and saved payment information.\n\nMitigation: Use only an account the user is authorized to access, report only the requested information, and sign out when the session should no longer be reused.\n\nRisk: A portal login may cover several clients, including family members.\n\nMitigation: Confirm the intended client before sharing any record.\n\n## Reference(s):\n\n- [SimplePractice skill release on ClawHub](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Markdown or plain-text responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Summarizes authorized portal reads; does not cancel appointments, sign forms, or pay bills.]\n\n## Skill Version(s):\n\n1.2.3 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.2: 3 files, 5397 bytes\n\nFiles: skill-card.md (2120b), SKILL.md (8804b), _meta.json (133b)\n\nFile v1.2.2:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. Where the client cannot show a prompt, the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.2.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.2\",\n  \"publishedAt\": 1790787741702\n}\n\nFile v1.2.2:skill-card.md\n\n## Description:\n\nHelps clients read appointments, billing, paperwork, payment methods, and announcements in their SimplePractice Client Portal.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nClients and their authorized representatives use this skill to check portal appointments, balances, billing records, pending forms, and practice announcements without changing portal records.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: A portal login may cover multiple clients, exposing another family member's sensitive health or billing information.\n\nMitigation: Confirm the intended client record before reporting details, and disclose only information the user requested.\n\nRisk: The saved portal session can remain available after the conversation ends.\n\nMitigation: Sign out when the user no longer wants the portal session available.\n\nRisk: Repeated sign-in link requests may trigger address or IP rate limits.\n\nMitigation: Check the existing session and inbox first; request a new link only with the user's confirmation.\n\nRisk: An empty portal billing list may be mistaken for proof that no payment is owed.\n\nMitigation: Describe only what the portal shows and avoid drawing conclusions about bills issued elsewhere.\n\n## Reference(s):\n\n- [SimplePractice skill on ClawHub](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Plain-language responses or Markdown summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only portal information; detail depends on the signed-in client's records and permissions.]\n\n## Skill Version(s):\n\n1.2.2 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.1: 3 files, 5314 bytes\n\nFiles: skill-card.md (1958b), SKILL.md (8804b), _meta.json (133b)\n\nFile v1.2.1:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. Where the client cannot show a prompt, the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1790351725056\n}\n\nFile v1.2.1:skill-card.md\n\n## Description:\n\nHelps users read their SimplePractice client portal for appointments, billing records, outstanding paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nClients and authorized caregivers use this skill to check upcoming appointments, balances, invoices, superbills, forms, and announcements in a SimplePractice Client Portal. The skill only reads portal information; it does not pay bills, sign forms, or cancel appointments.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Access to sensitive health and billing information may expose private details.\n\nMitigation: Install only if comfortable with this access, confirm the intended client record, and report only what the user requested.\n\nRisk: Emailed sign-in links can grant access to the client portal.\n\nMitigation: Treat sign-in links as sensitive and sign out on shared or untrusted machines.\n\nRisk: Missing portal billing items may be mistaken for no balance owed.\n\nMitigation: Describe absent records as absent from the portal rather than asserting that nothing is owed.\n\n## Reference(s):\n\n- [SimplePractice skill on ClawHub](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Natural-language summaries of client portal records]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only; report only the requested client's relevant records.]\n\n## Skill Version(s):\n\n1.2.1 (source: server-resolved ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.0: 3 files, 5275 bytes\n\nFiles: skill-card.md (1952b), SKILL.md (8804b), _meta.json (133b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. Where the client cannot show a prompt, the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1790262799894\n}\n\nFile v1.2.0:skill-card.md\n\n## Description:\n\nRead a SimplePractice Client Portal through the simplepractice-mcp server for upcoming appointments, billing documents, balances, saved cards, pending paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users who authorize an agent to read their SimplePractice Client Portal can ask about appointments, billing records, balances, saved cards, pending paperwork, and practice announcements. The skill guides read-only portal access and cautions the agent to report only the requested health or billing information.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can expose sensitive health-related, billing, and portal records.\n\nMitigation: Install only when agent access to those records is acceptable, and report only the information the user requested.\n\nRisk: Repeated sign-in email requests can consume portal limits and disrupt access.\n\nMitigation: Check session status first, require explicit approval before sending a one-time sign-in email, and avoid retry loops.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, configuration, guidance]\n\n**Output Format:** [Markdown guidance with tool names, parameters, and concise text responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only portal guidance; compact views are used by default where supported.]\n\n## Skill Version(s):\n\n1.2.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.4: 3 files, 5410 bytes\n\nFiles: skill-card.md (2502b), SKILL.md (8586b), _meta.json (133b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It is\n   confirm-gated because it sends a real email and the endpoint is rate-limited\n   **per address and per IP** — a retry loop locks the user out of the only\n   auth path there is. Ask before sending, and never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1790199781914\n}\n\nFile v1.1.4:skill-card.md\n\n## Description:\n\nRead a SimplePractice Client Portal through the simplepractice-mcp server for upcoming appointments, invoices, statements, superbills, receipts, balances, saved cards, unsigned paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and their agents use this skill to read their own SimplePractice client portal information, including appointments, billing records, paperwork, announcements, and account context. It is intended for read-only reporting and guidance about portal data, not for paying bills, signing forms, or cancelling appointments.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The connected portal can expose sensitive medical, appointment, billing, paperwork, announcement, and saved-card metadata.\n\nMitigation: Use it only for the user's own portal access, report only the information requested, confirm the correct client record when one login covers multiple people, and sign out when the retained session is no longer needed.\n\nRisk: Requesting repeated sign-in emails can consume rate limits and interfere with the user's only authentication path.\n\nMitigation: Check session status first, use an existing email link when available, ask before sending a sign-in link, and avoid retry loops.\n\nRisk: Portal data can be misread as broader billing or appointment authority.\n\nMitigation: Treat empty portal billing lists as portal-only results, do not infer that the user owes nothing, and do not tell the user they can cancel an appointment unless the portal data and practice policy support that.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, guidance]\n\n**Output Format:** [Markdown or plain text guidance with SimplePractice portal tool names and result interpretation notes.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Outputs may summarize sensitive medical, appointment, billing, paperwork, announcement, and saved-card metadata returned by the connected portal tools.]\n\n## Skill Version(s):\n\n1.1.4 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.3: 3 files, 5389 bytes\n\nFiles: skill-card.md (2376b), SKILL.md (8586b), _meta.json (133b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It is\n   confirm-gated because it sends a real email and the endpoint is rate-limited\n   **per address and per IP** — a retry loop locks the user out of the only\n   auth path there is. Ask before sending, and never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1790177994509\n}\n\nFile v1.1.3:skill-card.md\n\n## Description:\n\nRead a SimplePractice Client Portal through the simplepractice-mcp server for appointments, billing documents, balances, saved cards, paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and their agents use this skill to read client-side SimplePractice portal information, including therapy or healthcare appointments, balances, insurance superbills, provider forms, and practice announcements.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can expose sensitive healthcare and billing information from a SimplePractice client portal.\n\nMitigation: Install it only when this access is intended, report only the information requested, and sign out when session retention is no longer wanted.\n\nRisk: A portal login may cover multiple client records, such as family members.\n\nMitigation: Use the account information first and confirm the correct client record before reporting appointments, forms, or billing details.\n\nRisk: Requesting a sign-in link sends a real email and repeated requests can exhaust the only authentication path.\n\nMitigation: Confirm before sending a sign-in email, avoid retry loops, and use an existing email link when the user already has one.\n\nRisk: An empty portal billing list can be misread as proof that no balance exists.\n\nMitigation: State the narrower finding that no matching billing item appears in the portal, and avoid concluding that nothing is owed unless the portal balance supports it.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, guidance]\n\n**Output Format:** [Markdown or text responses summarizing SimplePractice portal records returned by MCP tools]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only portal helper; compact views may summarize or strip media while full views return complete upstream records.]\n\n## Skill Version(s):\n\n1.1.3 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.2: 3 files, 5347 bytes\n\nFiles: skill-card.md (2278b), SKILL.md (8586b), _meta.json (133b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It is\n   confirm-gated because it sends a real email and the endpoint is rate-limited\n   **per address and per IP** — a retry loop locks the user out of the only\n   auth path there is. Ask before sending, and never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n## Reading\n\n- `simplepractice_get_account` — the practice, the current client, and the\n  clients this login covers. **Start here**: one portal login can act for\n  several people (a parent for two children), so confirm *whose* record you\n  are about to report on before you report on it. It also returns the\n  practice's real cancellation policy and the client's feature permissions.\n- `simplepractice_list_appointments(status?, page?, pageSize?, view?)` — `status: \"scheduled\"` for confirmed and\n  upcoming, `\"requested\"` for ones the practice has not confirmed yet.\n- `simplepractice_list_document_requests` — paperwork. `outstandingOnly: true`\n  answers \"is anything waiting for me?\", which is the usual question.\n- `simplepractice_get_billing_overview(view?)` — balance due and per-category counts.\n  Cheaper than listing the billing collections to find out they are empty.\n- `simplepractice_list_billing_items(kind?, before?, pageSize?, view?)` — invoices, statements, **superbills**\n  (the receipt to claim out-of-network insurance), receipts, or account\n  history. Pages by cursor: pass the returned `nextCursor` back as `before`.\n- `simplepractice_list_payment_methods`, `simplepractice_list_documents`,\n  `simplepractice_list_announcements`.\n\n## Response shape (`view`)\n\nFive of the reads take `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault**: `simplepractice_list_appointments`,\n`simplepractice_list_billing_items`, `simplepractice_get_billing_overview`,\n`simplepractice_get_document_request` and\n`simplepractice_list_announcements`.\n\nThat default is the point of the parameter. This rung used to be a\n`compact: false` boolean — opt-in, so a caller had to know the slim shape\nexisted and ask for it. An efficiency that has to be requested is one that\nusually is not, and the caller paying for it is the one least able to know.\n\n**Compact is not one thing here.** One of the tools gets a real field\nprojection; the other four get media stripping and no field projection at all,\nand the difference matters because expecting a named field set from the second\ngroup would be expecting something that was never going to be there.\n\n- **`simplepractice_list_appointments` is projected**, down to\n  `{id, startTime, endTime, service, clinician, location, videoRoomUrl,\n  confirmationStatus, clientConfirmationStatus, isCancellable, fee}`.\n  `clinician` is the first and last name JOINED into one string, and\n  `location` collapses the office record to `\"telehealth\"` or\n  `\"name, city, state\"` — so if you are reaching for `clinician.firstName` or\n  the `office` object, they are on `full` only.\n- **`list_billing_items`, `get_billing_overview`, `get_document_request` and\n  `list_announcements` are media-stripped only.** No field projection is\n  claimed, and that is deliberate rather than unfinished: `billing-items` is\n  one polymorphic collection switched five ways (`invoice`, `statement`,\n  `superbill`, `receipt`, account history), and a field list picked for an\n  invoice would quietly drop half of a superbill. The same is true of\n  `document-requests`, where a consent form, a questionnaire and a Good Faith\n  Estimate are different shapes under one endpoint. What compact takes is the\n  practice logo and the clinician avatars; it touches nothing whose key names\n  an amount, a date, or a document link.\n\nOne consequence worth knowing on announcements: the rung drops media keys,\nnever nulls. `readAt: null` is data — it is what \"unread\" means — so it\nsurvives, and the `unread` count stays reconcilable against the rows beneath\nit.\n\n`view: \"full\"` returns SimplePractice's whole record. There is **no `raw`\nrung**: `full` already IS the untouched upstream payload, so a third value\ncould only alias it. And `view` never reaches SimplePractice — it is\ndestructured off before the request is built, because `client.list` turns\nwhatever it is handed into a JSON:API query string and a stray `view=compact`\nwould arrive as a filter SimplePractice never defined.\n\nThe other ten tools take no `view`, and each has its own reason:\n\n- **`simplepractice_get_account`, `simplepractice_list_document_requests` and\n  `simplepractice_list_payment_methods` are ALREADY hand-written\n  projections** — every field on them was picked by name with knowledge of the\n  payload. There is no un-projected shape left underneath, so a `view` there\n  would be a parameter that changes nothing, and running a blind rung over that\n  output would let an un-grounded rule overrule a grounded one.\n  (`list_document_requests` also takes `includeBody`, a field the caller\n  explicitly asked for; a blind rung could only take back something chosen on\n  purpose.)\n- **`simplepractice_list_documents` is the exception worth stating**: its\n  PRODUCT is the file references. A practice that shares a scan shares it as a\n  `.jpg` or `.png`, and the blind rung drops any string whose path ends in an\n  image extension — so compacting here would not shrink the answer, it would\n  empty exactly the rows you came for.\n- **`simplepractice_session_status` and `simplepractice_healthcheck`** answer\n  with status, not records.\n- **`simplepractice_request_sign_in_link`, `simplepractice_verify_sign_in_pin`,\n  `simplepractice_verify_sign_in_token` and `simplepractice_sign_out`** are\n  writes. A write's response is a receipt, with nothing to strip and everything\n  to keep.\n\n## Reading the results honestly\n\n- **An empty billing list is a real answer.** Plenty of practices invoice\n  entirely outside the portal. \"No invoices in the portal\" is the true\n  statement; \"you owe nothing\" is not one you can make from it.\n- **Do not tell someone they can cancel an appointment.** `isCancellable` and\n  the practice's `clientMayCancelAppointments` / `cancellationNoticeHours`\n  are what govern it, and cancelling has to happen in the portal anyway.\n- **This is medical information.** Report what was asked. Don't volunteer\n  diagnoses, session notes, or a family member's records into a conversation\n  that wasn't about them.\n\n## The shell alternative\n\n`simplepractice-fpx` does the same reads with `curl` and no server, for\nscripts or a machine without the MCP installed.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1790010194939\n}\n\nFile v1.1.2:skill-card.md\n\n## Description:\n\nRead a SimplePractice Client Portal through the simplepractice-mcp server for upcoming appointments, billing records, balance and saved cards, paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and their agents use this skill to read SimplePractice client-portal information such as therapy or healthcare appointments, billing documents, forms, saved payment-method summaries, and practice announcements.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can expose sensitive healthcare, billing, document, and limited payment-method information from a SimplePractice client portal.\n\nMitigation: Use it only when the user intends that access, confirm whose record is being discussed when a login covers multiple clients, and report only the information requested.\n\nRisk: Repeated sign-in link requests can trigger rate limits and disrupt the user's only authentication path.\n\nMitigation: Check session status first, ask before sending a sign-in email, and avoid duplicate requests or retry loops.\n\nRisk: Portal data can be misunderstood, such as treating an empty invoice list as proof that nothing is owed or implying an appointment can be cancelled through the skill.\n\nMitigation: State only what the portal data supports, distinguish missing portal records from absence of debt, and direct cancellation actions to the portal or practice policy.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, guidance]\n\n**Output Format:** [Markdown or plain text guidance for using SimplePractice portal tools and reporting results]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only portal access; compact and full response views are available for selected read tools.]\n\n## Skill Version(s):\n\n1.1.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: simplepractice Owner: chrischall Summary: Read a SimplePractice Client Portal through the simplepractice-mcp server — upcoming appointments, invoices/statements/superbills/receipts, balance and saved cards, paperwork waiting to be signed, and practice announcements. Use when the user asks about their therapy or healthcare appointments, what they owe a practice, a superbill for insurance, or forms their provide","codeSnippets":[],"executableExamples":[],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: simplepractice\ndescription: >-\n  Read a SimplePractice Client Portal through the simplepractice-mcp server —\n  upcoming appointments, invoices/statements/superbills/receipts, balance and\n  saved cards, paperwork waiting to be signed, and practice announcements.\n  Use when the user asks about their therapy or healthcare appointments,\n  what they owe a practice, a superbill for insurance, or forms their\n  provider has sent them.\n---\n\n# SimplePractice Client Portal\n\n`simplepractice-mcp` reads the Client Portal a practice gives its clients —\nthe patient side, not the clinician side. It is **read-only**: nothing here\ncancels an appointment, signs a form, or pays a bill.\n\n## Signing in\n\nThe portal has **no password**. SimplePractice emails a one-time link (or a\n6-digit PIN), and that is the only way in.\n\n1. `simplepractice_session_status` — check first; a session persists between\n   runs, so most of the time there is nothing to do. It also reports which\n   practice is in play, and whether that came from a link, the environment, or\n   the saved session.\n2. If the user already has the email, skip straight to step 4 — asking for a\n   second link when one is in their inbox spends a rate limit for nothing.\n3. `simplepractice_request_sign_in_link` with the user's portal email. It asks\n   for confirmation because it sends a real email and the endpoint is\n   rate-limited **per address and per IP** — a retry loop locks the user out of\n   the only auth path there is. A client that can show a prompt gets one\n   (unless the server sets `MCP_CONFIRM_ELICITATION=off`); otherwise the\n   first call sends nothing and returns a preview plus a `confirmToken`: show\n   the user the preview, and only after they approve call again with the same\n   arguments and that `confirmToken`. Never send twice. If the server\n   does not know the practice yet, pass `practice` (the slug, host, or portal\n   URL) — otherwise it has no portal to ask.\n4. The user opens the email and gives you the link. Pass it **whole** to\n   `simplepractice_verify_sign_in_token` — it takes the token out of the\n   fragment *and* the practice out of the host, which is why the whole link is\n   worth more than the token alone. Tokens are single-use and last 24 hours.\n\nNothing has to be configured: the practice comes from the link, and the stored\nsession remembers it. `SIMPLEPRACTICE_PRACTICE` only pins the server to one\npractice. Two link shapes name no practice and need one already known — the\nmobile variant on the bare `clientsecure.me` apex, and a bare token pasted\nwithout its link.\n\nThere is no refresh token. When a session lapses the tools say to sign in\nagain; that means another email.\n\n`simplepractice_sign_out` only forgets the session stored on this machine. It\ndoes not revoke it: SimplePractice is never told, so the session token stays\nvalid on SimplePractice's side until it expires there, and it does not sign the\nClient Portal out anywhere else. Do not tell the user they are \"signed out of\nSi"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"simplepractice\",\n  \"version\": \"1.2.6\",\n  \"publishedAt\": 1791588660276\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps users read their SimplePractice Client Portal for appointments, billing, paperwork, and practice announcements.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nClients and their authorized agents use this skill to check upcoming appointments, balances, invoices, superbills, requested forms, and announcements in a SimplePractice Client Portal.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The connected portal exposes sensitive healthcare and billing information.\n\nMitigation: Connect only with the user's permission and report only the requested person's relevant information.\n\nRisk: A local session may remain available after use, and forgetting it does not revoke the portal session.\n\nMitigation: Use a trusted server, protect access to its session, and do not treat local sign-out as remote revocation.\n\nRisk: A page-limited result or empty portal billing list may be mistaken for a complete account history.\n\nMitigation: Check for additional pages and distinguish missing portal records from a zero balance.\n\n## Reference(s):\n\n- [SimplePractice skill listing](https://clawhub.ai/chrischall/skills/simplepractice)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Summaries of portal records; some lists and counts cover only the newest page.]\n\n## Skill Version(s):\n\n1.2.6 (source: ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1377,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T08:27:29.413Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T08:27:29.413Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:46:45.446Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}