# Canvas Medical MCP connector

The Canvas Medical connector brings appointments, allergy intolerances, care plans, care teams and claims to Claude, ChatGPT, Cursor and the Elaichi Agent, so each person works with the records their own Canvas Medical login already allows.

Source: https://elaichi.ai/connectors/canvasmedical/

## Facts

| | |
| --- | --- |
| Application | Canvas Medical |
| Category | Healthcare |
| AI tools | 160 |
| Authentication | Connects over OAuth |
| Bring your own OAuth app | Yes |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. Connected tools are never listed one by one, however few there are. The endpoint advertises `search_tools` and `execute_tool` instead |

## What you can ask once Canvas Medical is connected

- Which appointments are booked for tomorrow morning?
- List Dr. Patel's patients with a penicillin allergy intolerance.
- Which claims from last week still need a correction?

## Connect Canvas Medical in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Canvas Medical.
2. Optionally set Share with, then press Connect.
3. Supply your own Canvas Medical app, then approve. Canvas Medical needs an OAuth app you register yourself, so bring its client ID and secret. One person does this once for the organization.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Canvas Medical tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Canvas Medical MCP connector for Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Canvas Medical MCP connector for ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Canvas Medical MCP connector for Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Canvas Medical to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Every scope the client asks for starts ticked except "Delete data and remove access", which you tick yourself. Calling a Canvas Medical tool needs "Run your connected tools". Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Canvas Medical through Elaichi

### Book the visit while the patient is on the phone

Front desk. Find an open slot, create the appointment and confirm it back without leaving the conversation. Reschedules work the same way, by updating the existing appointment rather than starting over.

### Check allergies before the patient walks in

Clinical. Pull a patient's allergy intolerances and the matching allergens in one ask, so nothing reported at a previous visit gets missed in the room.

### Record a new allergy reported at intake

Nursing. When a patient mentions a reaction during intake, add the allergy intolerance to Canvas Medical on the spot and correct it later if the details change.

### Keep the care team current

Care coordination. See who is on a patient's care team, read the care plan they are working from, and update the team when a clinician joins or hands off.

### Draft the claim after the encounter

Billing. Create the claim for a completed visit, then search for last week's claims that still need a correction and update them in place.

### Find every appointment that needs rescheduling

Operations. Search appointments for a provider who is out next week, list the affected patients, and move each visit to a new time.

## Elaichi vs Zapier MCP vs Composio for Canvas Medical

All three can connect Canvas Medical to an AI assistant, and all three have admin controls. They differ in where access lives and how you pay.

| What to check | Elaichi | Zapier MCP | Composio |
| --- | --- | --- | --- |
| Where the AI connects | One address for the whole organization. Endpoint: https://api.elaichi.ai/mcp | A server per member, created at sign-in. | An MCP endpoint per team, or an SDK. |
| Control over Canvas Medical tools | Allow or restrict single Canvas Medical tools, per role or user. | App and action restrictions on the account. | Role permissions, down to the action. |
| Record of calls | One audit entry per Canvas Medical call. | A History tab of tool calls. | A log of every tool call. |
| Single sign-on | SAML or OIDC, plus SCIM, on Gold. | SAML on Enterprise. | SAML and OIDC on Enterprise. |
| Price | $15 per user per month. | 2 tasks per successful call. | Billed per tool call. |

