Canvas Medical MCP by usefulapi
Server Details
Search and read a patient chart over the Canvas FHIR R4 API. Read-only.
- Status
- Healthy
- Uptime
- 50.7% over 20 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- m190/usefulapi-mcp
- GitHub Stars
- 0
TDQS
Scored across 4 tools
Each tool occupies a clearly distinct retrieval niche: capability discovery, single-resource read by id, collection search, and patient aggregate. The only potential overlap is search vs. patient-everything, but the description explicitly guides the agent to search when a resource type is known.
All names use lowercase snake_case with a consistent canvas_ prefix. The verbs vary (get, read, search) for generic vs. specific operations, which is a minor deviation but remains readable and follows FHIR conventions.
Four tools form a compact, well-scoped surface for querying FHIR records. Each tool earns its place by covering a distinct access pattern, and the count sits comfortably within the recommended 3-15 range.
For a read-oriented FHIR MCP, the surface covers capability discovery, single-resource reads, collection search, and patient $everything. Write/update operations and advanced operations like bulk export or batch bundles are absent, but core read workflows are covered.
Available Tools
4 toolscanvas_get_capability_statementGet the FHIR capability statementARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safety profile, so the bar is lower; the description adds the content scope of the response (resources, interactions, search parameters) and the diagnostic use case. It does not mention auth requirements or response size, but for a read-only metadata endpoint this is reasonably complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and scope, followed by the trigger condition and the raw endpoint. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only metadata tool with no output schema, the description covers what is returned, when to call it, and the underlying endpoint. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate. The inclusion of the raw endpoint path (GET /metadata) is a minor bonus rather than required semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (Fetch the server's FHIR CapabilityStatement) and immediately scopes it: exactly which resources, interactions and search parameters this Canvas instance supports. That distinguishes it from the read/search/everything siblings, which operate on clinical data rather than server metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete activation condition: 'Read it when a search is rejected and you want to know what the instance actually accepts.' That is a clear when-to-use signal, but it names no alternative or when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canvas_get_patient_everythingGet everything for one patientARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| _count | No | Page size, 1-100. | |
| patient_id | Yes | The Patient resource id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description adds real behavioral context: the return is a single FHIR bundle, and it can be a large document, which is a meaningful cost warning. It does not mention pagination even though a _count parameter exists, which is the one missing operational trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: capability plus contents first, then the routing rule and the endpoint reference. Every sentence earns its place; the trailing raw endpoint is mildly redundant but useful for agents mapping to the FHIR API.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by naming the return shape (FHIR bundle with enumerated resource types) and the size risk. Combined with the sibling routing guidance, an agent has enough to call this correctly; only paging behavior on the _count parameter is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so patient_id and _count are already documented with range constraints in the schema. The description adds the underlying endpoint form GET /Patient/{id}/$everything, which reinforces patient_id semantics but adds nothing for _count. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and resource (a patient's full record), then enumerates the concrete contents: conditions, medications, observations, encounters. It also names the sibling it is not (canvas_search) when you need a targeted resource, so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives both the when ('the fastest way to answer a broad question about one person') and the when-not with the named alternative ('prefer canvas_search when you know which resource you need'), plus the reason (large document). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canvas_readRead one FHIR resourceARead-onlyInspect
Fetch a single FHIR resource by type and id. Canvas: GET /{resource}/{id}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The resource's id. | |
| resource | Yes | Which FHIR resource type to read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe-read profile is covered by structured data. The description adds the underlying HTTP shape (GET /{resource}/{id}), which is minor context but discloses nothing about error behavior, authentication, or missing-resource handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and resource, with zero filler. The trailing GET path line is compact and bounded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read with a fully documented schema and annotations covering the safety profile, the definition is sufficient to invoke correctly; no output schema exists, so return-value explanation is not expected. Only the absence of explicit sibling routing keeps it from being complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (id, resource with a 36-value enum) are documented in the schema itself. The description merely restates 'by type and id' and adds no format, casing, or id-syntax guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Fetch a single FHIR resource') plus the parameters needed ('by type and id'), and the word 'single' implicitly contrasts with a search/list operation. It stops short of naming the sibling (canvas_search) it differs from, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool to use when it already knows the resource type and id. There is no explicit statement of when to prefer canvas_search or canvas_get_patient_everything instead, and no prerequisites noted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canvas_searchSearch a FHIR resourceARead-onlyInspect
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| _id | No | Fetch by resource id through search. | |
| date | No | FHIR date filter, e.g. "ge2026-08-01" or "lt2026-09-01". Prefixes: eq, ne, gt, lt, ge, le. | |
| name | No | Name search, for Patient and Practitioner. | |
| _sort | No | Sort field, e.g. -date for newest first. | |
| _count | No | Page size, 1-100. | |
| status | No | FHIR status filter, e.g. active, completed, cancelled. | |
| _offset | No | Offset for paging through results. | |
| patient | No | Restrict to one patient, by Patient id. The usual first filter. | |
| resource | Yes | Which FHIR resource type to search. | |
| identifier | No | Search by business identifier, e.g. an MRN. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, and the trailing 'Canvas: GET /{resource}' reinforces that this is a read. The description adds useful context about supported resource types but says nothing about result shape, paging defaults, or caps beyond what the schema documents. Adequate but not rich against a lowered annotation bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then sequencing guidance ('Pick resource, then narrow'), then clinical examples. Dense and purposeful, though the run of examples is long enough that it could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing what comes back, and it never mentions that results are a FHIR Bundle or that paging via _count/_offset applies. For a 10-param search tool spanning 35 resource types, that return-shape gap is the main omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description earns above baseline by mapping enum values to clinical meaning (Condition/Observation -> problem list and results, MedicationRequest -> prescriptions, Appointment/Encounter -> visits) and framing the non-resource params as 'standard FHIR search parameters' to be used for narrowing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search any supported FHIR R4 resource in the chart') and scopes the universe of resource types. It does not explicitly contrast itself with siblings like canvas_get_patient_everything (bulk patient fetch) or canvas_read (single-resource read), so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance ('Nearly every clinical question starts here') and maps clinical intents to resource types (Condition/Observation for problem list, MedicationRequest for prescriptions). It stops short of naming alternatives or when-not-to-use conditions, which keeps it out of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- Changed
canvas_get_capability_statement1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
canvas_get_patient_everything1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
canvas_read1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
canvas_search1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
4 tool updates
- First observed
canvas_get_capability_statement - First observed
canvas_get_patient_everything - First observed
canvas_read - First observed
canvas_search
Related MCP Connectors
Read patient-authorized EHR records: medications, labs, conditions, allergies. Consent-bounded.
Query Health Gorilla FHIR patients, conditions, medications and lab results.
Read Elation Health patients, appointments, problems, allergies, medications, notes and vitals.
Query Particle Health patient records across connected clinical networks.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables read-only FHIR access to Practice Fusion EHR to search patients, appointments, conditions, medications, and lab results.139 npm4MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with FHIR R4 healthcare data through SHARP-on-MCP tools, including search, read, and clinical context aggregation, with built-in Chart.js dashboards for visualizing lab trends, vitals, and patient data.5 npm3MIT
- AlicenseAqualityCmaintenanceGives AI agents read-only access to patient context on any FHIR R4 server, including journey timelines of encounters and appointments, open booking slots, and discharged patients whose follow-ups were never booked. Search, appointment, and follow-up tools return compact summaries, so agents can answer front-desk and outreach questions without write access.5MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to securely read and organize a patient's own health records from Epic MyChart via the FHIR API, including labs, documents, appointments, and attachments, using OAuth-based authorization.-
Glama MCP Gateway
Add one secure layer between your agents and this server.