Canvas Medical MCP by usefulapi
Search and read a patient chart over the Canvas FHIR R4 API. Read-only.
Should I use this
Quality & Safety
Findings (1)
- LOWin canvas_get_capability_statement
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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": {
"canvas-medical": {
"url": "https://canvas-medical.usefulapi.io/mcp"
}
}
}Remote endpoints
https://canvas-medical.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
🟢canvas_search(resource, patient, status, date, identifier, ...)
Search any supported FHIR R4 resource in the chart. Pick `resource`, then narrow with the standard FHIR search parameters. Nearly every clinical question starts here: Condition or Observation for a problem list and results, MedicationRequest for prescriptions, Appointment or Encounter for visits, DocumentReference for notes. Canvas: GET /{resource}.
Input Schema
{
"type": "object",
"properties": {
"resource": {
"type": "string",
"enum": [
"Patient",
"Appointment",
"Condition",
"Observation",
"MedicationRequest",
"MedicationStatement",
"MedicationDispense",
"AllergyIntolerance",
"Immunization",
"Encounter",
"DocumentReference",
"DiagnosticReport",
"Procedure",
"CarePlan",
"CareTeam",
"Goal",
"Coverage",
"Claim",
"Practitioner",
"Organization",
"Location",
"Schedule",
"Slot",
"Task",
"ServiceRequest",
"Questionnaire",
"QuestionnaireResponse",
"Consent",
"Device",
"Specimen",
"RelatedPerson",
"Communication",
"DetectedIssue",
"Provenance",
"Media",
"Group"
],
"description": "Which FHIR resource type to search."
},
"patient": {
"description": "Restrict to one patient, by Patient id. The usual first filter.",
"type": "string"
},
"status": {
"description": "FHIR status filter, e.g. active, completed, cancelled.",
"type": "string"
},
"date": {
"description": "FHIR date filter, e.g. \"ge2026-08-01\" or \"lt2026-09-01\". Prefixes: eq, ne, gt, lt, ge, le.",
"type": "string"
},
"identifier": {
"description": "Search by business identifier, e.g. an MRN.",
"type": "string"
},
"name": {
"description": "Name search, for Patient and Practitioner.",
"type": "string"
},
"_id": {
"description": "Fetch by resource id through search.",
"type": "string"
},
"_count": {
"description": "Page size, 1-100.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"_sort": {
"description": "Sort field, e.g. -date for newest first.",
"type": "string"
},
"_offset": {
"description": "Offset for paging through results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"resource"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢canvas_read(resource, id)
Fetch a single FHIR resource by type and id. Canvas: GET /{resource}/{id}.
Input Schema
{
"type": "object",
"properties": {
"resource": {
"type": "string",
"enum": [
"Patient",
"Appointment",
"Condition",
"Observation",
"MedicationRequest",
"MedicationStatement",
"MedicationDispense",
"AllergyIntolerance",
"Immunization",
"Encounter",
"DocumentReference",
"DiagnosticReport",
"Procedure",
"CarePlan",
"CareTeam",
"Goal",
"Coverage",
"Claim",
"Practitioner",
"Organization",
"Location",
"Schedule",
"Slot",
"Task",
"ServiceRequest",
"Questionnaire",
"QuestionnaireResponse",
"Consent",
"Device",
"Specimen",
"RelatedPerson",
"Communication",
"DetectedIssue",
"Provenance",
"Media",
"Group"
],
"description": "Which FHIR resource type to read."
},
"id": {
"type": "string",
"description": "The resource's id."
}
},
"required": [
"resource",
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢canvas_get_patient_everything(patient_id, _count)
Fetch a patient's full record in one FHIR bundle — conditions, medications, observations, encounters and more. The fastest way to answer a broad question about one person, but it can return a large document, so prefer canvas_search when you know which resource you need. Canvas: GET /Patient/{id}/$everything.
Input Schema
{
"type": "object",
"properties": {
"patient_id": {
"type": "string",
"description": "The Patient resource id."
},
"_count": {
"description": "Page size, 1-100.",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"patient_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢canvas_get_capability_statement
Fetch the server's FHIR CapabilityStatement — exactly which resources, interactions and search parameters this Canvas instance supports. Read it when a search is rejected and you want to know what the instance actually accepts. Canvas: GET /metadata.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence