Hosted MCP server for the Healthie EHR & telehealth API: patients, appointments, charting, tasks.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Creates a note/chat entry in Healthie (additive). Requires content (the note text); optionally attach it to a client (user_id) or mark it as an org chat. GraphQL: mutation createNote(input: createNoteInput).
The note text.
The client/user the note is about.
True if created in the organization chat context.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Creates a note/chat entry in Healthie (additive). Requires content (the note text); optionally attach it to a client (user_id) or mark it as an org chat. GraphQL: mutation createNote(input: createNoteInput).
| Argument | Type | Description |
|---|---|---|
| content* | string | The note text. |
| user_id | string | The client/user the note is about. |
| org_chat | boolean | True if created in the organization chat context. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"content"
],
"properties": {
"content": {
"type": "string",
"minLength": 1,
"description": "The note text."
},
"user_id": {
"type": "string",
"description": "The client/user the note is about."
},
"org_chat": {
"type": "boolean",
"description": "True if created in the organization chat context."
}
}
}Creates a task in Healthie (additive). Requires content (the task text); optionally attach it to a client (user_id), set a due_date, priority, or created_by_id. GraphQL: mutation createTask(input: createTaskInput).
| Argument | Type | Description |
|---|---|---|
| content* | string | The task text/description. |
| user_id | string | The client/user the task is about. |
| due_date | string | Due date (YYYY-MM-DD). |
| priority | integer | Priority (integer). |
| created_by_id | string | Id of the user creating the task. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"content"
],
"properties": {
"content": {
"type": "string",
"minLength": 1,
"description": "The task text/description."
},
"user_id": {
"type": "string",
"description": "The client/user the task is about."
},
"due_date": {
"type": "string",
"description": "Due date (YYYY-MM-DD)."
},
"priority": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Priority (integer)."
},
"created_by_id": {
"type": "string",
"description": "Id of the user creating the task."
}
}
}Fetch the authenticated Healthie account (the provider/user that owns the API key). Good first call to verify auth. Read-only. GraphQL: query currentUser.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Fetch a single appointment by id. Read-only. GraphQL: query appointment(id).
| Argument | Type | Description |
|---|---|---|
| id* | string | The appointment id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The appointment id."
}
}
}Fetch the current organization / practice (name, NPI, contact, user counts). Read-only. GraphQL: query organization.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Fetch a single user (patient or provider) by id. Read-only. GraphQL: query user(id).
| Argument | Type | Description |
|---|---|---|
| id* | string | The user id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The user id."
}
}
}List the practice's appointment types (services), optionally keyword-filtered. Read-only. GraphQL: query appointmentTypes(keywords, offset, page_size, should_paginate).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| keywords | string | Free-text search over appointment type names. |
| page_size | integer | Results per page. Default 25. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"keywords": {
"type": "string",
"description": "Free-text search over appointment type names."
},
"page_size": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Results per page. Default 25.",
"exclusiveMinimum": 0
}
}
}List appointments, optionally filtered by patient, provider, date range, time-filter or status. Read-only. GraphQL: query appointments(user_id, provider_id, filter, startDate, endDate, filter_by_appointment_status).
| Argument | Type | Description |
|---|---|---|
| filter | string | Time filter: "future" (default), "past", "ended", "didnt-occur". |
| endDate | string | End date (YYYY-MM-DD) to bound results. |
| user_id | string | Filter to appointments for this patient/client id. |
| startDate | string | Start date (YYYY-MM-DD) to bound results. |
| provider_id | string | Filter to appointments for this provider id. |
| filter_by_appointment_status | string | Filter by appointment status label. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"filter": {
"type": "string",
"description": "Time filter: \"future\" (default), \"past\", \"ended\", \"didnt-occur\"."
},
"endDate": {
"type": "string",
"description": "End date (YYYY-MM-DD) to bound results."
},
"user_id": {
"type": "string",
"description": "Filter to appointments for this patient/client id."
},
"startDate": {
"type": "string",
"description": "Start date (YYYY-MM-DD) to bound results."
},
"provider_id": {
"type": "string",
"description": "Filter to appointments for this provider id."
},
"filter_by_appointment_status": {
"type": "string",
"description": "Filter by appointment status label."
}
}
}List messaging conversations, optionally between the current user and a given user. Read-only. GraphQL: query conversations(user_id).
| Argument | Type | Description |
|---|---|---|
| user_id | string | Get conversations between the current user and this user id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"user_id": {
"type": "string",
"description": "Get conversations between the current user and this user id."
}
}
}List documents, optionally scoped to a patient (viewable_user_id) or by keyword. Read-only. GraphQL: query documents(viewable_user_id, keywords, offset, page_size, should_paginate).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| keywords | string | Free-text search over document names. |
| page_size | integer | Results per page. Default 25. |
| viewable_user_id | string | Patient id whose documents to list. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"keywords": {
"type": "string",
"description": "Free-text search over document names."
},
"page_size": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Results per page. Default 25.",
"exclusiveMinimum": 0
},
"viewable_user_id": {
"type": "string",
"description": "Patient id whose documents to list."
}
}
}List completed form submissions (charting notes / filled intake forms), optionally scoped to a patient or a form template. Read-only. GraphQL: query formAnswerGroups(user_id, custom_module_form_id, should_paginate, offset).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| user_id | string | Filter to submissions for this patient id. |
| custom_module_form_id | string | Filter to submissions of this form template id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"user_id": {
"type": "string",
"description": "Filter to submissions for this patient id."
},
"custom_module_form_id": {
"type": "string",
"description": "Filter to submissions of this form template id."
}
}
}List custom module form templates (charting notes, intake forms), optionally by keyword or category. Read-only. GraphQL: query customModuleForms(keywords, category, offset, page_size, should_paginate).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| category | string | Filter by form category. |
| keywords | string | Free-text search over form names. |
| page_size | integer | Results per page. Default 25. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"category": {
"type": "string",
"description": "Filter by form category."
},
"keywords": {
"type": "string",
"description": "Free-text search over form names."
},
"page_size": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Results per page. Default 25.",
"exclusiveMinimum": 0
}
}
}List goals, optionally scoped to a patient. Read-only. GraphQL: query goals(user_id, offset, per_page).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| user_id | string | Filter to goals for this patient id. |
| per_page | integer | Results per page. Default 25. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"user_id": {
"type": "string",
"description": "Filter to goals for this patient id."
},
"per_page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Results per page. Default 25.",
"exclusiveMinimum": 0
}
}
}List tracked metric entries (weight, blood pressure, etc.), optionally scoped to a client or a category. Read-only. GraphQL: query entries(client_id, category, offset, page_size).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| category | string | Entry category, e.g. "MetricEntry", "Weight". |
| client_id | string | Filter to entries for this client id. |
| page_size | integer | Results per page (max 500). Default 25. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"category": {
"type": "string",
"description": "Entry category, e.g. \"MetricEntry\", \"Weight\"."
},
"client_id": {
"type": "string",
"description": "Filter to entries for this client id."
},
"page_size": {
"type": "integer",
"maximum": 500,
"description": "Results per page (max 500). Default 25.",
"exclusiveMinimum": 0
}
}
}List patients/clients, optionally filtered by keyword search or active status. Read-only. GraphQL: query users(keywords, offset, page_size, should_paginate, active_status).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| keywords | string | Free-text search over name/email. |
| page_size | integer | Results per page (max 100). Default 25. |
| active_status | string | Filter by status: "active" or "archived". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"keywords": {
"type": "string",
"description": "Free-text search over name/email."
},
"page_size": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 25.",
"exclusiveMinimum": 0
},
"active_status": {
"type": "string",
"description": "Filter by status: \"active\" or \"archived\"."
}
}
}List tasks, optionally scoped to a client or filtered by completion status. Read-only. GraphQL: query tasks(client_id, completed_status, offset, per_page).
| Argument | Type | Description |
|---|---|---|
| offset | integer | Pagination offset. Default 0. |
| per_page | integer | Results per page. Default 25. |
| client_id | string | Filter to tasks about this client id. |
| completed_status | string | Completion filter, e.g. "complete" or "incomplete". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Pagination offset. Default 0."
},
"per_page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Results per page. Default 25.",
"exclusiveMinimum": 0
},
"client_id": {
"type": "string",
"description": "Filter to tasks about this client id."
},
"completed_status": {
"type": "string",
"description": "Completion filter, e.g. \"complete\" or \"incomplete\"."
}
}
}