Practice Better MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.3.3 · published by io.usefulapi
Read Practice Better clients, sessions, availability, services, packages, invoices and forms.
15 tools: 1 change things and 14 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things1Claude Code: ask: see these tools
- Only reads14Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http practice-better https://practice-better.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "practice_better_get_availability" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "practice_better_get_availability" says "get": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
15 tools
Changes things 1Claude Code: ask
practice_better_get_availabilityOpen booking slots of one practitioner for one service, starting on the given day: start, end and duration of each slot.1 finding
Why it is in this group
- The name "practice_better_get_availability" says "get": a word for reading.
- The description's first verb is "open": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "practice_better_get_availability" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "practice_better_get_availability" says "get": a word for reading.
Description, as the server wrote it Open booking slots of one practitioner for one service, starting on the given day: start, end and duration of each slot. It follows the practitioner's booking settings. Needs a practitioner id and a service id. GET /consultant/availability/slots.
Annotations the server declares
- title: Get available time slots
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
Only reads 14Claude Code: allow
practice_better_find_clientsSearch client records by name, preferred name or email (case-insensitive text match).No findings
Why it is in this group
- The name "practice_better_find_clients" says "find": a word for reading.
Description, as the server wrote it Search client records by name, preferred name or email (case-insensitive text match). Practice Better has no search endpoint, so this reads the 500 most recent records (5 pages of 100) and filters them; `complete` says whether every record was checked. Returns at most `max_results` matches with the same fields as practice_better_list_clients. GET /consultant/records.
Annotations the server declares
- title: Find clients
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_get_accountThe practitioner (API user) behind this connection: id, name, title, timezone, default currency, role flags and the practice (company) id and name.No findings
Why it is in this group
- The name "practice_better_get_account" says "get": a word for reading.
Description, as the server wrote it The practitioner (API user) behind this connection: id, name, title, timezone, default currency, role flags and the practice (company) id and name. Settings, integrations and the bio are not returned. GET /consultant/profile.
Annotations the server declares
- title: Get my account
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_get_clientOne client record by id: status, name, preferred name, pronouns, email, phones, timezone, activity dates and tag ids.No findings
Why it is in this group
- The name "practice_better_get_client" says "get": a word for reading.
Description, as the server wrote it One client record by id: status, name, preferred name, pronouns, email, phones, timezone, activity dates and tag ids. Date of birth, address, insurance, emergency contacts, notes and health history are not returned. GET /consultant/records/{recordId}.
Annotations the server declares
- title: Get client
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_get_invoiceOne invoice by id with its line items (date, quantity, amount, tax) and totals.No findings
Why it is in this group
- The name "practice_better_get_invoice" says "get": a word for reading.
Description, as the server wrote it One invoice by id with its line items (date, quantity, amount, tax) and totals. Descriptions, payment history and billing contact are not returned. GET /consultant/payments/invoices/{invoiceId}.
Annotations the server declares
- title: Get invoice
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_get_sessionOne session (appointment) by id: date, duration, service, practitioner, client (id and name), location and status.No findings
Why it is in this group
- The name "practice_better_get_session" says "get": a word for reading.
Description, as the server wrote it One session (appointment) by id: date, duration, service, practitioner, client (id and name), location and status. Booking notes and session notes are not returned. For a group session pass record_id to see one client's view. GET /consultant/sessions/{sessionId}.
Annotations the server declares
- title: Get session
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_clientsList client records, newest first: id, status, name, email, phone, timezone and activity dates.No findings
Why it is in this group
- The name "practice_better_list_clients" says "list": a word for reading.
Description, as the server wrote it List client records, newest first: id, status, name, email, phone, timezone and activity dates. Date of birth, address, insurance and notes are not returned. A page holds at most 100 records. To look up one person by name or email use practice_better_find_clients. GET /consultant/records.
Annotations the server declares
- title: List clients
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_form_requestsList forms sent to clients, newest first: which form, which client (id), practitioner, and whether it was started or completed, with dates.No findings
Why it is in this group
- The name "practice_better_list_form_requests" says "list": a word for reading.
Description, as the server wrote it List forms sent to clients, newest first: which form, which client (id), practitioner, and whether it was started or completed, with dates. The answers are never returned. GET /consultant/formrequests.
Annotations the server declares
- title: List form requests
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_formsList the form templates of the practice (intake forms, questionnaires, consent forms): id and name only.No findings
Why it is in this group
- The name "practice_better_list_forms" says "list": a word for reading.
Description, as the server wrote it List the form templates of the practice (intake forms, questionnaires, consent forms): id and name only. GET /consultant/forms.
Annotations the server declares
- title: List forms
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_invoicesList client invoices, newest first: number, date, totals, amount due and paid, payment status, client (id and name) and practitioner.No findings
Why it is in this group
- The name "practice_better_list_invoices" says "list": a word for reading.
Description, as the server wrote it List client invoices, newest first: number, date, totals, amount due and paid, payment status, client (id and name) and practitioner. Payment history and line items are not in the list; use practice_better_get_invoice. GET /consultant/payments/invoices.
Annotations the server declares
- title: List invoices
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_packagesList the package definitions (bundles of sessions or programs) the practice sells: id, name and SKU.No findings
Why it is in this group
- The name "practice_better_list_packages" says "list": a word for reading.
Description, as the server wrote it List the package definitions (bundles of sessions or programs) the practice sells: id, name and SKU. GET /consultant/packages.
Annotations the server declares
- title: List packages
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_practitionersList the practitioners and admin users of the practice, with id, name, role flags and activation status.No findings
Why it is in this group
- The name "practice_better_list_practitioners" says "list": a word for reading.
Description, as the server wrote it List the practitioners and admin users of the practice, with id, name, role flags and activation status. Use the ids to filter sessions and invoices. GET /company/administration/members.
Annotations the server declares
- title: List practitioners
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_servicesList the services (appointment types) the practice offers: id, name, duration, group or 1-1, session types and SKU.No findings
Why it is in this group
- The name "practice_better_list_services" says "list": a word for reading.
Description, as the server wrote it List the services (appointment types) the practice offers: id, name, duration, group or 1-1, session types and SKU. GET /consultant/services.
Annotations the server declares
- title: List services
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_sessionsList sessions (appointments), newest first: date, duration, service, practitioner, client (id and name), status and payment status.No findings
Why it is in this group
- The name "practice_better_list_sessions" says "list": a word for reading.
Description, as the server wrote it List sessions (appointments), newest first: date, duration, service, practitioner, client (id and name), status and payment status. Booking notes and session notes are not returned. Filter by date range, practitioner, client record, service or group/1-1. GET /consultant/sessions.
Annotations the server declares
- title: List sessions
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
practice_better_list_tagsList the tags the practice uses to organize clients: id and name.No findings
Why it is in this group
- The name "practice_better_list_tags" says "list": a word for reading.
Description, as the server wrote it List the tags the practice uses to organize clients: id and name. A client record carries tag ids. GET /tags.
Annotations the server declares
- title: List tags
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.3.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http practice-better https://practice-better.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__practice-better__practice_better_get_account",
"mcp__practice-better__practice_better_list_practitioners",
"mcp__practice-better__practice_better_list_clients",
"mcp__practice-better__practice_better_find_clients",
"mcp__practice-better__practice_better_get_client",
"mcp__practice-better__practice_better_list_sessions",
"mcp__practice-better__practice_better_get_session",
"mcp__practice-better__practice_better_list_services",
"mcp__practice-better__practice_better_list_packages",
"mcp__practice-better__practice_better_list_tags",
"mcp__practice-better__practice_better_list_invoices",
"mcp__practice-better__practice_better_get_invoice",
"mcp__practice-better__practice_better_list_forms",
"mcp__practice-better__practice_better_list_form_requests"
],
"ask": [
"mcp__practice-better__practice_better_get_availability"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as practice-better. Review it before you use it.