Skip to content

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.

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
  • 393actionsin one signed file
  • 182readlook, never change
  • 171writecreate and update
  • 40wait for a yesdestructive, 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_keyOpen Dental Developer API key (from the Open Dental Developer Portal)
    • customer_keyCustomer 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 callcheck { 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_keycustomer_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 2026opendental.comopendental.com
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.

  • 182readlook, never change
  • 171writecreate and update
  • 40destructivewait 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.

ActionWhat it doesEffectSame name in
open_dental.patients.simplePatients GET SimpleGets a list of patients.readcrm.contact.list177 connectors
open_dental.employers.listEmployers GET (multiple)Gets a list of employers.readcrm.company.list162 connectors
open_dental.userods.listUserods GETGets a list of users (called userod since "user" is a reserved word in mysql).readidentity.user.list474 connectors
open_dental.patients.createPatients POST (create)The only required fields are LName and FName.writecrm.contact.create161 connectors
open_dental.employers.createEmployers POST (create)Creates a new employer.writecrm.company.create142 connectors
open_dental.employees.listEmployees GET (multiple)Gets a list of employees.readhr.employee.list61 connectors
open_dental.tasks.listTasks GET (multiple)Get a list of tasks that meet a set of search criteria.readwork.task.list122 connectors
open_dental.employers.deleteEmployers DELETEDeletes an employer.destructivecrm.company.delete119 connectors
open_dental.userods.createUserods POST (create)Userods POST (create).writeidentity.user.create262 connectors
open_dental.employees.createEmployees POST (create)Creates a new employee.writehr.employee.create51 connectors
open_dental.tasks.createTasks POST (create)Creates a new task.writework.task.create127 connectors
open_dental.fees.listFees GET (multiple)Gets a list of fees.readthis 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. Readread

    Which Open Dental tasks are overdue, and who owns each one?

    callsopen_dental.tasks.list

  2. Writewrite

    Patients POST (create) in Open Dental. Show me exactly what you will send before you save it.

    callsopen_dental.patients.create

  3. Across systemsread

    Which Open Dental companies have invoices in ConnectWise PSA, and how many each?

    callsopen_dental.employers.listconnectwise_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

  • 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

Also mapped by other connectorsidentity.user 517crm.company 227crm.contact 192work.task 105hr.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 DELETEopen_dental.employers.delete
  • Fees DELETEopen_dental.fees.delete
  • Claims DELETEopen_dental.claims.delete
  • InsSubs DELETEopen_dental.inssubs.delete
  • ProcTPs DELETEopen_dental.proctps.delete
  • Benefits DELETEopen_dental.benefits.delete
  • CovSpans DELETEopen_dental.covspans.delete
  • Deposits DELETEopen_dental.deposits.delete
  • Diseases DELETEopen_dental.diseases.delete
  • LabCases DELETEopen_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.

doopen_dental.employers.deleteconfirm_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: "[email protected]" },    { match: "open_dental.fees.delete", approver: "[email protected]" },    { match: "open_dental.claims.delete", approver: "[email protected]" }  ]}
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.

  • 1upstream call per actionall 393 Open Dental actions
  • 393actions pageeach page of a long list is one call
  • 0reads can be cacheda cache hit costs nothing
  • 100,000calls a month, freepaid plans from US$49 a month for 250,000

See pricing

Action index

Every Open Dental action.

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

Appointments14
  • open_dental.appointments.asapAppointments GET ASAPread
  • open_dental.appointments.createAppointments POST (create)write
  • open_dental.appointments.create_plannedAppointments POST Plannedwrite
  • open_dental.appointments.create_schedule_plannedAppointments POST SchedulePlannedwrite
  • open_dental.appointments.create_web_schedAppointments POST WebSchedwrite
  • open_dental.appointments.getAppointments GET (single)read
  • and 8 more in this area
Procedurelogs11
  • open_dental.procedurelogs.createProcedureLogs POST (create)write
  • open_dental.procedurelogs.create_group_noteProcedureLogs POST GroupNotewrite
  • open_dental.procedurelogs.create_insurance_historyProcedureLogs POST InsuranceHistorywrite
  • open_dental.procedurelogs.group_notesProcedureLogs GET GroupNotesread
  • open_dental.procedurelogs.deleteProcedureLogs DELETEdestructive
  • open_dental.procedurelogs.delete_group_noteProcedureLogs DELETE GroupNotedestructive
  • and 5 more in this area
Documents10
  • open_dental.documents.create_download_mountDocuments POST DownloadMountwrite
  • open_dental.documents.create_download_sftpDocuments POST DownloadSftpwrite
  • open_dental.documents.create_set_by_urlDocuments POST SetByUrlwrite
  • open_dental.documents.create_thumbnailsDocuments POST Thumbnailswrite
  • open_dental.documents.create_uploadDocuments POST Uploadwrite
  • open_dental.documents.create_upload_sftpDocuments POST UploadSftpwrite
  • and 4 more in this area
