---
title: "Open Dental MCP server for AI agents - actionlake"
description: "Give Claude 393 Open Dental actions through one MCP server: appointments, procedurelogs. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/open-dental
updated: 2026-10-23
---

Connectors · Accounting & finance

# Open Dental MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Open Dental and the rest of your systems. It gives your agent 393 Open Dental actions (182 reads, 171 writes and 40 that wait for a confirmation) and holds the Open Dental credential itself, so the agent never does. It paces Open Dental's limits and records every call.

[Connect Open Dental free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

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/mcp`

the first call

```
do {
  action: "open_dental.patients.simple",
  intent: "check which Open Dental account is connected"
}
# Patients GET Simple · read · 1 upstream call
```

- 393 actions in one signed file
- 182 read look, never change
- 171 write create and update
- 40 wait for a yes destructive, confirmed first

Set up

## Connect Open Dental in three steps.

1. 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`
2. 02
   ### Connect Open Dental.
   API key. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `developer_key` Open Dental Developer API key (from the Open Dental Developer Portal)
   - `customer_key` Customer API key for this dental office, generated in the Developer Portal and enabled by the office in Setup >…
   ```
   account { op: "connections.requirements", service: "open_dental" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "open_dental.patients.simple" }
   # patients get simple · read · 1 upstream call
   check { action: "open_dental.patients.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Open Dental at a glance

**Sign-in**

API key. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.

**You provide**

`developer_key` `customer_key`

**Limits we pace to**

60 calls a minute, per connection

**API covered**

Open Dental API v1 (https://api.opendental.com/api/v1)`api.opendental.com/api/v1`

**Built from**

Open Dental's documentation, read 23 October 2026[opendental.com](https://www.opendental.com/site/apispecification.html) [opendental.com](https://www.opendental.com/site/apiimplementation.html)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

Not cached: every read goes to the vendor

**Shared entities**

5, so ask can line Open Dental up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Open Dental.

393 actions in 107 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **182** read look, never change
- **171** write create and update
- **40** destructive wait for a confirmation

1. ### Appointments
   14
   6 read · 8 write · 0 destructive
   Appointments GET ASAP · Appointments POST (create) · Appointments POST Planned · Appointments POST SchedulePlanned
2. ### Procedurelogs
   11
   4 read · 5 write · 2 destructive
   ProcedureLogs POST (create) · ProcedureLogs POST GroupNote · ProcedureLogs POST InsuranceHistory · ProcedureLogs GET GroupNotes
3. ### Documents
   10
   2 read · 7 write · 1 destructive
   Documents POST DownloadMount · Documents POST DownloadSftp · Documents POST SetByUrl · Documents POST Thumbnails
4. ### Claimprocs
   9
   2 read · 6 write · 1 destructive
   ClaimProcs POST InsAdjust · ClaimProcs POST PendingSupplemental · ClaimProcs POST Supplemental · ClaimProcs GET (multiple)
5. ### Claims
   7
   2 read · 4 write · 1 destructive
   Claims POST (create) · Claims GET (multiple) · Claims GET (single) · Claims PUT (update)
6. ### Claimpayments
   6
   2 read · 3 write · 1 destructive
   ClaimPayments POST · ClaimPayments POST Batch · ClaimPayments GET (multiple) · ClaimPayments GET (single)
7. ### Payplans
   6
   2 read · 4 write · 0 destructive
   PayPlans POST (create) · PayPlans POST Dynamic · PayPlans GET (multiple) · PayPlans GET (single)
8. ### Recalls
   6
   2 read · 4 write · 0 destructive
   Recalls POST (create) · Recalls GET · Recalls GET List · Recalls PUT (update)

**99 more areas · 324 actions**

- Allergies **5**
- Apptfields **5**
- Benefits **5**
- Codegroups **5**
- Covspans **5**
- Definitions **5**
- Deposits **5**
- Diseases **5**
- Employers **5**
- Fees **5**
- Guardians **5**
- Inssubs **5**
- Labcases **5**
- Medicationpats **5**
- Medications **5**
- Patfields **5**
- Patients **5**
- Payments **5**
- Payplanlinks **5**
- Perioexams **5**
- Schedules **5**
- Treatplans **5**
- Vitalsigns **5**
- Allergydefs **4**
- Apptfielddefs **4**
- Carriers **4**
- Commlogs **4**
- Covcats **4**
- Discountplans **4**
- Discountplansubs **4**
- Employees **4**
- Eobattaches **4**
- Insplans **4**
- Laboratories **4**
- Labturnarounds **4**
- Patfielddefs **4**
- Patplans **4**
- Patrestrictions **4**
- Payplancharges **4**
- Periomeasures **4**
- Procedurecodes **4**
- Providers **4**
- Refattaches **4**
- Referrals **4**
- Statements **4**
- Subscriptions **4**
- Substitutionlinks **4**
- Tasknotes **4**
- Tasks **4**
- Toothinitials **4**
- Accountmodules **3**
- Adjustments **3**
- Asapcomms **3**
- Autonotecontrols **3**
- Autonotes **3**
- Chartmodules **3**
- Claimtrackings **3**
- Diseasedefs **3**
- Feescheds **3**
- Insverifies **3**
- Patientnotes **3**
- Popups **3**
- Proctps **3**
- Sheetfields **3**
- Sheets **3**
- Treatplanattaches **3**
- Userods **3**
- Appointmenttypes **2**
- Claimforms **2**
- Clinics **2**
- Clockevents **2**
- Ehrpatients **2**
- Grouppermissions **2**
- Operatories **2**
- Paysplits **2**
- Pharmacies **2**
- Procnotes **2**
- Queries **2**
- Quickpastecats **2**
- Quickpastenotes **2**
- Recalltypes **2**
- Reports **2**
- Rxpats **2**
- Sheetdefs **2**
- Sheetfielddefs **2**
- Computers **1**
- Etransmessagetexts **1**
- Etranss **1**
- Familymodules **1**
- Histappointments **1**
- Patientraces **1**
- Preferences **1**
- Scheduleops **1**
- Securitylogs **1**
- Securityperms **1**
- Signalods **1**
- Tasklists **1**
- Usergroupattaches **1**
- Usergroups **1**

Top actions

## The Open Dental API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 20 of Open Dental's 20 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `open_dental.patients.simple` Patients GET Simple | Gets a list of patients. | read | `crm.contact.list` 177 connectors |
| `open_dental.employers.list` Employers GET (multiple) | Gets a list of employers. | read | `crm.company.list` 162 connectors |
| `open_dental.userods.list` Userods GET | Gets a list of users (called userod since "user" is a reserved word in mysql). | read | `identity.user.list` 474 connectors |
| `open_dental.patients.create` Patients POST (create) | The only required fields are LName and FName. | write | `crm.contact.create` 161 connectors |
| `open_dental.employers.create` Employers POST (create) | Creates a new employer. | write | `crm.company.create` 142 connectors |
| `open_dental.employees.list` Employees GET (multiple) | Gets a list of employees. | read | `hr.employee.list` 61 connectors |
| `open_dental.tasks.list` Tasks GET (multiple) | Get a list of tasks that meet a set of search criteria. | read | `work.task.list` 122 connectors |
| `open_dental.employers.delete` Employers DELETE | Deletes an employer. | destructive | `crm.company.delete` 119 connectors |
| `open_dental.userods.create` Userods POST (create) | Userods POST (create). | write | `identity.user.create` 262 connectors |
| `open_dental.employees.create` Employees POST (create) | Creates a new employee. | write | `hr.employee.create` 51 connectors |
| `open_dental.tasks.create` Tasks POST (create) | Creates a new task. | write | `work.task.create` 127 connectors |
| `open_dental.fees.list` Fees GET (multiple) | Gets a list of fees. | read | this connector |

Try it

## Prompts to paste into Claude.

Each one names the Open Dental actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   Which Open Dental tasks are overdue, and who owns each one?
   calls `open_dental.tasks.list`
2. Write write
   Patients POST (create) in Open Dental. Show me exactly what you will send before you save it.
   calls `open_dental.patients.create`
3. Across systems read
   Which Open Dental companies have invoices in ConnectWise PSA, and how many each?
   calls `open_dental.employers.list` `connectwise_manage.invoices.list`

Across your systems

## Open Dental, joined to the rest of your business.

One `ask` fetches from Open Dental and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.

- Which Open Dental companies have invoices in ConnectWise PSA, and how many each?
  `open_dental.employers.list` + `connectwise_manage.invoices.list`, on `crm.company` · [ConnectWise PSA](https://actionlake.com/connectors/connectwise-psa)
- Which Open Dental companies have tickets in HubSpot CRM, and how many each?
  `open_dental.employers.list` + `hubspot_crm.tickets.list`, on `crm.company` · [HubSpot CRM](https://actionlake.com/connectors/hubspot-crm)

Also mapped by other connectors `identity.user` **517** `crm.company` **227** `crm.contact` **192** `work.task` **105** `hr.employee` **63**

ask

```
ask {
  intent: "which Open Dental companies have invoices in ConnectWise PSA, and how many each",
  steps: [
    { action: "open_dental.employers.list", 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"]
    } }
  ]
}
```

Example. Run it through check first: it validates the steps and prices them, and it is free.

Governance for Open Dental

## Destructive actions wait for a yes.

40 Open Dental actions are destructive. The first 10:

- Employers DELETE `open_dental.employers.delete`
- Fees DELETE `open_dental.fees.delete`
- Claims DELETE `open_dental.claims.delete`
- InsSubs DELETE `open_dental.inssubs.delete`
- ProcTPs DELETE `open_dental.proctps.delete`
- Benefits DELETE `open_dental.benefits.delete`
- CovSpans DELETE `open_dental.covspans.delete`
- Deposits DELETE `open_dental.deposits.delete`
- Diseases DELETE `open_dental.diseases.delete`
- LabCases DELETE `open_dental.labcases.delete`

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.

do open_dental.employers.delete confirm_policy: **human**

Employers DELETE?

**intent:** the user asked me to employers DELETE

run suspended · waiting for a named person · key _open-dental-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "open-dental-agent",
  allowed_actions: ["open_dental.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "open_dental.employers.delete", approver: "lead@example.com" },
    { match: "open_dental.fees.delete", approver: "lead@example.com" },
    { match: "open_dental.claims.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Open Dental only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Open Dental costs on actionlake.

Every Open Dental action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Open Dental 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.

- 1 upstream call per action all 393 Open Dental actions
- 393 actions page each page of a long list is one call
- 0 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Open Dental action.

393 actions by area: the id your agent calls, what it does, and its effect.

**Appointments 14**

- `open_dental.appointments.asap` Appointments GET ASAP read
- `open_dental.appointments.create` Appointments POST (create) write
- `open_dental.appointments.create_planned` Appointments POST Planned write
- `open_dental.appointments.create_schedule_planned` Appointments POST SchedulePlanned write
- `open_dental.appointments.create_web_sched` Appointments POST WebSched write
- `open_dental.appointments.get` Appointments GET (single) read
- and 8 more in this area

**Procedurelogs 11**

- `open_dental.procedurelogs.create` ProcedureLogs POST (create) write
- `open_dental.procedurelogs.create_group_note` ProcedureLogs POST GroupNote write
- `open_dental.procedurelogs.create_insurance_history` ProcedureLogs POST InsuranceHistory write
- `open_dental.procedurelogs.group_notes` ProcedureLogs GET GroupNotes read
- `open_dental.procedurelogs.delete` ProcedureLogs DELETE destructive
- `open_dental.procedurelogs.delete_group_note` ProcedureLogs DELETE GroupNote destructive
- and 5 more in this area

**Documents 10**

- `open_dental.documents.create_download_mount` Documents POST DownloadMount write
- `open_dental.documents.create_download_sftp` Documents POST DownloadSftp write
- `open_dental.documents.create_set_by_url` Documents POST SetByUrl write
- `open_dental.documents.create_thumbnails` Documents POST Thumbnails write
- `open_dental.documents.create_upload` Documents POST Upload write
- `open_dental.documents.create_upload_sftp` Documents POST UploadSftp write
- and 4 more in this area

**Claimprocs 9**

- `open_dental.claimprocs.create_ins_adjust` ClaimProcs POST InsAdjust write
- `open_dental.claimprocs.create_pending_supplemental` ClaimProcs POST PendingSupplemental write
- `open_dental.claimprocs.create_supplemental` ClaimProcs POST Supplemental write
- `open_dental.claimprocs.list` ClaimProcs GET (multiple) read
- `open_dental.claimprocs.delete` ClaimProcs DELETE destructive
- `open_dental.claimprocs.get` ClaimProcs GET (single) read
- and 3 more in this area

**Claims 7**

- `open_dental.claims.create` Claims POST (create) write
- `open_dental.claims.get` Claims GET (single) read
- `open_dental.claims.list` Claims GET (multiple) read
- `open_dental.claims.update` Claims PUT (update) write
- `open_dental.claims.delete` Claims DELETE destructive
- `open_dental.claims.update_split` Claims PUT Split write
- and 1 more in this area

**Claimpayments 6**

- `open_dental.claimpayments.create` ClaimPayments POST write
- `open_dental.claimpayments.create_batch` ClaimPayments POST Batch write
- `open_dental.claimpayments.get` ClaimPayments GET (single) read
- `open_dental.claimpayments.list` ClaimPayments GET (multiple) read
- `open_dental.claimpayments.delete` ClaimPayments DELETE destructive
- `open_dental.claimpayments.update` ClaimPayments PUT write

**Payplans 6**

- `open_dental.payplans.create` PayPlans POST (create) write
- `open_dental.payplans.create_dynamic` PayPlans POST Dynamic write
- `open_dental.payplans.get` PayPlans GET (single) read
- `open_dental.payplans.list` PayPlans GET (multiple) read
- `open_dental.payplans.update_close` PayPlans PUT Close write
- `open_dental.payplans.update_dynamic` PayPlans PUT Dynamic write

**Recalls 6**

- `open_dental.recalls.create` Recalls POST (create) write
- `open_dental.recalls.list` Recalls GET read
- `open_dental.recalls.recall_list` Recalls GET List read
- `open_dental.recalls.update` Recalls PUT (update) write
- `open_dental.recalls.update_status` Recalls PUT Status write
- `open_dental.recalls.update_switch_type` Recalls PUT SwitchType write

**Allergies 5**

- `open_dental.allergies.create` Allergies POST write
- `open_dental.allergies.get` Allergies GET (single) read
- `open_dental.allergies.list` Allergies GET (multiple) read
- `open_dental.allergies.update` Allergies PUT write
- `open_dental.allergies.delete` Allergies DELETE destructive

**Apptfields 5**

- `open_dental.apptfields.create` ApptFields POST (create) write
- `open_dental.apptfields.get` ApptFields GET (single) read
- `open_dental.apptfields.list` ApptFields GET (multiple) read
- `open_dental.apptfields.update` ApptFields PUT write
- `open_dental.apptfields.delete` ApptFields DELETE destructive

**Benefits 5**

- `open_dental.benefits.create` Benefits POST (create) write
- `open_dental.benefits.get` Benefits GET (single) read
- `open_dental.benefits.list` Benefits GET (multiple) read
- `open_dental.benefits.update` Benefits PUT (update) write
- `open_dental.benefits.delete` Benefits DELETE destructive

**Codegroups 5**

- `open_dental.codegroups.create` CodeGroups POST (create) write
- `open_dental.codegroups.get` CodeGroups GET (single) read
- `open_dental.codegroups.list` CodeGroups GET (multiple) read
- `open_dental.codegroups.update` CodeGroups PUT (update) write
- `open_dental.codegroups.delete` CodeGroups DELETE destructive

**Covspans 5**

- `open_dental.covspans.create` CovSpans POST (create) write
- `open_dental.covspans.get` CovSpans GET (single) read
- `open_dental.covspans.list` CovSpans GET (multiple) read
- `open_dental.covspans.update` CovSpans PUT (update) write
- `open_dental.covspans.delete` CovSpans DELETE destructive

**Definitions 5**

- `open_dental.definitions.create` Definitions POST (create) write
- `open_dental.definitions.def_cat_options` Definitions GET DefCatOptions read
- `open_dental.definitions.get` Definitions GET (single) read
- `open_dental.definitions.list` Definitions GET (multiple) read
- `open_dental.definitions.update` Definitions PUT write

**Deposits 5**

- `open_dental.deposits.create` Deposits POST write
- `open_dental.deposits.get` Deposits GET (single) read
- `open_dental.deposits.list` Deposits GET (multiple) read
- `open_dental.deposits.update` Deposits PUT write
- `open_dental.deposits.delete` Deposits DELETE destructive

**Diseases 5**

- `open_dental.diseases.create` Diseases POST write
- `open_dental.diseases.get` Diseases GET (single) read
- `open_dental.diseases.list` Diseases GET (multiple) read
- `open_dental.diseases.update` Diseases PUT write
- `open_dental.diseases.delete` Diseases DELETE destructive

**Employers 5**

- `open_dental.employers.create` Employers POST (create) write
- `open_dental.employers.get` Employers GET (single) read
- `open_dental.employers.list` Employers GET (multiple) read
- `open_dental.employers.update` Employers PUT (update) write
- `open_dental.employers.delete` Employers DELETE destructive

**Fees 5**

- `open_dental.fees.create` Fees POST (create) write
- `open_dental.fees.get` Fees GET (single) read
- `open_dental.fees.list` Fees GET (multiple) read
- `open_dental.fees.update` Fees PUT (update) write
- `open_dental.fees.delete` Fees DELETE destructive

**Guardians 5**

- `open_dental.guardians.create` Guardians POST (create) write
- `open_dental.guardians.get` Guardians GET (single) read
- `open_dental.guardians.list` Guardians GET (multiple) read
- `open_dental.guardians.update` Guardians PUT (update) write
- `open_dental.guardians.delete` Guardians DELETE destructive

**Inssubs 5**

- `open_dental.inssubs.create` InsSubs POST (create) write
- `open_dental.inssubs.get` InsSubs GET (single) read
- `open_dental.inssubs.list` InsSubs GET (multiple) read
- `open_dental.inssubs.update` InsSubs PUT (update) write
- `open_dental.inssubs.delete` InsSubs DELETE destructive

**Labcases 5**

- `open_dental.labcases.create` LabCases POST (create) write
- `open_dental.labcases.get` LabCases GET (single) read
- `open_dental.labcases.list` LabCases GET (multiple) read
- `open_dental.labcases.update` LabCases PUT (update) write
- `open_dental.labcases.delete` LabCases DELETE destructive

**Medicationpats 5**

- `open_dental.medicationpats.create` MedicationPats POST write
- `open_dental.medicationpats.get` MedicationPats GET (single) read
- `open_dental.medicationpats.list` MedicationPats GET (multiple) read
- `open_dental.medicationpats.update` MedicationPats PUT write
- `open_dental.medicationpats.delete` MedicationPats DELETE destructive

**Medications 5**

- `open_dental.medications.create` Medications POST write
- `open_dental.medications.get` Medications GET (single) read
- `open_dental.medications.list` Medications GET (multiple) read
- `open_dental.medications.update` Medications PUT write
- `open_dental.medications.delete` Medications DELETE destructive

**Patfields 5**

- `open_dental.patfields.create` PatFields POST (create) write
- `open_dental.patfields.get` PatFields GET (single) read
- `open_dental.patfields.list` PatFields GET (multiple) read
- `open_dental.patfields.update` PatFields PUT write
- `open_dental.patfields.delete` PatFields DELETE destructive

**Patients 5**

- `open_dental.patients.create` Patients POST (create) write
- `open_dental.patients.get` Patients GET (single) read
- `open_dental.patients.simple` Patients GET Simple read
- `open_dental.patients.update` Patients PUT (update) write
- `open_dental.patients.list` Patients GET (multiple) read

**Payments 5**

- `open_dental.payments.create` Payments POST (create) write
- `open_dental.payments.list` Payments GET read
- `open_dental.payments.update` Payments PUT (update) write
- `open_dental.payments.update_partial` Payments PUT Partial write
- `open_dental.payments.create_refund` Payments POST Refund destructive

**Payplanlinks 5**

- `open_dental.payplanlinks.create` PayPlanLinks POST (create) write
- `open_dental.payplanlinks.get` PayPlanLinks GET (single) read
- `open_dental.payplanlinks.list` PayPlanLinks GET (multiple) read
- `open_dental.payplanlinks.update` PayPlans PUT (update) write
- `open_dental.payplanlinks.delete` PayPlanLinks DELETE destructive

**Perioexams 5**

- `open_dental.perioexams.create` PerioExams POST write
- `open_dental.perioexams.get` PerioExams GET (single) read
- `open_dental.perioexams.list` PerioExams GET (multiple) read
- `open_dental.perioexams.update` PerioExams PUT (update) write
- `open_dental.perioexams.delete` PerioExams DELETE destructive

**Schedules 5**

- `open_dental.schedules.create_blockout` Schedules POST Blockout write
- `open_dental.schedules.get` Schedules GET (single) read
- `open_dental.schedules.list` Schedules GET (multiple) read
- `open_dental.schedules.update_blockout` Schedules PUT Blockout write
- `open_dental.schedules.delete_blockout` Schedules DELETE Blockout destructive

**Treatplans 5**

- `open_dental.treatplans.create` TreatPlans POST (create) write
- `open_dental.treatplans.create_saved` TreatPlans POST Saved write
- `open_dental.treatplans.list` TreatPlans GET read
- `open_dental.treatplans.update` TreatPlans PUT (update) write
- `open_dental.treatplans.delete` TreatPlans DELETE destructive

Vitalsigns **5** Allergydefs **4** Apptfielddefs **4** Carriers **4** Commlogs **4** Covcats **4** Discountplans **4** Discountplansubs **4** Employees **4** Eobattaches **4** Insplans **4** Laboratories **4** Labturnarounds **4** Patfielddefs **4** Patplans **4** Patrestrictions **4** Payplancharges **4** Periomeasures **4** Procedurecodes **4** Providers **4** Refattaches **4** Referrals **4** Statements **4** Subscriptions **4** Substitutionlinks **4** Tasknotes **4** Tasks **4** Toothinitials **4** Accountmodules **3** Adjustments **3** Asapcomms **3** Autonotecontrols **3** Autonotes **3** Chartmodules **3** Claimtrackings **3** Diseasedefs **3** Feescheds **3** Insverifies **3** Patientnotes **3** Popups **3** Proctps **3** Sheetfields **3** Sheets **3** Treatplanattaches **3** Userods **3** Appointmenttypes **2** Claimforms **2** Clinics **2** Clockevents **2** Ehrpatients **2** Grouppermissions **2** Operatories **2** Paysplits **2** Pharmacies **2** Procnotes **2** Queries **2** Quickpastecats **2** Quickpastenotes **2** Recalltypes **2** Reports **2** Rxpats **2** Sheetdefs **2** Sheetfielddefs **2** Computers **1** Etransmessagetexts **1** Etranss **1** Familymodules **1** Histappointments **1** Patientraces **1** Preferences **1** Scheduleops **1** Securitylogs **1** Securityperms **1** Signalods **1** Tasklists **1** Usergroupattaches **1** Usergroups **1**

This index shows a sample of each area. All 393 actions, with their inputs and prices, are in the [catalogue](https://actionlake.com/console/catalogue), which a free sandbox key can search.

Questions

## The Open Dental MCP server, answered.

**Is there an Open Dental MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 393 Open Dental actions across appointments, procedurelogs, documents and claimprocs, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Open Dental.

**What do I need to connect Open Dental?**

Open Dental Developer API key (from the Open Dental Developer Portal) and Customer API key for this dental office, generated in the Developer Portal and enabled by the office in Setup >…. The free call account { op: "connections.requirements", service: "open_dental" } lists exactly what to paste.

**Can an AI agent delete or change things in Open Dental?**

Only if its key allows it, and only with an explicit confirmation. 40 Open Dental actions are destructive, including employers DELETE, fees DELETE and claims DELETE. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Open Dental API limit?**

actionlake paces every call to the limits in the Open Dental service file: 60 calls a minute per connection.

**What does an Open Dental action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (393 Open Dental actions page). Cache hits, searches, dry runs and calls Open Dental 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 Open Dental API does it cover?**

The Open Dental API v1 (https://api.opendental.com/api/v1) at api.opendental.com/api/v1. It is built from Open Dental's documentation as read on 23 October 2026. 393 actions in 107 areas, each one in the signed service file (version 1.0.0).

**Can I combine Open Dental with my other systems?**

Yes. ask joins Open Dental to ConnectWise PSA or HubSpot CRM on the same customer and returns the answer rather than every row. Open Dental maps crm.company, which 227 other connectors also map.

**Does actionlake keep my Open Dental data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Open Dental responses are not cached. 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 Open Dental 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.

## More connectors like Open Dental

Shares the most action names with

- [Simpro 17](https://actionlake.com/connectors/simpro)
- [Harvest 16](https://actionlake.com/connectors/harvest)
- [Karbon 14](https://actionlake.com/connectors/karbon)
- [ChartMogul 13](https://actionlake.com/connectors/chartmogul)
- [HighLevel (LeadConnector) 11](https://actionlake.com/connectors/highlevel-leadconnector)
- [Hubstaff 9](https://actionlake.com/connectors/hubstaff)

Joins with, on shared entities

- [Bitrix24 4](https://actionlake.com/connectors/bitrix24)
- [Zoho Desk 4](https://actionlake.com/connectors/zoho-desk)
- [Microsoft Dynamics 365 4](https://actionlake.com/connectors/microsoft-dynamics-365)
- [Productive.io 4](https://actionlake.com/connectors/productive-io)
- [ActiveCampaign 4](https://actionlake.com/connectors/activecampaign)
- [Insightly CRM 4](https://actionlake.com/connectors/insightly-crm)

Browse

- [All Accounting & finance connectors](https://actionlake.com/connectors/category/accounting-and-finance)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Open Dental; the name is the vendor's own. Counts are from the Open Dental service file, version 1.0.0.

## Give your agent Open Dental today.

[Connect Open Dental free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/open-dental
More: https://actionlake.com/llms.txt
