Connectors · Work & projects
Canvas Medical MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Canvas Medical and the rest of your systems. It gives your agent 117 Canvas Medical actions (80 reads and 37 writes) and holds the Canvas Medical credential itself, so the agent never does. It paces Canvas Medical's limits and records every call.
100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.
claude mcp add --transport http actionlake https://connect.actionlake.com/mcpdo { action: "canvas_medical.appointments.search", intent: "check which Canvas Medical account is connected"}# Search Appointment resources · read · 1 upstream call- 117actionsin one signed file
- 80readlook, never change
- 37writecreate and update
- 0wait for a yesdestructive, confirmed first
Set up
Connect Canvas Medical in three steps.
- 01
Add actionlake to Claude.
Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
https://connect.actionlake.com/mcp - 02
Connect Canvas Medical.
OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in. actionlake stores what you paste write-only, sealed under your tenant's key.
client_idClient ID of a Confidential OAuth application with the client-credentials grant, registered at [your…client_secretClient Secret of that applicationtenant_hostWhere your Canvas Medical lives: your tenant host
account { op: "connections.requirements", service: "canvas_medical" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "canvas_medical.appointments.search" }# search appointment resources · read · 1 upstream callcheck { action: "canvas_medical.tasks.create", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
Canvas Medical at a glance
- Sign-in
- OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in.
- You provide
client_idclient_secret- Setup fields
tenant_host- Limits we pace to
- 10 calls a second, per connection
- API covered
- Canvas FHIR R4 API (FHIR 4.0.1, US Core), docs.canvasmedical.com/api as of 2026-10-23, at your Canvas Medical instance's API base URL, which you enter when connecting
- Built from
- Canvas Medical's documentation, read 23 October 2026docs.canvasmedical.comfumage-modernfamilypractice.canvasmedical.comdocs.canvasmedical.com
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 2 of 80 reads, for up to an hour; a write clears what it affects
- Shared entities
- 4, so ask can line Canvas Medical up with your other systems
- Data
- Processed and stored in Sydney, Australia. No US region yet
Capabilities
What an AI agent can do in Canvas Medical.
117 actions in 46 areas. Every one carries its effect, so a key can allow the reads and hold the rest.
- 80readlook, never change
- 37writecreate and update
- 0destructivewait for a confirmation
Allergy intolerances
42 read · 2 write · 0 destructive
Create an AllergyIntolerance · Search AllergyIntolerance resources · Read an AllergyIntolerance by id · Update an AllergyIntolerance
Appointments
42 read · 2 write · 0 destructive
Search Appointment resources · Create an Appointment · Read an Appointment by id · Update an Appointment
Claims
42 read · 2 write · 0 destructive
Create a Claim · Search Claim resources · Read a Claim by id · Update a Claim
Conditions
42 read · 2 write · 0 destructive
Create a Condition · Search Condition resources · Read a Condition by id · Update a Condition
Coverages
42 read · 2 write · 0 destructive
Create a Coverage · Search Coverage resources · Read a Coverage by id · Update a Coverage
Detected issues
42 read · 2 write · 0 destructive
Create a DetectedIssue · Search DetectedIssue resources · Read a DetectedIssue by id · Update a DetectedIssue
Groups
42 read · 2 write · 0 destructive
Create a Group · Search Group resources · Read a Group by id · Update a Group
Immunizations
42 read · 2 write · 0 destructive
Create an Immunization · Search Immunization resources · Read an Immunization by id · Update an Immunization
38 more areas · 85 actions
- Medication statements 4
- Patients 4
- Practitioners 4
- Questionnaire responses 4
- Tasks 4
- Care teams 3
- Communications 3
- Consents 3
- Document references 3
- Media 3
- Observations 3
- Payment notices 3
- Allergens 2
- Care plans 2
- Coverage eligibility responses 2
- Devices 2
- Diagnostic reports 2
- Encounters 2
- Goals 2
- Locations 2
- Medication dispenses 2
- Medication requests 2
- Medications 2
- Organizations 2
- Procedures 2
- Provenances 2
- Questionnaires 2
- Related people 2
- Service requests 2
- Specimens 2
- Capability statement 1
- Claim activity log items 1
- Coverage eligibility requests 1
- Lab reports 1
- Practitioner password resets 1
- Schedules 1
- Slots 1
- Smart configuration 1
Top actions
The Canvas Medical API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
canvas_medical.tasks.searchSearch Task resources | Search Task resources; each result row is a Bundle entry whose `resource` is the Task. | read | this connector |
canvas_medical.locations.searchSearch Location resources | Search Location resources; each result row is a Bundle entry whose `resource` is the Location. | read | this connector |
canvas_medical.appointments.searchSearch Appointment resources | Search Appointment resources; each result row is a Bundle entry whose `resource` is the Appointment. | read | this connector |
canvas_medical.organizations.searchSearch Organization resources | Search Organization resources; each result row is a Bundle entry whose `resource` is the Organization. | read | this connector |
canvas_medical.slots.searchSearch Slot resources | Search Slot resources; each result row is a Bundle entry whose `resource` is the Slot. | read | this connector |
canvas_medical.tasks.createCreate a Task | Create a Task resource from a complete FHIR R4 Task body. | write | this connector |
canvas_medical.claims.createCreate a Claim | Create a Claim resource from a complete FHIR R4 Claim body. | write | this connector |
canvas_medical.claims.searchSearch Claim resources | Search Claim resources; each result row is a Bundle entry whose `resource` is the Claim. | read | this connector |
canvas_medical.patients.createCreate a Patient | Create a Patient resource from a complete FHIR R4 Patient body. | write | this connector |
canvas_medical.patients.searchSearch Patient resources | Search Patient resources; each result row is a Bundle entry whose `resource` is the Patient. | read | this connector |
canvas_medical.coverages.createCreate a Coverage | Create a Coverage resource from a complete FHIR R4 Coverage body. | write | this connector |
canvas_medical.coverages.searchSearch Coverage resources | Search Coverage resources; each result row is a Bundle entry whose `resource` is the Coverage. | read | this connector |
Try it
Prompts to paste into Claude.
Each one names the Canvas Medical actions it will call, so you know what it reads and what it changes before you send it.
- Readread
Which Canvas Medical tasks are overdue, and who owns each one?
calls
canvas_medical.tasks.search - Writewrite
Create a Task in Canvas Medical. Show me exactly what you will send before you save it.
calls
canvas_medical.tasks.create - Across systemsread
Which Canvas Medical companies have invoices in ConnectWise PSA, and how many each?
calls
canvas_medical.organizations.searchconnectwise_manage.invoices.list
Across your systems
Canvas Medical, joined to the rest of your business.
One ask fetches from Canvas Medical and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.
Which Canvas Medical companies have invoices in ConnectWise PSA, and how many each?
canvas_medical.organizations.search+connectwise_manage.invoices.list, oncrm.company· ConnectWise PSAWhich Canvas Medical companies have invoices in NetSuite, and how many each?
canvas_medical.organizations.search+netsuite.views.invoices, oncrm.company· NetSuite
crm.company 227work.task 105crm.location 49service.service_appointment 9ask { intent: "which Canvas Medical companies have invoices in ConnectWise PSA, and how many each", steps: [ { action: "canvas_medical.organizations.search", as: "co", input: {}, limit: 100, max_pages: 5 }, { action: "connectwise_manage.invoices.list", as: "inv", input: {}, limit: 100, max_pages: 5 }, { join: { left: "co", right: "inv", on: "crm.company", group_by: "co.name", select: ["co.name", "count(inv.id) as invoices"] } } ]}Governance for Canvas Medical
Every write can wait for a yes.
None of Canvas Medical's actions is destructive. A key can still be held to reads, capped, and set so a person confirms every write.
A destructive action runs only with confirm: true. Under the human policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.
account { op: "keys.create", name: "canvas-medical-agent", allowed_actions: ["canvas_medical.*"], cap_calls: 2000, confirm_policy: "human_for_writes"}Cost
What Canvas Medical costs on actionlake.
Every Canvas Medical action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call Canvas Medical refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
- 1upstream call per actionall 117 Canvas Medical actions
- 117actions pageeach page of a long list is one call
- 2reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every Canvas Medical action.
117 actions by area: the id your agent calls, what it does, and its effect.
Allergy intolerances4
canvas_medical.allergy_intolerances.createCreate an AllergyIntolerancewritecanvas_medical.allergy_intolerances.getRead an AllergyIntolerance by idreadcanvas_medical.allergy_intolerances.searchSearch AllergyIntolerance resourcesreadcanvas_medical.allergy_intolerances.updateUpdate an AllergyIntolerancewrite
Appointments4
canvas_medical.appointments.createCreate an Appointmentwritecanvas_medical.appointments.getRead an Appointment by idreadcanvas_medical.appointments.searchSearch Appointment resourcesreadcanvas_medical.appointments.updateUpdate an Appointmentwrite
Claims4
canvas_medical.claims.createCreate a Claimwritecanvas_medical.claims.getRead a Claim by idreadcanvas_medical.claims.searchSearch Claim resourcesreadcanvas_medical.claims.updateUpdate a Claimwrite
Conditions4
canvas_medical.conditions.createCreate a Conditionwritecanvas_medical.conditions.getRead a Condition by idreadcanvas_medical.conditions.searchSearch Condition resourcesreadcanvas_medical.conditions.updateUpdate a Conditionwrite
Coverages4
canvas_medical.coverages.createCreate a Coveragewritecanvas_medical.coverages.getRead a Coverage by idreadcanvas_medical.coverages.searchSearch Coverage resourcesreadcanvas_medical.coverages.updateUpdate a Coveragewrite
Detected issues4
canvas_medical.detected_issues.createCreate a DetectedIssuewritecanvas_medical.detected_issues.getRead a DetectedIssue by idreadcanvas_medical.detected_issues.searchSearch DetectedIssue resourcesreadcanvas_medical.detected_issues.updateUpdate a DetectedIssuewrite
Groups4
canvas_medical.groups.createCreate a Groupwritecanvas_medical.groups.getRead a Group by idreadcanvas_medical.groups.searchSearch Group resourcesreadcanvas_medical.groups.updateUpdate a Groupwrite
Immunizations4
canvas_medical.immunizations.createCreate an Immunizationwritecanvas_medical.immunizations.getRead an Immunization by idreadcanvas_medical.immunizations.searchSearch Immunization resourcesreadcanvas_medical.immunizations.updateUpdate an Immunizationwrite
Medication statements4
canvas_medical.medication_statements.createCreate a MedicationStatementwritecanvas_medical.medication_statements.getRead a MedicationStatement by idreadcanvas_medical.medication_statements.searchSearch MedicationStatement resourcesreadcanvas_medical.medication_statements.updateUpdate a MedicationStatementwrite
Patients4
canvas_medical.patients.createCreate a Patientwritecanvas_medical.patients.getRead a Patient by idreadcanvas_medical.patients.searchSearch Patient resourcesreadcanvas_medical.patients.updateUpdate a Patientwrite
Practitioners4
canvas_medical.practitioners.createCreate a Practitionerwritecanvas_medical.practitioners.getRead a Practitioner by idreadcanvas_medical.practitioners.searchSearch Practitioner resourcesreadcanvas_medical.practitioners.updateUpdate a Practitionerwrite
Questionnaire responses4
canvas_medical.questionnaire_responses.createCreate a QuestionnaireResponsewritecanvas_medical.questionnaire_responses.getRead a QuestionnaireResponse by idreadcanvas_medical.questionnaire_responses.searchSearch QuestionnaireResponse resourcesreadcanvas_medical.questionnaire_responses.updateUpdate a QuestionnaireResponsewrite
Tasks4
canvas_medical.tasks.createCreate a Taskwritecanvas_medical.tasks.getRead a Task by idreadcanvas_medical.tasks.searchSearch Task resourcesreadcanvas_medical.tasks.updateUpdate a Taskwrite
Care teams3
canvas_medical.care_teams.getRead a CareTeam by idreadcanvas_medical.care_teams.searchSearch CareTeam resourcesreadcanvas_medical.care_teams.updateUpdate a CareTeamwrite
Communications3
canvas_medical.communications.createCreate a Communicationwritecanvas_medical.communications.getRead a Communication by idreadcanvas_medical.communications.searchSearch Communication resourcesread
Consents3
canvas_medical.consents.createCreate a Consentwritecanvas_medical.consents.getRead a Consent by idreadcanvas_medical.consents.searchSearch Consent resourcesread
Document references3
canvas_medical.document_references.createCreate a DocumentReferencewritecanvas_medical.document_references.getRead a DocumentReference by idreadcanvas_medical.document_references.searchSearch DocumentReference resourcesread
Media3
canvas_medical.media.createCreate a Mediawritecanvas_medical.media.getRead a Media by idreadcanvas_medical.media.searchSearch Media resourcesread
Observations3
canvas_medical.observations.createCreate an Observationwritecanvas_medical.observations.getRead an Observation by idreadcanvas_medical.observations.searchSearch Observation resourcesread
Payment notices3
canvas_medical.payment_notices.createCreate a PaymentNoticewritecanvas_medical.payment_notices.getRead a PaymentNotice by idreadcanvas_medical.payment_notices.searchSearch PaymentNotice resourcesread
Allergens2
canvas_medical.allergens.getRead an Allergen by idreadcanvas_medical.allergens.searchSearch Allergen resourcesread
Care plans2
canvas_medical.care_plans.getRead a CarePlan by idreadcanvas_medical.care_plans.searchSearch CarePlan resourcesread
Coverage eligibility responses2
canvas_medical.coverage_eligibility_responses.getRead a CoverageEligibilityResponse by idreadcanvas_medical.coverage_eligibility_responses.searchSearch CoverageEligibilityResponse resourcesread
Devices2
canvas_medical.devices.getRead a Device by idreadcanvas_medical.devices.searchSearch Device resourcesread
Diagnostic reports2
canvas_medical.diagnostic_reports.getRead a DiagnosticReport by idreadcanvas_medical.diagnostic_reports.searchSearch DiagnosticReport resourcesread
Encounters2
canvas_medical.encounters.getRead an Encounter by idreadcanvas_medical.encounters.searchSearch Encounter resourcesread
Goals2
canvas_medical.goals.getRead a Goal by idreadcanvas_medical.goals.searchSearch Goal resourcesread
Locations2
canvas_medical.locations.getRead a Location by idreadcanvas_medical.locations.searchSearch Location resourcesread
Medication dispenses2
canvas_medical.medication_dispenses.getRead a MedicationDispense by idreadcanvas_medical.medication_dispenses.searchSearch MedicationDispense resourcesread
Medication requests2
canvas_medical.medication_requests.getRead a MedicationRequest by idreadcanvas_medical.medication_requests.searchSearch MedicationRequest resourcesread
Medications2
canvas_medical.medications.getRead a Medication by idreadcanvas_medical.medications.searchSearch Medication resourcesread
Organizations2
canvas_medical.organizations.getRead an Organization by idreadcanvas_medical.organizations.searchSearch Organization resourcesread
Procedures2
canvas_medical.procedures.getRead a Procedure by idreadcanvas_medical.procedures.searchSearch Procedure resourcesread
Provenances2
canvas_medical.provenances.getRead a Provenance by idreadcanvas_medical.provenances.searchSearch Provenance resourcesread
Questionnaires2
canvas_medical.questionnaires.getRead a Questionnaire by idreadcanvas_medical.questionnaires.searchSearch Questionnaire resourcesread
Related people2
canvas_medical.related_people.getRead a RelatedPerson by idreadcanvas_medical.related_people.searchSearch RelatedPerson resourcesread
Service requests2
canvas_medical.service_requests.getRead a ServiceRequest by idreadcanvas_medical.service_requests.searchSearch ServiceRequest resourcesread
Specimens2
canvas_medical.specimens.getRead a Specimen by idreadcanvas_medical.specimens.searchSearch Specimen resourcesread
Capability statement1
canvas_medical.capability_statement.getRead the server's CapabilityStatement (metadata)read
Claim activity log items1
canvas_medical.claim_activity_log_items.createAdd an activity log item to a Claim ($add-activity-log-item)write
Coverage eligibility requests1
canvas_medical.coverage_eligibility_requests.createCreate a CoverageEligibilityRequestwrite
Lab reports1
canvas_medical.lab_reports.createCreate a lab report ($create-lab-report)write
Practitioner password resets1
canvas_medical.practitioner_password_resets.createSend a practitioner a reset-password email ($send-reset-password-email)write
Schedules1
canvas_medical.schedules.searchSearch Schedule resourcesread
Slots1
canvas_medical.slots.searchSearch Slot resourcesread
Smart configuration1
canvas_medical.smart_configuration.getRead the SMART on FHIR configurationread
Questions
The Canvas Medical MCP server, answered.
Is there a Canvas Medical MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 117 Canvas Medical actions across allergy intolerances, appointments, claims and conditions, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Canvas Medical.
What do I need to connect Canvas Medical?
Client ID of a Confidential OAuth application with the client-credentials grant, registered at [your… and Client Secret of that application. Plus your tenant host. The free call account { op: "connections.requirements", service: "canvas_medical" } lists exactly what to paste.
Can an AI agent change things in Canvas Medical?
Only if its key allows it. 37 Canvas Medical actions write, and none is destructive. A key can be limited to reads, capped, and set so a person confirms every write.
Will an AI agent use up my Canvas Medical API limit?
actionlake paces every call to the limits in the Canvas Medical service file: 10 calls a second per connection. Repeated reads are answered from cache (2 Canvas Medical actions can be), which never reaches Canvas Medical.
What does a Canvas Medical action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (117 Canvas Medical actions page). Cache hits, searches, dry runs and calls Canvas Medical refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
Which Canvas Medical API does it cover?
The Canvas FHIR R4 API (FHIR 4.0.1, US Core), docs.canvasmedical.com/api as of 2026-10-23 at your Canvas Medical instance's API base URL, which you enter when connecting. It is built from Canvas Medical's documentation as read on 23 October 2026. 117 actions in 46 areas, each one in the signed service file (version 1.0.0).
Can I combine Canvas Medical with my other systems?
Yes. ask joins Canvas Medical to ConnectWise PSA or NetSuite on the same customer and returns the answer rather than every row. Canvas Medical maps crm.company, which 227 other connectors also map.
Does actionlake keep my Canvas Medical data, and where?
actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Canvas Medical credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.
Which AI clients can use it?
Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.
Give your agent Canvas Medical today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.