MCP Server

intakeq

io.usefulapi/intakeq
Business & Operations Healthcare Public & reachable MCP 2026-07-28

What this MCP does

Manages healthcare practice clients, appointments, intake questionnaires, treatment notes, diagnoses, invoices and practitioner schedules.

intakeq_add_client_tag
Tag a client
Add a tag to a client. The tag is created if it does not exist; adding one the client already has is a no-op. IntakeQ: POST /clientTags.
Destructive
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['client_id', 'tag'], 'properties': {'tag': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'The tag text.'}, 'client_id': {'type': 'integer', 'maximum': 9007199254740991, 'description': "The client's numeric id.", 'exclusiveMinimum': 0}}}
intakeq_cancel_appointment
Cancel an appointment
Cancel an appointment, with an optional reason. This changes the client's booking and cannot be undone through the API — book a new appointment to replace it. IntakeQ: POST /appointments/cancellation.
Destructive
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['appointment_id'], 'properties': {'reason': {'type': 'string', 'maxLength': 1000, 'description': 'Why it was canceled.'}, 'appointment_id': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "The appointment's id."}}}
intakeq_create_appointment
Create an appointment
Book an appointment in the PracticeQ scheduler. Get PractitionerId, ServiceId and LocationId from intakeq_get_booking_settings. All fields are required by IntakeQ. Status must be Confirmed or WaitingConfirmation; SendClientEmailNotification may be true only when Status is Confirmed. IntakeQ: POST /appointments.
Destructive
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['PractitionerId', 'ClientId', 'ServiceId', 'LocationId', 'Status', 'UtcDateTime', 'SendClientEmailNotification', 'ReminderType'], 'properties': {'Status': {'enum': ['Confirmed', 'WaitingConfirmation'], 'type': 'string', 'description': 'Initial status.'}, 'ClientId': {'type': 'integer', 'maximum': 9007199254740991, 'description': "The client's numeric id.", 'exclusiveMinimum': 0}, 'ServiceId': {'type': 'string', 'minLength': 1, 'description': "The service's id."}, 'LocationId': {'type': 'string', 'minLength': 1, 'description': "The location's id."}, 'UtcDateTime': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Start time as a UTC Unix timestamp in ms.'}, 'ReminderType': {'enum': ['Sms', 'Email', 'Voice', 'OptOut'], 'type': 'string', 'description': 'Reminder channel: Sms, Email, Voice or OptOut.'}, 'PractitionerId': {'type': 'string', 'minLength': 1, 'description': "The practitioner's id."}, 'SendClientEmailNotification': {'type': 'boolean', 'description': 'Email the client (only allowed when Status=Confirmed).'}}}
intakeq_get_appointment
Get one appointment
Fetch one appointment: client, practitioner, service, location, start/end, status, price, invoice, telehealth link and cancellation details. IntakeQ: GET /appointments/{id}.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['appointment_id'], 'properties': {'appointment_id': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "The appointment's id."}}}
intakeq_get_booking_settings
Get booking settings
List the scheduler's locations, services (with duration and price) and practitioners — the ids you need to create an appointment. IntakeQ: GET /appointments/settings.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
intakeq_get_client_diagnoses
Get a client's diagnoses
List the diagnoses recorded for one client: code, description, start/end date and the treatment note they came from. IntakeQ: GET /client/{clientId}/diagnoses.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['client_id'], 'properties': {'client_id': {'type': 'integer', 'maximum': 9007199254740991, 'description': "The client's numeric id (ClientId / ClientNumber).", 'exclusiveMinimum': 0}}}
intakeq_get_intake
Get a full intake form
Fetch one intake questionnaire with every question and answer, its consent forms and linked appointment. IntakeQ: GET /intakes/{id}.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['intake_id'], 'properties': {'intake_id': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "The intake's id (a GUID)."}}}
intakeq_get_invoice
Get one invoice
Fetch one invoice: line items, taxes, discounts, payments, totals and amount due. IntakeQ: GET /invoices/{id}.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['invoice_id'], 'properties': {'invoice_id': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "The invoice's id."}}}
intakeq_get_note
Get a full treatment note
Fetch one treatment note with every question and answer and its linked appointment. IntakeQ: GET /notes/{id}.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['note_id'], 'properties': {'note_id': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "The note's id (a GUID)."}}}
intakeq_list_appointments
List appointments
Query appointments by client name/email, date range, status, practitioner or last-modified date. Max 100 per page. IntakeQ: GET /appointments.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number (1, 2, ...). Each page holds at most 100 records.'}, 'client': {'type': 'string', 'description': 'Client name or email (partial matches).'}, 'status': {'enum': ['Confirmed', 'Canceled', 'WaitingConfirmation', 'Declined', 'Missed'], 'type': 'string', 'description': 'Only appointments in this status.'}, 'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Appointments on or before (yyyy-MM-dd).'}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Appointments on or after (yyyy-MM-dd).'}, 'deleted_only': {'type': 'boolean', 'description': 'true = only appointments deleted in the last 10 days.'}, 'updated_since': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Only appointments modified after this date (yyyy-MM-dd).'}, 'practitioner_email': {'type': 'string', 'description': "Only this practitioner's appointments."}}}
intakeq_list_clients
Search clients
Search the practice's clients (patients) by name, email or client number, by created/updated date range, by external id, or by a custom field. Without include_profile it returns Name, Email, Phone and ClientNumber; with include_profile=true it returns the full profile (address, insurance, tags, custom fields, linked clients). Max 100 per page. IntakeQ: GET /clients.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number (1, 2, ...). Each page holds at most 100 records.'}, 'search': {'type': 'string', 'description': 'Client name, email, or numeric client id.'}, 'deleted_only': {'type': 'boolean', 'description': 'true = only clients deleted in the last 10 days.'}, 'custom_fields': {'type': 'object', 'description': 'Match on custom fields: { "<FieldId>": "<value>" } (sent as custom.<FieldId>=<value>).', 'propertyNames': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{1,64}$'}, 'additionalProperties': {'type': 'string'}}, 'include_profile': {'type': 'boolean', 'description': 'true = return the full client profile.'}, 'date_created_end': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Created on or before (yyyy-MM-dd).'}, 'date_updated_end': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Updated on or before (yyyy-MM-dd).'}, 'date_created_start': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Created on or after (yyyy-MM-dd).'}, 'date_updated_start': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Updated on or after (yyyy-MM-dd).'}, 'external_client_id': {'type': 'string', 'description': 'Look up by your external client id.'}}}
intakeq_list_intakes
List intake forms
Query submitted intake questionnaires (summaries: client, status, questionnaire, practitioner, dates). By default only completed forms; set all=true for every status (Sent, Partial, Completed, Offline). Max 100 per page. IntakeQ: GET /intakes/summary.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'all': {'type': 'boolean', 'description': 'true = return intakes of every status, not only completed.'}, 'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number (1, 2, ...). Each page holds at most 100 records.'}, 'client': {'type': 'string', 'description': 'Client name or email (partial matches).'}, 'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'On or before (yyyy-MM-dd).'}, 'client_id': {'type': 'integer', 'maximum': 9007199254740991, 'description': "Only this client's intakes.", 'exclusiveMinimum': 0}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'On or after (yyyy-MM-dd).'}, 'deleted_only': {'type': 'boolean', 'description': 'true = only intakes deleted in the last 10 days.'}, 'updated_since': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Only intakes updated after this date (yyyy-MM-dd).'}, 'external_client_id': {'type': 'string', 'description': 'Only intakes for this external client id.'}}}
intakeq_list_invoices
List invoices
Query invoices by client, issue date range, status, practitioner or last-updated range. Each invoice includes items, payments and amounts due/paid. Max 100 per page. IntakeQ: GET /invoices.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number (1, 2, ...). Each page holds at most 100 records.'}, 'status': {'enum': ['Draft', 'Scheduled', 'Unpaid', 'Paid', 'PastDue', 'Refunded', 'Forgiven', 'Canceled'], 'type': 'string', 'description': 'Only invoices in this status.'}, 'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Invoices on or before (yyyy-MM-dd).'}, 'client_id': {'type': 'integer', 'maximum': 9007199254740991, 'description': "Only this client's invoices (numeric client id).", 'exclusiveMinimum': 0}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Invoices on or after (yyyy-MM-dd).'}, 'practitioner_email': {'type': 'string', 'description': "Only this practitioner's invoices."}, 'last_updated_end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Changed on or before (yyyy-MM-dd).'}, 'last_updated_start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Changed on or after (yyyy-MM-dd).'}}}
intakeq_list_notes
List treatment notes
Query treatment note summaries by client, lock status, date range or last-updated date. Max 100 per page. IntakeQ: GET /notes/summary.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number (1, 2, ...). Each page holds at most 100 records.'}, 'client': {'type': 'string', 'description': 'Client name or email (partial matches).'}, 'status': {'anyOf': [{'type': 'number', 'const': 1}, {'type': 'number', 'const': 2}], 'description': '1 = locked notes, 2 = unlocked notes.'}, 'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'On or before (yyyy-MM-dd).'}, 'client_id': {'type': 'integer', 'maximum': 9007199254740991, 'description': "Only this client's notes.", 'exclusiveMinimum': 0}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'On or after (yyyy-MM-dd).'}, 'deleted_only': {'type': 'boolean', 'description': 'true = only notes deleted in the last 10 days.'}, 'updated_since': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Only notes updated after this date (yyyy-MM-dd).'}}}
intakeq_list_practitioners
List practitioners
List the practitioners in the account (id, name, email, external id). IntakeQ: GET /practitioners.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
intakeq_list_questionnaires
List questionnaire templates
List the intake questionnaire templates in the account (id, name, archived, anonymous) — the ids you need to send one. IntakeQ: GET /questionnaires.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
intakeq_save_client
Create or update a client
Create a client, or update one. With ClientId the existing client is updated. WITHOUT ClientId IntakeQ still tries to match an existing client by first name + email (or first name + phone) and updates that one instead of creating a duplicate. For updates, fetch the full profile first (intakeq_list_clients with include_profile=true) and send it back with your changes, so no field is unintentionally cleared. Field names are IntakeQ's own. Dates are Unix timestamps in milliseconds. IntakeQ: POST /clients.
Destructive
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'City': {'type': 'string'}, 'Name': {'type': 'string', 'description': 'Full name.'}, 'Email': {'type': 'string'}, 'Phone': {'type': 'string'}, 'Gender': {'type': 'string'}, 'Address': {'type': 'string', 'description': 'Full address, or send the components below instead.'}, 'Country': {'type': 'string'}, 'Archived': {'type': 'boolean'}, 'ClientId': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'Update this existing client.', 'exclusiveMinimum': 0}, 'LastName': {'type': 'string'}, 'FirstName': {'type': 'string'}, 'HomePhone': {'type': 'string'}, 'WorkPhone': {'type': 'string'}, 'MiddleName': {'type': 'string'}, 'PostalCode': {'type': 'string'}, 'StateShort': {'type': 'string'}, 'UnitNumber': {'type': 'string'}, 'DateOfBirth': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Unix timestamp in ms.'}, 'MobilePhone': {'type': 'string'}, 'CustomFields': {'type': 'array', 'items': {'type': 'object', 'required': ['FieldId', 'Value'], 'properties': {'Text': {'type': 'string', 'description': "The field's label (optional)."}, 'Value': {'type': 'string', 'description': 'The value to store.'}, 'FieldId': {'type': 'string', 'minLength': 1, 'description': "The custom field's id."}}}, 'description': 'Custom field values (FieldId + Value).'}, 'MaritalStatus': {'type': 'string'}, 'StreetAddress': {'type': 'string'}, 'PractitionerId': {'type': 'string', 'description': 'Assign to this practitioner.'}, 'ExternalClientId': {'type': 'string'}, 'AdditionalInformation': {'type': 'string'}, 'PrimaryInsuranceCompany': {'type': 'string'}, 'SecondaryInsuranceCompany': {'type': 'string'}, 'PrimaryInsuranceHolderName': {'type': 'string'}, 'PrimaryInsuranceGroupNumber': {'type': 'string'}, 'PrimaryInsurancePolicyNumber': {'type': 'string'}, 'PrimaryInsuranceRelationship': {'type': 'string'}, 'SecondaryInsuranceHolderName': {'type': 'string'}, 'SecondaryInsuranceGroupNumber': {'type': 'string'}, 'SecondaryInsurancePolicyNumber': {'type': 'string'}, 'SecondaryInsuranceRelationship': {'type': 'string'}, 'PrimaryInsuranceHolderDateOfBirth': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Unix timestamp in ms.'}, 'SecondaryInsuranceHolderDateOfBirth': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Unix timestamp in ms.'}}}
intakeq_send_questionnaire
Send an intake questionnaire
Send an intake questionnaire to a client by email or SMS. This MESSAGES THE CLIENT. Identify the client by ClientId, or by ClientName plus ClientEmail and/or ClientPhone (omit ClientEmail to force SMS). PractitionerId is optional. Returns the new intake. IntakeQ: POST /intakes/send.
Destructive
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['QuestionnaireId'], 'properties': {'ClientId': {'type': 'integer', 'maximum': 9007199254740991, 'description': "An existing client's numeric id.", 'exclusiveMinimum': 0}, 'ClientName': {'type': 'string', 'description': 'First and last name, if not using ClientId.'}, 'ClientEmail': {'type': 'string', 'description': 'Email delivery address.'}, 'ClientPhone': {'type': 'string', 'description': 'SMS delivery number.'}, 'PractitionerId': {'type': 'string', 'description': "Practitioner to associate; defaults to the client's."}, 'QuestionnaireId': {'type': 'string', 'minLength': 1, 'description': 'The questionnaire template id (intakeq_list_questionnaires).'}, 'ExternalClientId': {'type': 'string', 'description': 'Partners only.'}}}
intakeq_update_appointment
Update or reschedule an appointment
Change an appointment's time, service, location, status or reminder type. Id and UtcDateTime are required (send the current time to keep it); include only the other fields you are changing. The client and practitioner cannot be changed, and a Confirmed appointment cannot go back to WaitingConfirmation. IntakeQ: PUT /appointments.
Destructive
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['Id', 'UtcDateTime'], 'properties': {'Id': {'type': 'string', 'minLength': 1, 'description': "The appointment's id."}, 'Status': {'enum': ['Confirmed', 'WaitingConfirmation'], 'type': 'string', 'description': 'New status.'}, 'ServiceId': {'type': 'string', 'description': 'New service id.'}, 'LocationId': {'type': 'string', 'description': 'New location id.'}, 'UtcDateTime': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Start time as a UTC Unix timestamp in ms (required even if unchanged).'}, 'ReminderType': {'enum': ['Sms', 'Email', 'Voice', 'OptOut'], 'type': 'string'}, 'SendClientEmailNotification': {'type': 'boolean', 'description': 'Email the client about the change.'}}}
Added
intakeq_send_questionnaire
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_cancel_appointment
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_update_appointment
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_create_appointment
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_add_client_tag
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_save_client
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_get_invoice
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_list_invoices
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_get_note
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_list_notes
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_list_practitioners
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_list_questionnaires
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_get_intake
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_list_intakes
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_get_booking_settings
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_get_appointment
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_list_appointments
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_get_client_diagnoses
Oct. 2, 2026, 2:40 a.m.
Added
intakeq_list_clients
Oct. 2, 2026, 2:40 a.m.