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

A
Description quality
100%
Schema completeness
83%
Naming quality
75%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'canvas_get_capability_statement' name length outside 3-30 rangein canvas_get_capability_statement

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~966Tokens (tool definitions)
~2.0 KBTypical response size
Moderate attention impact (0.75% 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": {
    "canvas-medical": {
      "url": "https://canvas-medical.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://canvas-medical.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded4 tools