Claimprocs9
  • open_dental.claimprocs.create_ins_adjustClaimProcs POST InsAdjustwrite
  • open_dental.claimprocs.create_pending_supplementalClaimProcs POST PendingSupplementalwrite
  • open_dental.claimprocs.create_supplementalClaimProcs POST Supplementalwrite
  • open_dental.claimprocs.listClaimProcs GET (multiple)read
  • open_dental.claimprocs.deleteClaimProcs DELETEdestructive
  • open_dental.claimprocs.getClaimProcs GET (single)read
  • and 3 more in this area
Claims7
  • open_dental.claims.createClaims POST (create)write
  • open_dental.claims.getClaims GET (single)read
  • open_dental.claims.listClaims GET (multiple)read
  • open_dental.claims.updateClaims PUT (update)write
  • open_dental.claims.deleteClaims DELETEdestructive
  • open_dental.claims.update_splitClaims PUT Splitwrite
  • and 1 more in this area
Claimpayments6
  • open_dental.claimpayments.createClaimPayments POSTwrite
  • open_dental.claimpayments.create_batchClaimPayments POST Batchwrite
  • open_dental.claimpayments.getClaimPayments GET (single)read
  • open_dental.claimpayments.listClaimPayments GET (multiple)read
  • open_dental.claimpayments.deleteClaimPayments DELETEdestructive
  • open_dental.claimpayments.updateClaimPayments PUTwrite
Payplans6
  • open_dental.payplans.createPayPlans POST (create)write
  • open_dental.payplans.create_dynamicPayPlans POST Dynamicwrite
  • open_dental.payplans.getPayPlans GET (single)read
  • open_dental.payplans.listPayPlans GET (multiple)read
  • open_dental.payplans.update_closePayPlans PUT Closewrite
  • open_dental.payplans.update_dynamicPayPlans PUT Dynamicwrite
Recalls6
  • open_dental.recalls.createRecalls POST (create)write
  • open_dental.recalls.listRecalls GETread
  • open_dental.recalls.recall_listRecalls GET Listread
  • open_dental.recalls.updateRecalls PUT (update)write
  • open_dental.recalls.update_statusRecalls PUT Statuswrite
  • open_dental.recalls.update_switch_typeRecalls PUT SwitchTypewrite
Allergies5
  • open_dental.allergies.createAllergies POSTwrite
  • open_dental.allergies.getAllergies GET (single)read
  • open_dental.allergies.listAllergies GET (multiple)read
  • open_dental.allergies.updateAllergies PUTwrite
  • open_dental.allergies.deleteAllergies DELETEdestructive
Apptfields5
  • open_dental.apptfields.createApptFields POST (create)write
  • open_dental.apptfields.getApptFields GET (single)read
  • open_dental.apptfields.listApptFields GET (multiple)read
  • open_dental.apptfields.updateApptFields PUTwrite
  • open_dental.apptfields.deleteApptFields DELETEdestructive
Benefits5
  • open_dental.benefits.createBenefits POST (create)write
  • open_dental.benefits.getBenefits GET (single)read
  • open_dental.benefits.listBenefits GET (multiple)read
  • open_dental.benefits.updateBenefits PUT (update)write
  • open_dental.benefits.deleteBenefits DELETEdestructive
Codegroups5
  • open_dental.codegroups.createCodeGroups POST (create)write
  • open_dental.codegroups.getCodeGroups GET (single)read
  • open_dental.codegroups.listCodeGroups GET (multiple)read
  • open_dental.codegroups.updateCodeGroups PUT (update)write
  • open_dental.codegroups.deleteCodeGroups DELETEdestructive
Covspans5
  • open_dental.covspans.createCovSpans POST (create)write
  • open_dental.covspans.getCovSpans GET (single)read
  • open_dental.covspans.listCovSpans GET (multiple)read
  • open_dental.covspans.updateCovSpans PUT (update)write
  • open_dental.covspans.deleteCovSpans DELETEdestructive
Definitions5
  • open_dental.definitions.createDefinitions POST (create)write
  • open_dental.definitions.def_cat_optionsDefinitions GET DefCatOptionsread
  • open_dental.definitions.getDefinitions GET (single)read
  • open_dental.definitions.listDefinitions GET (multiple)read
  • open_dental.definitions.updateDefinitions PUTwrite
Deposits5
  • open_dental.deposits.createDeposits POSTwrite
  • open_dental.deposits.getDeposits GET (single)read
  • open_dental.deposits.listDeposits GET (multiple)read
  • open_dental.deposits.updateDeposits PUTwrite
  • open_dental.deposits.deleteDeposits DELETEdestructive
Diseases5
  • open_dental.diseases.createDiseases POSTwrite
  • open_dental.diseases.getDiseases GET (single)read
  • open_dental.diseases.listDiseases GET (multiple)read
  • open_dental.diseases.updateDiseases PUTwrite
  • open_dental.diseases.deleteDiseases DELETEdestructive
