Practice Better MCP by usefulapi
Read Practice Better clients, sessions, availability, services, packages, invoices and forms.
我该使用它吗
质量与安全性
发现(3)
- LOW在 practice_better_list_practitioners 中
- LOW在 practice_better_get_availability 中
- LOW在 practice_better_list_form_requests 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"practice-better": {
"url": "https://practice-better.usefulapi.io/mcp"
}
}
}远程端点
https://practice-better.usefulapi.io/mcpstreamable-http它能做什么
工具清单
工具(15)
🟢practice_better_get_account
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.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_practitioners
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.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_clients(status, has_account, child_records, modified_after, modified_before, ...)
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.
输入模式
{
"type": "object",
"properties": {
"status": {
"description": "Only these statuses. pendingcreate = prospective client, created = added client.",
"minItems": 1,
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"enum": [
"pendingcreate",
"created"
]
}
},
"has_account": {
"description": "true = only clients with an active Practice Better user account.",
"type": "boolean"
},
"child_records": {
"description": "true = only sub-records (dependants), false = only primary records.",
"type": "boolean"
},
"modified_after": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z."
},
"modified_before": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z."
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_find_clients(query, status, max_results)
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.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 2,
"maxLength": 100,
"description": "Text to look for in first name, last name, preferred name or email."
},
"status": {
"description": "Only these statuses.",
"minItems": 1,
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"enum": [
"pendingcreate",
"created"
]
}
},
"max_results": {
"description": "Most matches to return, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_get_client(record_id)
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}.
输入模式
{
"type": "object",
"properties": {
"record_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Client record id."
}
},
"required": [
"record_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_sessions(date_after, date_before, practitioner_ids, record_ids, service_ids, ...)
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.
输入模式
{
"type": "object",
"properties": {
"date_after": {
"description": "Sessions on or after this date-time (ISO 8601 with timezone).",
"type": "string"
},
"date_before": {
"description": "Sessions on or before this date-time (ISO 8601 with timezone).",
"type": "string"
},
"practitioner_ids": {
"description": "Only sessions of these practitioners (ids from practice_better_list_practitioners).",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practice Better id."
}
},
"record_ids": {
"description": "Only sessions of these client records.",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practice Better id."
}
},
"service_ids": {
"description": "Only sessions of these services (ids from practice_better_list_services).",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practice Better id."
}
},
"group": {
"description": "true = only group sessions, false = only 1-1 sessions.",
"type": "boolean"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_get_session(session_id, record_id)
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}.
输入模式
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Session id."
},
"record_id": {
"description": "Group sessions only: the client record id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"session_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_get_availability(practitioner_id, service_id, day, type, location_id, ...)
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.
输入模式
{
"type": "object",
"properties": {
"practitioner_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practitioner id (practice_better_list_practitioners)."
},
"service_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Service id (practice_better_list_services)."
},
"day": {
"type": "string",
"description": "The day to start from, ISO 8601 date-time with timezone, e.g. 2026-10-12T00:00:00Z."
},
"type": {
"description": "Session type: face (in person), phone or virtual.",
"type": "string",
"enum": [
"face",
"phone",
"virtual"
]
},
"location_id": {
"description": "Only slots at this location.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"package_id": {
"description": "Only slots usable with this client package.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"practitioner_id",
"service_id",
"day"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_services(team_for, limit, before_id, after_id)
List the services (appointment types) the practice offers: id, name, duration, group or 1-1, session types and SKU. GET /consultant/services.
输入模式
{
"type": "object",
"properties": {
"team_for": {
"description": "Whose items: self (default), all (all team members) or other (team members except you).",
"type": "string",
"enum": [
"self",
"all",
"other"
]
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_packages(limit, before_id, after_id)
List the package definitions (bundles of sessions or programs) the practice sells: id, name and SKU. GET /consultant/packages.
输入模式
{
"type": "object",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_tags(limit, before_id, after_id)
List the tags the practice uses to organize clients: id and name. A client record carries tag ids. GET /tags.
输入模式
{
"type": "object",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_invoices(payment_status, invoice_date_after, invoice_date_before, practitioner_ids, record_ids, ...)
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.
输入模式
{
"type": "object",
"properties": {
"payment_status": {
"description": "Only invoices with these payment statuses.",
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"unpaid",
"partial",
"paid"
]
}
},
"invoice_date_after": {
"description": "Invoice date on or after this date-time.",
"type": "string"
},
"invoice_date_before": {
"description": "Invoice date on or before this date-time.",
"type": "string"
},
"practitioner_ids": {
"description": "Only invoices of these practitioners.",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practice Better id."
}
},
"record_ids": {
"description": "Only invoices of these client records.",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practice Better id."
}
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_get_invoice(invoice_id)
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}.
输入模式
{
"type": "object",
"properties": {
"invoice_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Invoice id."
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_forms(team_for, limit, before_id, after_id)
List the form templates of the practice (intake forms, questionnaires, consent forms): id and name only. GET /consultant/forms.
输入模式
{
"type": "object",
"properties": {
"team_for": {
"description": "Whose items: self (default), all (all team members) or other (team members except you).",
"type": "string",
"enum": [
"self",
"all",
"other"
]
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢practice_better_list_form_requests(completed, created_after, created_before, practitioner_ids, record_ids, ...)
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.
输入模式
{
"type": "object",
"properties": {
"completed": {
"description": "true = only completed requests, false = only incomplete ones.",
"type": "boolean"
},
"created_after": {
"description": "Created on or after this date-time.",
"type": "string"
},
"created_before": {
"description": "Created on or before this date-time.",
"type": "string"
},
"practitioner_ids": {
"description": "Only requests of these practitioners.",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practice Better id."
}
},
"record_ids": {
"description": "Only requests for these client records.",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Practice Better id."
}
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"before_id": {
"description": "Cursor: pass next_page.before_id of the previous reply to get the next page (lists are newest first).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"after_id": {
"description": "Cursor for lists in ascending order: return items after this id. Normally use before_id.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社区
证据