Semble MCP by usefulapi

Read Semble patients, bookings, invoices and products; create patients and tasks, label patients.

Should I use this

Quality & Safety

A
Description quality
89%
Schema completeness
92%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (5)

  • LOWTool 'semble_list_patient_bookings' description lacks action verbin semble_list_patient_bookings
  • LOWTool 'semble_get_booking' description lacks action verbin semble_get_booking
  • LOWTool 'semble_get_user' description lacks action verbin semble_get_user
  • LOWTool 'semble_get_product' description lacks action verbin semble_get_product
  • LOWTool 'semble_get_invoice' description lacks action verbin semble_get_invoice

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,866Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (3.02% of 128k context)

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

What it can do

Tool inventory

Tools (19)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded19 tools