Sources: Zapier MCP [docs](https://docs.zapier.com/mcp/get-started/quickstart), [security](https://docs.zapier.com/mcp/manage/security), [usage](https://docs.zapier.com/mcp/features/usage); Composio [docs](https://docs.composio.dev/docs/composio-connect), [gateway](https://composio.dev/mcp-gateway), [enterprise](https://composio.dev/enterprise), [pricing](https://composio.dev/pricing). Checked September 2026.

Longer take: [Zapier MCP alternative](/blog/zapier-mcp-alternative/) and [when you don't need an MCP gateway](/blog/when-you-dont-need-an-mcp-gateway/).

## Frequently asked questions

### How do I connect Canvas Medical to Claude?

Connect Canvas Medical in Elaichi first. Canvas Medical connects over OAuth, but it needs an OAuth application you register inside Canvas Medical yourself, so somebody brings a client ID and secret once and then each person signs in with their own Canvas Medical login. After that, paste https://api.elaichi.ai/mcp into Claude under Customize, then Connectors, then Add, and Canvas Medical is available in Claude.

### Does Canvas Medical work with ChatGPT and Cursor as well as Claude?

Yes. The Canvas Medical connector sits behind the same endpoint, https://api.elaichi.ai/mcp, for Claude, ChatGPT, Cursor, any MCP client and the Elaichi Agent. You connect Canvas Medical once in Elaichi and every client picks it up.

### What can an AI agent actually do with my Canvas Medical data?

It can look up and book appointments, read and record a patient's allergy intolerances, review care plans, see and update care teams, and create or correct claims in Canvas Medical. You ask in plain language, such as which appointments are booked for tomorrow morning. Short, concrete asks tend to get better results than long paragraphs.

### Does connecting Canvas Medical give the AI access to every patient record?

No. Every call to Canvas Medical runs as the person who signed in, so the AI can only reach the patients, appointments and claims that person could already open in Canvas Medical. Elaichi can narrow that further with roles and restrictions, and it never widens what Canvas Medical itself allows.

### Can my team share one Canvas Medical connection?

Yes. One person connects Canvas Medical in Elaichi and shares the connection with a team, and nobody else ever handles the client ID, secret or any other credential. Each teammate still signs in to Elaichi as themselves, so every Canvas Medical call in the audit log carries their own name.

### Can I stop an agent from deleting or changing things in Canvas Medical?

Yes. Restrictions in Elaichi apply per action, so you can allow reading appointments and claims in Canvas Medical while blocking creating or updating them. A restricted action is left out of the tool list the AI client sees, so it cannot be called no matter what the prompt says.

### What happens to a Canvas Medical connection when someone leaves?

Offboarding that person in Elaichi ends their Canvas Medical access at once, across Claude, ChatGPT, Cursor and every other client. A connection shared with the team keeps working for everyone else. If you want Canvas Medical gone entirely, disconnecting it once in Elaichi removes it from every client.

### Does the Canvas Medical MCP connector work with Gemini, Codex, Claude Code or other MCP clients?

Yes. Canvas Medical is reached over the same MCP endpoint every client uses, so anything that speaks MCP can call it — Gemini, Codex, Claude Code, Windsurf, Cline, Zed and OpenCode among them — alongside Claude, ChatGPT, Cursor, and the Elaichi Agent. The tools on offer and the access behind them are identical whichever client asks. Only the setup screen differs.

### Is Elaichi an alternative to Zapier MCP for Canvas Medical?

Yes. Both let Claude, ChatGPT or Cursor use Canvas Medical. Zapier MCP fits a team that already automates in Zapier, since each person signs in and acts as themselves in that account. Elaichi fits when IT wants one address for the whole company, per-tool rules by role, and a record of every Canvas Medical call.

### How is Elaichi different from Composio for Canvas Medical?

Composio gives AI agents tools and sign-in handling across 1,000+ apps, for developers building agents or people using an assistant, billed per tool call. Elaichi gives a company's own people governed access to Canvas Medical: one address, restrictions per role or user, and $15 per user per month. Both have role permissions and a log of every call.

## All 160 Canvas Medical tools

Every tool below is callable through https://api.elaichi.ai/mcp once Canvas Medical is connected, subject to the toolbox it is in and the restrictions on the caller.

- **Get single Canvas Medical allergen by ID** (Get). Get a single Allergen from Canvas by its id. Returns the FHIR R4 Allergen resource. Returns: resourceType, id, code. Required: id.
- **List all Canvas Medical allergens** (List). Search Allergen resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 Allergen resources, one page at a time. Needs either code or _text. Returns: resourceType, id, code. Required: one of code or _text.
- **Get single Canvas Medical allergy intolerance by ID** (Get). Get a single AllergyIntolerance from Canvas by its id. Returns the FHIR R4 AllergyIntolerance resource. Returns: resourceType, id, clinicalStatus, verificationStatus, type. Required: id.
- **List all Canvas Medical allergy intolerances** (List). Search AllergyIntolerance resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 AllergyIntolerance resources, one page at a time. Returns: resourceType, id, clinicalStatus, verificationStatus, type. No parameters are required.
- **Canvas Medical allergy intolerances search** (Search). Search AllergyIntolerance resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 AllergyIntolerance resources, one page at a time. Returns: resourceType, id, clinicalStatus, verificationStatus, type. No parameters are required.
- **Create a Canvas Medical allergy intolerance** (Create). Create a AllergyIntolerance in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: clinicalStatus, verificationStatus, type, code, patient.
- **Update a Canvas Medical allergy intolerance by ID** (Update). Replace a AllergyIntolerance in Canvas by sending the full FHIR AllergyIntolerance resource (PUT). Canvas answers 200 OK with an empty body. Required: id, clinicalStatus, verificationStatus, type, code, patient.
- **Get single Canvas Medical appointment by ID** (Get). Get a single Appointment from Canvas by its id. Returns the FHIR R4 Appointment resource. Returns: resourceType, id, status, appointmentType, reasonCode. Required: id.
- **List all Canvas Medical appointments** (List). Search Appointment resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 Appointment resources, one page at a time. The status filter takes one value per request. Returns: resourceType, id, status, appointmentType, reasonCode. No parameters are required.
- **Canvas Medical appointments search** (Search). Search Appointment resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 Appointment resources, one page at a time. The status filter takes one value per request.
Returns: resourceType, id, status, appointmentType, reasonCode. No parameters are required.
- **Create a Canvas Medical appointment** (Create). Create a Appointment in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: status, supportingInformation, start, end, participant.
- **Update a Canvas Medical appointment by ID** (Update). Replace a Appointment in Canvas by sending the full FHIR Appointment resource (PUT). Canvas answers 200 OK with an empty body. Required: id, status, supportingInformation, start, end, participant.
- **Get single Canvas Medical care plan by ID** (Get). Get a single CarePlan from Canvas by its id. Returns the FHIR R4 CarePlan resource. Returns: resourceType, id, status, intent, category. Required: id.
- **List all Canvas Medical care plans** (List). Search CarePlan resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 CarePlan resources, one page at a time. Returns: resourceType, id, status, intent, category. No parameters are required.
- **Canvas Medical care plans search** (Search). Search CarePlan resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 CarePlan resources, one page at a time. Returns: resourceType, id, status, intent, category. No parameters are required.
- **Get single Canvas Medical care team by ID** (Get). Get a single CareTeam from Canvas by its id. Returns the FHIR R4 CareTeam resource. Returns: resourceType, id, status, name, subject. Required: id.
- **List all Canvas Medical care teams** (List). Search CareTeam resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 CareTeam resources, one page at a time. Returns: resourceType, id, status, name, subject. No parameters are required.
- **Canvas Medical care teams search** (Search). Search CareTeam resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 CareTeam resources, one page at a time. Returns: resourceType, id, status, name, subject. No parameters are required.
- **Update a Canvas Medical care team by ID** (Update). Replace a CareTeam in Canvas by sending the full FHIR CareTeam resource (PUT). Canvas answers 200 OK with an empty body. Required: id.
- **Get single Canvas Medical claim by ID** (Get). Get a single Claim from Canvas by its id. Returns the FHIR R4 Claim resource. Returns: resourceType, id, status, type, use. Required: id.
- **List all Canvas Medical claims** (List). Search Claim resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 Claim resources, one page at a time. Returns: resourceType, id, status, type, use. No parameters are required.
- **Canvas Medical claims search** (Search). Search Claim resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 Claim resources, one page at a time. Returns: resourceType, id, status, type, use. No parameters are required.
- **Create a Canvas Medical claim** (Create). Create a Claim in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: status, type, use, patient, created, provider, priority, diagnosis, insurance, item.
- **Update a Canvas Medical claim by ID** (Update). Replace a Claim in Canvas by sending the full FHIR Claim resource (PUT). Canvas answers 200 OK with an empty body. Required: id, status, type, use, patient, created, provider, priority, insurance.
- **Get single Canvas Medical communication by ID** (Get). Get a single Communication from Canvas by its id. Returns the FHIR R4 Communication resource. Returns: resourceType, id, status, subject, sent. Required: id.
- **List all Canvas Medical communications** (List). Search Communication resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 Communication resources, one page at a time. Returns only messages between a practitioner and a patient. Returns: resourceType, id, status, subject, sent. No parameters are required.
- **Canvas Medical communications search** (Search). Search Communication resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 Communication resources, one page at a time. Returns only messages between a practitioner and a patient.
Returns: resourceType, id, status, subject, sent. No parameters are required.
- **Create a Canvas Medical communication** (Create). Create a Communication in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: status, recipient, sender, payload.
- **Get single Canvas Medical condition by ID** (Get). Get a single Condition from Canvas by its id. Returns the FHIR R4 Condition resource. Returns: resourceType, id, clinicalStatus, verificationStatus, category. Required: id.
- **List all Canvas Medical conditions** (List). Search Condition resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 Condition resources, one page at a time. Returns: resourceType, id, clinicalStatus, verificationStatus, category. No parameters are required.
- **Canvas Medical conditions search** (Search). Search Condition resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 Condition resources, one page at a time. Returns: resourceType, id, clinicalStatus, verificationStatus, category. No parameters are required.
- **Create a Canvas Medical condition** (Create). Create a Condition in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: clinicalStatus, category, code, subject.
- **Update a Canvas Medical condition by ID** (Update). Replace a Condition in Canvas by sending the full FHIR Condition resource (PUT). Canvas answers 200 OK with an empty body. Required: id, clinicalStatus, category, code, subject.
- **Get single Canvas Medical consent by ID** (Get). Get a single Consent from Canvas by its id. Returns the FHIR R4 Consent resource. Returns: resourceType, id, status, scope, category. Required: id.
- **List all Canvas Medical consents** (List). Search Consent resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 Consent resources, one page at a time. Returns: resourceType, id, status, scope, category. No parameters are required.
- **Canvas Medical consents search** (Search). Search Consent resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 Consent resources, one page at a time. Returns: resourceType, id, status, scope, category. No parameters are required.
- **Create a Canvas Medical consent** (Create). Create a Consent in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: status, scope, category, patient, sourceAttachment, provision.
- **Get single Canvas Medical coverage by ID** (Get). Get a single Coverage from Canvas by its id. Returns the FHIR R4 Coverage resource. Returns: resourceType, id, status, type, subscriber. Required: id.
- **List all Canvas Medical coverages** (List). Search Coverage resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 Coverage resources, one page at a time. Does not filter by date; each Coverage carries period.start and period.end. Returns: resourceType, id, status, type, subscriber. No parameters are required.
- **Canvas Medical coverages search** (Search). Search Coverage resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 Coverage resources, one page at a time. Does not filter by date; each Coverage carries period.start and period.end.
Returns: resourceType, id, status, type, subscriber. No parameters are required.
- **Create a Canvas Medical coverage** (Create). Create a Coverage in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: identifier, status, subscriber, beneficiary, relationship, payor, order.
- **Update a Canvas Medical coverage by ID** (Update). Replace a Coverage in Canvas by sending the full FHIR Coverage resource (PUT). Canvas answers 200 OK with an empty body. Required: id, identifier, status, subscriber, beneficiary, relationship, payor, order.
- **Get single Canvas Medical coverage eligibility response by ID** (Get). Get a single CoverageEligibilityResponse from Canvas by its id. Returns the FHIR R4 CoverageEligibilityResponse resource. Returns: resourceType, id, status, purpose, patient. Required: id.
- **List all Canvas Medical coverage eligibility responses** (List). Search CoverageEligibilityResponse resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 CoverageEligibilityResponse resources, one page at a time. Returns: resourceType, id, status, purpose, patient. No parameters are required.
- **Canvas Medical coverage eligibility responses search** (Search). Search CoverageEligibilityResponse resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 CoverageEligibilityResponse resources, one page at a time.
Returns: resourceType, id, status, purpose, patient. No parameters are required.
- **Get single Canvas Medical detected issue by ID** (Get). Get a single DetectedIssue from Canvas by its id. Returns the FHIR R4 DetectedIssue resource. Returns: resourceType, id, status, code, severity. Required: id.
- **List all Canvas Medical detected issues** (List). Search DetectedIssue resources in Canvas with FHIR search parameters. Returns the matching FHIR R4 DetectedIssue resources, one page at a time. Returns: resourceType, id, status, code, severity. No parameters are required.
- **Canvas Medical detected issues search** (Search). Search DetectedIssue resources with a form-encoded POST so search values stay out of the URL. Takes the same search parameters as the list method and returns the matching FHIR R4 DetectedIssue resources, one page at a time. Returns: resourceType, id, status, code, severity. No parameters are required.
- **Create a Canvas Medical detected issue** (Create). Create a DetectedIssue in Canvas. Canvas answers 201 Created with an empty body and puts the new id in the Location response header. Required: status, code, patient, identifiedDateTime, author, evidence.
- **Update a Canvas Medical detected issue by ID** (Update). Replace a DetectedIssue in Canvas by sending the full FHIR DetectedIssue resource (PUT). Canvas answers 200 OK with an empty body. Required: id, status, code, patient, identifiedDateTime, author, evidence.
- ...and 110 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