Employers5
  • open_dental.employers.createEmployers POST (create)write
  • open_dental.employers.getEmployers GET (single)read
  • open_dental.employers.listEmployers GET (multiple)read
  • open_dental.employers.updateEmployers PUT (update)write
  • open_dental.employers.deleteEmployers DELETEdestructive
Fees5
  • open_dental.fees.createFees POST (create)write
  • open_dental.fees.getFees GET (single)read
  • open_dental.fees.listFees GET (multiple)read
  • open_dental.fees.updateFees PUT (update)write
  • open_dental.fees.deleteFees DELETEdestructive
Guardians5
  • open_dental.guardians.createGuardians POST (create)write
  • open_dental.guardians.getGuardians GET (single)read
  • open_dental.guardians.listGuardians GET (multiple)read
  • open_dental.guardians.updateGuardians PUT (update)write
  • open_dental.guardians.deleteGuardians DELETEdestructive
Inssubs5
  • open_dental.inssubs.createInsSubs POST (create)write
  • open_dental.inssubs.getInsSubs GET (single)read
  • open_dental.inssubs.listInsSubs GET (multiple)read
  • open_dental.inssubs.updateInsSubs PUT (update)write
  • open_dental.inssubs.deleteInsSubs DELETEdestructive
Labcases5
  • open_dental.labcases.createLabCases POST (create)write
  • open_dental.labcases.getLabCases GET (single)read
  • open_dental.labcases.listLabCases GET (multiple)read
  • open_dental.labcases.updateLabCases PUT (update)write
  • open_dental.labcases.deleteLabCases DELETEdestructive
Medicationpats5
  • open_dental.medicationpats.createMedicationPats POSTwrite
  • open_dental.medicationpats.getMedicationPats GET (single)read
  • open_dental.medicationpats.listMedicationPats GET (multiple)read
  • open_dental.medicationpats.updateMedicationPats PUTwrite
  • open_dental.medicationpats.deleteMedicationPats DELETEdestructive
Medications5
  • open_dental.medications.createMedications POSTwrite
  • open_dental.medications.getMedications GET (single)read
  • open_dental.medications.listMedications GET (multiple)read
  • open_dental.medications.updateMedications PUTwrite
  • open_dental.medications.deleteMedications DELETEdestructive
Patfields5
  • open_dental.patfields.createPatFields POST (create)write
  • open_dental.patfields.getPatFields GET (single)read
  • open_dental.patfields.listPatFields GET (multiple)read
  • open_dental.patfields.updatePatFields PUTwrite
  • open_dental.patfields.deletePatFields DELETEdestructive
Patients5
  • open_dental.patients.createPatients POST (create)write
  • open_dental.patients.getPatients GET (single)read
  • open_dental.patients.simplePatients GET Simpleread
  • open_dental.patients.updatePatients PUT (update)write
  • open_dental.patients.listPatients GET (multiple)read
Payments5
  • open_dental.payments.createPayments POST (create)write
  • open_dental.payments.listPayments GETread
  • open_dental.payments.updatePayments PUT (update)write
  • open_dental.payments.update_partialPayments PUT Partialwrite
  • open_dental.payments.create_refundPayments POST Refunddestructive
Payplanlinks5
  • open_dental.payplanlinks.createPayPlanLinks POST (create)write
  • open_dental.payplanlinks.getPayPlanLinks GET (single)read
  • open_dental.payplanlinks.listPayPlanLinks GET (multiple)read
  • open_dental.payplanlinks.updatePayPlans PUT (update)write
  • open_dental.payplanlinks.deletePayPlanLinks DELETEdestructive
Perioexams5
  • open_dental.perioexams.createPerioExams POSTwrite
  • open_dental.perioexams.getPerioExams GET (single)read
  • open_dental.perioexams.listPerioExams GET (multiple)read
  • open_dental.perioexams.updatePerioExams PUT (update)write
  • open_dental.perioexams.deletePerioExams DELETEdestructive
Schedules5
  • open_dental.schedules.create_blockoutSchedules POST Blockoutwrite
  • open_dental.schedules.getSchedules GET (single)read
  • open_dental.schedules.listSchedules GET (multiple)read
  • open_dental.schedules.update_blockoutSchedules PUT Blockoutwrite
  • open_dental.schedules.delete_blockoutSchedules DELETE Blockoutdestructive
Treatplans5
  • open_dental.treatplans.createTreatPlans POST (create)write
  • open_dental.treatplans.create_savedTreatPlans POST Savedwrite
  • open_dental.treatplans.listTreatPlans GETread
  • open_dental.treatplans.updateTreatPlans PUT (update)write
  • open_dental.treatplans.deleteTreatPlans DELETEdestructive

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

This index shows a sample of each area. All 393 actions, with their inputs and prices, are in the 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.

Give your agent Open Dental today.

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