Semble MCP by usefulapi
Read Semble patients, bookings, invoices and products; create patients and tasks, label patients.
Should I use this
Quality & Safety
Findings (5)
- LOWin semble_list_patient_bookings
- LOWin semble_get_booking
- LOWin semble_get_user
- LOWin semble_get_product
- LOWin semble_get_invoice
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"semble": {
"url": "https://semble.usefulapi.io/mcp"
}
}
}Remote endpoints
https://semble.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (19)
🟢semble_get_practice
The practice the API token belongs to: name, timezone, locations, appointment types and medical specialties. A good first call to check the connection.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_patients(search, page, page_size)
Patients of the practice (personal and health data). `search` matches name, email, phone or date of birth. Returns id, name, date of birth, contact details and status, plus pageInfo.hasMore for the next page.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Free-text search (name, email, phone, date of birth).",
"type": "string",
"maxLength": 200
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_get_patient(id)
One patient by id (personal data): demographics, phones, address, numbers, custom attributes, labels, comments and status. Appointments, invoices and tasks have their own tools.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Patient id (from semble_list_patients)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_patient_bookings(patient_id, start, end, include_deleted, only_cancelled, ...)
The bookings (appointments) of one patient between two dates, with doctor, location, appointment type and status. Both dates are required (YYYY-MM-DD).
Input Schema
{
"type": "object",
"properties": {
"patient_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Patient id."
},
"start": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First day, YYYY-MM-DD (from 00:00 UTC)."
},
"end": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Last day, YYYY-MM-DD (until 23:59 UTC, inclusive)."
},
"include_deleted": {
"description": "Also return cancelled (deleted) bookings next to the active ones (default false).",
"type": "boolean"
},
"only_cancelled": {
"description": "Return ONLY cancelled (deleted) bookings. Takes precedence over include_deleted.",
"type": "boolean"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"patient_id",
"start",
"end"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_bookings(start, end, include_deleted, page, page_size)
Bookings (appointments) of the whole practice. With a date range, a booking is included if it starts or ends inside it. Returns patient, doctor, location, appointment type, status and journey (arrived, consultation, departed, dna).
Input Schema
{
"type": "object",
"properties": {
"start": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First day, YYYY-MM-DD (from 00:00 UTC)."
},
"end": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Last day, YYYY-MM-DD (until 23:59 UTC, inclusive)."
},
"include_deleted": {
"description": "Also return deleted bookings (default false).",
"type": "boolean"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_get_booking(id)
One booking by id, with patient, doctor, location, appointment type, status and journey.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Booking id."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_users(search, clinicians_only, include_deleted, page, page_size)
Staff users of the practice (clinicians and admin): name, email, role, qualifications and specialties. Use the ids for bookings and tasks.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Free-text search.",
"type": "string",
"maxLength": 200
},
"clinicians_only": {
"description": "Only clinicians.",
"type": "boolean"
},
"include_deleted": {
"description": "Also return deleted users (default false).",
"type": "boolean"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_get_user(id)
One staff user by id.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "User id."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_products(search, page, page_size)
The practice's price list: appointment types, services and stock items, with price, cost, duration and stock level. `search` matches the item code or name.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Item code or name.",
"type": "string",
"maxLength": 200
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_get_product(id)
One product, service or appointment type by id.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Product id."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_invoices(start, end, status, paid_or_outstanding, page, ...)
Invoices whose invoice date is inside a date range, with patient, totals and what is outstanding. Filter by status (active or cancelled) and paid_or_outstanding. Monetary amounts are in the practice currency.
Input Schema
{
"type": "object",
"properties": {
"start": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First invoice date, YYYY-MM-DD."
},
"end": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Last invoice date, YYYY-MM-DD."
},
"status": {
"description": "Invoice status.",
"type": "string",
"enum": [
"active",
"cancelled"
]
},
"paid_or_outstanding": {
"description": "Filter by payment state.",
"type": "string",
"enum": [
"Paid",
"Outstanding",
"Void"
]
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_get_invoice(id)
One invoice by id, with its line items, totals and what is outstanding.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Invoice id."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_contacts(search, is_doctor, is_payor, page, page_size)
Contacts of the practice (referring doctors, insurers and other payors). `search` matches name, email, phone, specialty and numbers.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Free-text search.",
"type": "string",
"maxLength": 200
},
"is_doctor": {
"description": "Only doctors.",
"type": "boolean"
},
"is_payor": {
"description": "Only payors.",
"type": "boolean"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_tasks(patient_id, status, priority, task_type, assigned_to, ...)
Practice tasks, filtered by patient, status, priority, type or assignee. Returns subject, due date, priority, assignee and patient.
Input Schema
{
"type": "object",
"properties": {
"patient_id": {
"description": "Only tasks about this patient id.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"status": {
"description": "Task status.",
"type": "string",
"enum": [
"open",
"processing",
"closed"
]
},
"priority": {
"description": "Task priority.",
"type": "string",
"enum": [
"high",
"medium",
"low",
"unset"
]
},
"task_type": {
"description": "Task type.",
"type": "string",
"enum": [
"general",
"recall",
"medical",
"rx",
"lab",
"vaccine",
"admin",
"invoice"
]
},
"assigned_to": {
"description": "Only tasks assigned to this user id.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢semble_list_labels(search, page, page_size)
The labels that can be put on patients (id, title, colour). Use the id with semble_add_patient_label.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Label title.",
"type": "string",
"maxLength": 200
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Rows per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡semble_create_task(subject, assigned_to, patient_id, due_date, priority, ...)
Creates a task in Semble assigned to a staff user (get ids from semble_list_users), optionally about a patient, with a due date, priority and type. Creates a new record each time it is called.
Input Schema
{
"type": "object",
"properties": {
"subject": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "The task text."
},
"assigned_to": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "User id the task is assigned to."
},
"patient_id": {
"description": "Patient the task is about.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"due_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Due date, YYYY-MM-DD."
},
"priority": {
"description": "Priority.",
"type": "string",
"enum": [
"high",
"medium",
"low",
"unset"
]
},
"task_type": {
"description": "Task type.",
"type": "string",
"enum": [
"general",
"recall",
"medical",
"rx",
"lab",
"vaccine",
"admin",
"invoice"
]
},
"comments": {
"description": "Extra notes.",
"type": "string",
"maxLength": 5000
}
},
"required": [
"subject",
"assigned_to"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴semble_update_task(id, status, subject, assigned_to, due_date, ...)
Changes a task: close or reopen it (status), reassign it, move the due date, or edit subject, priority and notes. Only the fields you pass are changed.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Task id (from semble_list_tasks)."
},
"status": {
"description": "New status.",
"type": "string",
"enum": [
"open",
"processing",
"closed"
]
},
"subject": {
"description": "New subject.",
"type": "string",
"minLength": 1,
"maxLength": 500
},
"assigned_to": {
"description": "New assignee user id.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"due_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "New due date, YYYY-MM-DD."
},
"priority": {
"description": "New priority.",
"type": "string",
"enum": [
"high",
"medium",
"low",
"unset"
]
},
"comments": {
"description": "New notes (replace the old).",
"type": "string",
"maxLength": 5000
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡semble_add_patient_label(patient_id, label_id)
Puts an existing label on a patient (label ids from semble_list_labels). Adds only; nothing is removed.
Input Schema
{
"type": "object",
"properties": {
"patient_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Patient id."
},
"label_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Label id (from semble_list_labels)."
}
},
"required": [
"patient_id",
"label_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡semble_create_patient(first_name, last_name, email, dob, sex, ...)
Creates a new patient record (personal data) from the details you give. It does not check for an existing patient: search with semble_list_patients first to avoid a duplicate.
Input Schema
{
"type": "object",
"properties": {
"first_name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "First name."
},
"last_name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Last name."
},
"email": {
"description": "Email address.",
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"dob": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date of birth, YYYY-MM-DD."
},
"sex": {
"description": "Sex as the practice records it.",
"type": "string",
"maxLength": 30
},
"phone_number": {
"description": "Phone number.",
"type": "string",
"maxLength": 40
},
"phone_type": {
"description": "Phone type, for example Mobile.",
"type": "string",
"maxLength": 30
},
"address": {
"description": "Street address.",
"type": "string",
"maxLength": 200
},
"city": {
"description": "City.",
"type": "string",
"maxLength": 100
},
"postcode": {
"description": "Postcode.",
"type": "string",
"maxLength": 20
},
"country": {
"description": "Country.",
"type": "string",
"maxLength": 100
},
"comments": {
"description": "Notes.",
"type": "string",
"maxLength": 5000
}
},
"required": [
"first_name",
"last_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence