Skip to content

splose MCP by usefulapi

io.usefulapi/sploseusefulapi.iostreamable-httpv1.0.0Scanned

Read splose patients, appointments, invoices, cases; book and cancel appointments, record payments.

36 tools: 4 can delete or cancel things, 1 do something that can't be undone, 4 change things and 27 only read.

Tools: 4 delete, 1 irreversible, 4 write, 27 read.
  • Reads private data · 10
  • Reads text others write · 6
  • Can send data out · 2
  • 2 findings

Anlyon alternative

9 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

36 tools

Deletes or cancels 4Claude Code: deny
  • splose_cancel_appointmentWRITE: cancels ONE appointment with a cancellation reason (ids from splose_list_cancellation_reasons) and an optional note.No findings

    Why it is in this group

    • The name "splose_cancel_appointment" says "cancel": a word for removing or ending something.
    • The description says "Cannot be undone".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: cancels ONE appointment with a cancellation reason (ids from splose_list_cancellation_reasons) and an optional note. The reason's billable rate may create a cancellation charge, and the patient may be notified per the practice's settings. For a group appointment pass patient_id to cancel only that patient's place; without it the whole appointment is cancelled. Cannot be undone through this server: confirm with the user first and pass confirm: true. POST /appointments/{id}/cancellation or /appointments/{id}/patients/{patientId}/cancellation.

    Annotations the server declares

    • title: Cancel an appointment
    • destructiveHint: true
  • splose_create_appointmentWRITE: books ONE appointment for one patient with one practitioner, service and location, from start to end (UTC).No findings

    Why it is in this group

    • The name "splose_create_appointment" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: books ONE appointment for one patient with one practitioner, service and location, from start to end (UTC). Splose may send the patient its normal booking confirmation or reminders according to the practice's settings, and the appointment can later be invoiced. Check splose_find_free_slots first. Not idempotent: calling twice books twice. POST /appointments.

    Annotations the server declares

    • title: Create an appointment
    • destructiveHint: true
  • splose_record_paymentWRITE, MONEY: records ONE payment received (cash, card, transfer) against ONE invoice; it moves the invoice towards Paid and is shown in the patient's account.No findings

    Why it is in this group

    • The name "splose_record_payment" says "payment": a word that usually means money moves, which cannot be taken back.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE, MONEY: records ONE payment received (cash, card, transfer) against ONE invoice; it moves the invoice towards Paid and is shown in the patient's account. It does NOT charge anyone's card. amount must not exceed what is owed (check splose_get_invoice). Not idempotent: calling twice records two payments, and this server cannot delete a payment, so confirm the details with the user first and pass confirm: true. Ids come from splose_get_invoice and splose_list_payment_methods. POST /payments.

    Annotations the server declares

    • title: Record a payment against an invoice
    • destructiveHint: true
  • splose_update_appointmentWRITE: changes the time, service, location, practitioner, case or patient of ONE existing appointment; send only the fields to change.No findings

    Why it is in this group

    • The name "splose_update_appointment" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: changes the time, service, location, practitioner, case or patient of ONE existing appointment; send only the fields to change. Splose may notify the patient of a change according to the practice's settings. Same input twice gives the same result. PUT /appointments/{id}.

    Annotations the server declares

    • title: Update (reschedule) an appointment
    • destructiveHint: true
    • idempotentHint: true
Can't be undone 1Claude Code: ask
  • splose_list_paymentsPayments received: payment number, amount, date, patient, location, payment method, the invoices each payment settles and credit allocations.1 finding

    Why it is in this group

    • The name "splose_list_payments" says "list": a word for reading.
    • The description's first verb is "payment": a word that usually means money moves, which cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "splose_list_payments" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true}; The name "splose_list_payments" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Payments received: payment number, amount, date, patient, location, payment method, the invoices each payment settles and credit allocations. GET /payments.

    Annotations the server declares

    • title: List payments
    • readOnlyHint: true
Changes things 4Claude Code: ask
  • splose_create_contactWRITE: adds ONE contact (GP, plan manager, referrer, payer).Can send data outNo findings

    Why it is in this group

    • The name "splose_create_contact" says "create": a word for a change.

    What it can reach

    • outboundThe input takes a destination (input.phoneNumbers): what the tool writes goes there.
    Description, as the server wrote it
    WRITE: adds ONE contact (GP, plan manager, referrer, payer). type, name and email are required (type is Splose's contact type, e.g. Standard; see splose_list_contacts for the values in use). Not idempotent: calling twice creates two contacts. POST /contacts.

    Annotations the server declares

    • title: Create a contact
    • destructiveHint: false
  • splose_create_patientWRITE: adds ONE new patient record (first and last name required).Can send data outNo findings

    Why it is in this group

    • The name "splose_create_patient" says "create": a word for a change.

    What it can reach

    • outboundThe input takes a destination (input.phoneNumbers): what the tool writes goes there.
    Description, as the server wrote it
    WRITE: adds ONE new patient record (first and last name required). Search with splose_list_patients first to avoid a duplicate. Patient messaging follows the practice's settings and communicationPreference. Not idempotent: calling twice creates two patients. HEALTH DATA: only enter what the user supplied. POST /patients.

    Annotations the server declares

    • title: Create a patient
    • destructiveHint: false
  • splose_list_servicesThe service catalogue: name, type, code, duration (minutes), unit (Hour or Each), price, tax type, group size and tags.1 finding

    Why it is in this group

    • The name "splose_list_services" says "list": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

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

      Matched text

      annotations: {"readOnlyHint":true}; The name "splose_list_services" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    The service catalogue: name, type, code, duration (minutes), unit (Hour or Each), price, tax type, group size and tags. GET /services.

    Annotations the server declares

    • title: List services
    • readOnlyHint: true
  • splose_mark_patient_arrivedWRITE: marks the patient of ONE appointment as arrived (check-in).No findings

    Why it is in this group

    • The name "splose_mark_patient_arrived" says "mark": a word for a change.
    Description, as the server wrote it
    WRITE: marks the patient of ONE appointment as arrived (check-in). For a group appointment pass patient_id to mark just that patient. Marking twice has the same effect. POST /appointments/{id}/arrival or /appointments/{id}/patients/{patientId}/arrival.

    Annotations the server declares

    • title: Mark a patient as arrived
    • destructiveHint: false
    • idempotentHint: true
Only reads 27Show 27 read-only tools
  • splose_find_free_slotsBookable free slots for one or more practitioners at a location for one patient service, between from and to (the window is at most 7 days).No findings

    Why it is in this group

    • The name "splose_find_free_slots" says "find": a word for reading.
    Description, as the server wrote it
    Bookable free slots for one or more practitioners at a location for one patient service, between from and to (the window is at most 7 days). Returns, per practitioner, the start/end of each open slot in UTC. Read-only. GET /free-slots.

    Annotations the server declares

    • title: Find free appointment slots
    • readOnlyHint: true
  • splose_get_accountThe organisation and the practitioner who owns the API key, plus the key's expiry date.No findings

    Why it is in this group

    • The name "splose_get_account" says "get": a word for reading.
    Description, as the server wrote it
    The organisation and the practitioner who owns the API key, plus the key's expiry date. Good first call. GET /me.

    Annotations the server declares

    • title: Get the account behind the API key
    • readOnlyHint: true
  • splose_get_appointmentOne appointment in full, with each patient's status, case, invoice and cancellation details.No findings

    Why it is in this group

    • The name "splose_get_appointment" says "get": a word for reading.
    Description, as the server wrote it
    One appointment in full, with each patient's status, case, invoice and cancellation details. GET /appointments/{id}.

    Annotations the server declares

    • title: Get an appointment
    • readOnlyHint: true
  • splose_get_caseOne case in full, with its appointment connections.No findings

    Why it is in this group

    • The name "splose_get_case" says "get": a word for reading.
    Description, as the server wrote it
    One case in full, with its appointment connections. GET /cases/{id}.

    Annotations the server declares

    • title: Get a case
    • readOnlyHint: true
  • splose_get_contactOne contact in full.Reads private dataNo findings

    Why it is in this group

    • The name "splose_get_contact" says "get": a word for reading.

    What it can reach

    • private-dataThe name "splose_get_contact" says "get" and "contact": it reads contacts.
    • private-dataThe description's first sentence says "contact": it reads contacts.
    Description, as the server wrote it
    One contact in full. GET /contacts/{id}.

    Annotations the server declares

    • title: Get a contact
    • readOnlyHint: true
  • splose_get_invoiceOne invoice in full with its line items and payments.No findings

    Why it is in this group

    • The name "splose_get_invoice" says "get": a word for reading.
    Description, as the server wrote it
    One invoice in full with its line items and payments. GET /invoices/{id}.

    Annotations the server declares

    • title: Get an invoice
    • readOnlyHint: true
  • splose_get_locationOne location in full.No findings

    Why it is in this group

    • The name "splose_get_location" says "get": a word for reading.
    Description, as the server wrote it
    One location in full. GET /locations/{id}.

    Annotations the server declares

    • title: Get a location
    • readOnlyHint: true
  • splose_get_patientOne patient in full: contact details, address, NDIS number and plan info, Medicare/health fund, emergency contact, tags and custom fields.Reads private dataNo findings

    Why it is in this group

    • The name "splose_get_patient" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    Description, as the server wrote it
    One patient in full: contact details, address, NDIS number and plan info, Medicare/health fund, emergency contact, tags and custom fields. HEALTH DATA. GET /patients/{id}.

    Annotations the server declares

    • title: Get a patient
    • readOnlyHint: true
  • splose_get_paymentOne payment in full.No findings

    Why it is in this group

    • The name "splose_get_payment" says "get": a word for reading.
    Description, as the server wrote it
    One payment in full. GET /payments/{id}.

    Annotations the server declares

    • title: Get a payment
    • readOnlyHint: true
  • splose_get_practitionerOne practitioner in full, including provider numbers and connections.No findings

    Why it is in this group

    • The name "splose_get_practitioner" says "get": a word for reading.
    Description, as the server wrote it
    One practitioner in full, including provider numbers and connections. GET /practitioners/{id}.

    Annotations the server declares

    • title: Get a practitioner
    • readOnlyHint: true
  • splose_get_practitioner_availabilityA practitioner's working-hours availability per date and location (start/end time, weekly or fortnightly repeat).No findings

    Why it is in this group

    • The name "splose_get_practitioner_availability" says "get": a word for reading.
    Description, as the server wrote it
    A practitioner's working-hours availability per date and location (start/end time, weekly or fortnightly repeat). The window is at most 100 days. This is the roster, not the open slots: use splose_find_free_slots for bookable times. GET /availabilities/{practitionerId}.

    Annotations the server declares

    • title: Get a practitioner's availability
    • readOnlyHint: true
  • splose_get_serviceOne service in full, including provider-travel pricing.No findings

    Why it is in this group

    • The name "splose_get_service" says "get": a word for reading.
    Description, as the server wrote it
    One service in full, including provider-travel pricing. GET /services/{id}.

    Annotations the server declares

    • title: Get a service
    • readOnlyHint: true
  • splose_list_appointmentsAppointments in id order: start/end (UTC), service, location, practitioner, price, note and the per-patient status (Arrived, Did not arrive, Cancelled, Completed, cancellation reas…Reads private dataNo findings

    Why it is in this group

    • The name "splose_list_appointments" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "note": it reads notes.
    Description, as the server wrote it
    Appointments in id order: start/end (UTC), service, location, practitioner, price, note and the per-patient status (Arrived, Did not arrive, Cancelled, Completed, cancellation reason, invoice id). Filter by time window, patient, practitioner or status. GET /appointments.

    Annotations the server declares

    • title: List appointments
    • readOnlyHint: true
  • splose_list_busy_timesBlocked-out time in practitioner calendars (leave, admin time): start/end, location, practitioners, type and note.Reads private dataNo findings

    Why it is in this group

    • The name "splose_list_busy_times" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "calendar": it reads calendars.
    Description, as the server wrote it
    Blocked-out time in practitioner calendars (leave, admin time): start/end, location, practitioners, type and note. GET /busy-times.

    Annotations the server declares

    • title: List busy times
    • readOnlyHint: true
  • splose_list_cancellation_reasonsCancellation reasons with their ids, needed to cancel an appointment.No findings

    Why it is in this group

    • The name "splose_list_cancellation_reasons" says "list": a word for reading.
    Description, as the server wrote it
    Cancellation reasons with their ids, needed to cancel an appointment. GET /cancellation-reasons.

    Annotations the server declares

    • title: List cancellation reasons
    • readOnlyHint: true
  • splose_list_casesCases (funding referrals and plans): case number, budget, hours or appointment allowance, issue and expiry dates, tracking type, open flag and utilisation alert.Reads text others writeNo findings

    Why it is in this group

    • The name "splose_list_cases" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe description's first sentence says "issue": it reads issues, which other people can write.
    Description, as the server wrote it
    Cases (funding referrals and plans): case number, budget, hours or appointment allowance, issue and expiry dates, tracking type, open flag and utilisation alert. HEALTH/FUNDING DATA. GET /cases.

    Annotations the server declares

    • title: List cases
    • readOnlyHint: true
  • splose_list_contactsContacts (GPs, plan managers, referrers, invoice recipients): name, type, email, address, phones and the ids of their patients, invoices and cases.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "splose_list_contacts" says "list": a word for reading.

    What it can reach

    • private-dataThe name "splose_list_contacts" says "list" and "contact": it reads contacts.
    • private-dataThe description's first sentence says "contact": it reads contacts.
    • untrusted-inputThe description's first sentence says "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Contacts (GPs, plan managers, referrers, invoice recipients): name, type, email, address, phones and the ids of their patients, invoices and cases. GET /contacts.

    Annotations the server declares

    • title: List contacts
    • readOnlyHint: true
  • splose_list_credit_notesCredit notes: number, invoice, patient, subtotal, tax, total, sent status, items and allocations.Reads private dataNo findings

    Why it is in this group

    • The name "splose_list_credit_notes" says "list": a word for reading.

    What it can reach

    • private-dataThe name "splose_list_credit_notes" says "list" and "note": it reads notes.
    • private-dataThe description's first sentence says "note": it reads notes.
    Description, as the server wrote it
    Credit notes: number, invoice, patient, subtotal, tax, total, sent status, items and allocations. GET /credit-notes.

    Annotations the server declares

    • title: List credit notes
    • readOnlyHint: true
  • splose_list_custom_fieldsThe custom fields defined for patients: id, name, type (short text, dropdown, date and so on), required flag and options.No findings

    Why it is in this group

    • The name "splose_list_custom_fields" says "list": a word for reading.
    Description, as the server wrote it
    The custom fields defined for patients: id, name, type (short text, dropdown, date and so on), required flag and options. GET /custom-field/.

    Annotations the server declares

    • title: List patient custom fields
    • readOnlyHint: true
  • splose_list_invoicesInvoices: number, issue/due dates, patient, contact, location, practitioner, subtotal, tax, total, paid amount, status (Draft, Awaiting Payment, Paid), line items and payment ids.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "splose_list_invoices" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    • untrusted-inputThe description's first sentence says "issue": it reads issues, which other people can write.
    Description, as the server wrote it
    Invoices: number, issue/due dates, patient, contact, location, practitioner, subtotal, tax, total, paid amount, status (Draft, Awaiting Payment, Paid), line items and payment ids. Use status=Awaiting Payment for what is owed. GET /invoices.

    Annotations the server declares

    • title: List invoices
    • readOnlyHint: true
  • splose_list_locationsPractice locations: title, address, phone, email, timezone, online-booking flag and the ids of the services offered there.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "splose_list_locations" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "email": it reads mail.
    • untrusted-inputThe description's first sentence says "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Practice locations: title, address, phone, email, timezone, online-booking flag and the ids of the services offered there. GET /locations.

    Annotations the server declares

    • title: List locations
    • readOnlyHint: true
  • splose_list_patient_formsForms sent to patients: title, status (Incomplete, In progress, Completed), patient, appointment, template and submission time.No findings

    Why it is in this group

    • The name "splose_list_patient_forms" says "list": a word for reading.
    Description, as the server wrote it
    Forms sent to patients: title, status (Incomplete, In progress, Completed), patient, appointment, template and submission time. The form content is included. GET /patient-forms.

    Annotations the server declares

    • title: List patient forms
    • readOnlyHint: true
  • splose_list_patientsPatients (clients) of the practice, filtered, in id order, as short rows: id, name, email, birthdate, phones, tags, alert, archived.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "splose_list_patients" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "email": it reads mail.
    • untrusted-inputThe description's first sentence says "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Patients (clients) of the practice, filtered, in id order, as short rows: id, name, email, birthdate, phones, tags, alert, archived. Use splose_get_patient for the full record. HEALTH DATA: only look people up when the user asks. GET /patients.

    Annotations the server declares

    • title: List patients
    • readOnlyHint: true
  • splose_list_payment_methodsPayment methods (cash, card, bank transfer and so on) with their ids, needed to record a payment.No findings

    Why it is in this group

    • The name "splose_list_payment_methods" says "list": a word for reading.
    Description, as the server wrote it
    Payment methods (cash, card, bank transfer and so on) with their ids, needed to record a payment. GET /payment-methods.

    Annotations the server declares

    • title: List payment methods
    • readOnlyHint: true
  • splose_list_practitionersPractitioners (staff): name, email, profession, role, active flag, online-booking flag, timezone and their location/service connections.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "splose_list_practitioners" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "email": it reads mail.
    • untrusted-inputThe description's first sentence says "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Practitioners (staff): name, email, profession, role, active flag, online-booking flag, timezone and their location/service connections. GET /practitioners.

    Annotations the server declares

    • title: List practitioners
    • readOnlyHint: true
  • splose_list_support_activitiesNon-appointment billable activities (NDIS support activities): patient, practitioner, service, item code, quantity, price, invoice id.No findings

    Why it is in this group

    • The name "splose_list_support_activities" says "list": a word for reading.
    Description, as the server wrote it
    Non-appointment billable activities (NDIS support activities): patient, practitioner, service, item code, quantity, price, invoice id. GET /support-activities.

    Annotations the server declares

    • title: List support activities
    • readOnlyHint: true
  • splose_list_waitlistWaitlist entries: patient, practitioner, location, wanted services, preferred days and time, tags and active flag.No findings

    Why it is in this group

    • The name "splose_list_waitlist" says "list": a word for reading.
    Description, as the server wrote it
    Waitlist entries: patient, practitioner, location, wanted services, preferred days and time, tags and active flag. GET /waitlists.

    Annotations the server declares

    • title: List waitlist items
    • readOnlyHint: 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.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

120 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 2 outbound tools breaks every one.

Reads text others write6
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out2
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
deny to break every path
{
  "permissions": {
    "deny": [
      "mcp__splose__splose_create_contact",
      "mcp__splose__splose_create_patient"
    ]
  }
}

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

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

    Matched text

    annotations: {"readOnlyHint":true}; The name "splose_list_services" says "list": a word for reading.

    What this check looks for
  • The server marks "splose_list_payments" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true}; The name "splose_list_payments" says "list": a word for reading.

    What this check looks for

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http splose https://splose.usefulapi.io/mcp
claude mcp add --transport http splose https://splose.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

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

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__splose__splose_get_account",
      "mcp__splose__splose_list_patients",
      "mcp__splose__splose_get_patient",
      "mcp__splose__splose_list_appointments",
      "mcp__splose__splose_get_appointment",
      "mcp__splose__splose_list_practitioners",
      "mcp__splose__splose_get_practitioner",
      "mcp__splose__splose_list_locations",
      "mcp__splose__splose_get_location",
      "mcp__splose__splose_get_service",
      "mcp__splose__splose_list_contacts",
      "mcp__splose__splose_get_contact",
      "mcp__splose__splose_list_cases",
      "mcp__splose__splose_get_case",
      "mcp__splose__splose_list_invoices",
      "mcp__splose__splose_get_invoice",
      "mcp__splose__splose_get_payment",
      "mcp__splose__splose_list_payment_methods",
      "mcp__splose__splose_list_credit_notes",
      "mcp__splose__splose_list_waitlist",
      "mcp__splose__splose_list_patient_forms",
      "mcp__splose__splose_list_support_activities",
      "mcp__splose__splose_list_busy_times",
      "mcp__splose__splose_list_cancellation_reasons",
      "mcp__splose__splose_list_custom_fields",
      "mcp__splose__splose_get_practitioner_availability",
      "mcp__splose__splose_find_free_slots"
    ],
    "ask": [
      "mcp__splose__splose_list_services",
      "mcp__splose__splose_list_payments",
      "mcp__splose__splose_mark_patient_arrived",
      "mcp__splose__splose_create_patient",
      "mcp__splose__splose_create_contact"
    ],
    "deny": [
      "mcp__splose__splose_create_appointment",
      "mcp__splose__splose_update_appointment",
      "mcp__splose__splose_cancel_appointment",
      "mcp__splose__splose_record_payment"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as splose. Review it before you use it.

Capability tags behind 13 rules
  • mcp__splose__splose_list_patients private-data, untrusted-input
  • mcp__splose__splose_get_patient private-data
  • mcp__splose__splose_list_appointments private-data
  • mcp__splose__splose_list_practitioners private-data, untrusted-input
  • mcp__splose__splose_list_locations private-data, untrusted-input
  • mcp__splose__splose_list_contacts private-data, untrusted-input
  • mcp__splose__splose_get_contact private-data
  • mcp__splose__splose_list_cases untrusted-input
  • mcp__splose__splose_list_invoices private-data, untrusted-input
  • mcp__splose__splose_list_credit_notes private-data
  • mcp__splose__splose_list_busy_times private-data
  • mcp__splose__splose_create_patient outbound
  • mcp__splose__splose_create_contact outbound

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/io.usefulapi/splose/verify?hash=846e2e440583393f2eed7e81b19a55894894b85768d4916f86ee8d0873d6a345" | jq -e '.changed == false'

Pinned hash 846e2e440583, from Oct 24, 2026, 16:21 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/io.usefulapi/splose/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for io.usefulapi/splose
[![anlyon.dev](https://anlyon.dev/badge/io.usefulapi/splose.svg)](https://anlyon.dev/servers/io.usefulapi/splose)

Source: MCP Registry · repository. Synced Oct 24, 2026, 17:18 UTC.