Healthie MCP by usefulapi

Hosted MCP server for the Healthie EHR & telehealth API: patients, appointments, charting, tasks.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
85%
Naming quality
78%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'healthie_list_appointment_types' name length outside 3-30 rangein healthie_list_appointment_types
  • LOWTool 'healthie_list_form_answer_groups' name length outside 3-30 rangein healthie_list_form_answer_groups

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,495Tokens (tool definitions)
~1.1 KBTypical response size
Moderate attention impact (1.95% 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": {
    "healthie": {
      "url": "https://healthie.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://healthie.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (16)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢healthie_current_user

Fetch the authenticated Healthie account (the provider/user that owns the API key). Good first call to verify auth. Read-only. GraphQL: query currentUser.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_get_organization

Fetch the current organization / practice (name, NPI, contact, user counts). Read-only. GraphQL: query organization.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_patients(keywords, offset, page_size, active_status)

List patients/clients, optionally filtered by keyword search or active status. Read-only. GraphQL: query users(keywords, offset, page_size, should_paginate, active_status).

Input Schema

{
  "type": "object",
  "properties": {
    "keywords": {
      "description": "Free-text search over name/email.",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "page_size": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "active_status": {
      "description": "Filter by status: \"active\" or \"archived\".",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_get_user(id)

Fetch a single user (patient or provider) by id. Read-only. GraphQL: query user(id).

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The user id."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_appointments(user_id, provider_id, filter, startDate, endDate, ...)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "user_id": {
      "description": "Filter to appointments for this patient/client id.",
      "type": "string"
    },
    "provider_id": {
      "description": "Filter to appointments for this provider id.",
      "type": "string"
    },
    "filter": {
      "description": "Time filter: \"future\" (default), \"past\", \"ended\", \"didnt-occur\".",
      "type": "string"
    },
    "startDate": {
      "description": "Start date (YYYY-MM-DD) to bound results.",
      "type": "string"
    },
    "endDate": {
      "description": "End date (YYYY-MM-DD) to bound results.",
      "type": "string"
    },
    "filter_by_appointment_status": {
      "description": "Filter by appointment status label.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_get_appointment(id)

Fetch a single appointment by id. Read-only. GraphQL: query appointment(id).

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The appointment id."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_appointment_types(keywords, offset, page_size)

List the practice's appointment types (services), optionally keyword-filtered. Read-only. GraphQL: query appointmentTypes(keywords, offset, page_size, should_paginate).

Input Schema

{
  "type": "object",
  "properties": {
    "keywords": {
      "description": "Free-text search over appointment type names.",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "page_size": {
      "description": "Results per page. Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_forms(keywords, category, offset, page_size)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "keywords": {
      "description": "Free-text search over form names.",
      "type": "string"
    },
    "category": {
      "description": "Filter by form category.",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "page_size": {
      "description": "Results per page. Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_form_answer_groups(user_id, custom_module_form_id, offset)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "user_id": {
      "description": "Filter to submissions for this patient id.",
      "type": "string"
    },
    "custom_module_form_id": {
      "description": "Filter to submissions of this form template id.",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_documents(viewable_user_id, keywords, offset, page_size)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "viewable_user_id": {
      "description": "Patient id whose documents to list.",
      "type": "string"
    },
    "keywords": {
      "description": "Free-text search over document names.",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "page_size": {
      "description": "Results per page. Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_tasks(client_id, completed_status, offset, per_page)

List tasks, optionally scoped to a client or filtered by completion status. Read-only. GraphQL: query tasks(client_id, completed_status, offset, per_page).

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Filter to tasks about this client id.",
      "type": "string"
    },
    "completed_status": {
      "description": "Completion filter, e.g. \"complete\" or \"incomplete\".",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page. Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_goals(user_id, offset, per_page)

List goals, optionally scoped to a patient. Read-only. GraphQL: query goals(user_id, offset, per_page).

Input Schema

{
  "type": "object",
  "properties": {
    "user_id": {
      "description": "Filter to goals for this patient id.",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page. Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_metric_entries(client_id, category, offset, page_size)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Filter to entries for this client id.",
      "type": "string"
    },
    "category": {
      "description": "Entry category, e.g. \"MetricEntry\", \"Weight\".",
      "type": "string"
    },
    "offset": {
      "description": "Pagination offset. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "page_size": {
      "description": "Results per page (max 500). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢healthie_list_conversations(user_id)

List messaging conversations, optionally between the current user and a given user. Read-only. GraphQL: query conversations(user_id).

Input Schema

{
  "type": "object",
  "properties": {
    "user_id": {
      "description": "Get conversations between the current user and this user id.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴healthie_create_task(content, user_id, due_date, priority, created_by_id)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "minLength": 1,
      "description": "The task text/description."
    },
    "user_id": {
      "description": "The client/user the task is about.",
      "type": "string"
    },
    "due_date": {
      "description": "Due date (YYYY-MM-DD).",
      "type": "string"
    },
    "priority": {
      "description": "Priority (integer).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "created_by_id": {
      "description": "Id of the user creating the task.",
      "type": "string"
    }
  },
  "required": [
    "content"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴healthie_create_note(content, user_id, org_chat)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "minLength": 1,
      "description": "The note text."
    },
    "user_id": {
      "description": "The client/user the note is about.",
      "type": "string"
    },
    "org_chat": {
      "description": "True if created in the organization chat context.",
      "type": "boolean"
    }
  },
  "required": [
    "content"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
failed observationversion not recorded—
failed observationversion not recorded—