Skip to content

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.

Changes · 1

15 tools: 1 change things and 14 only read.

Scanned Oct 21, 2026

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/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "practice_better_get_availability" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "practice_better_get_availability" says "get": a word for reading.

    What this check looks for

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".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "practice_better_get_availability" says "get": a word for reading.

      What this check looks for
    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/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.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.