Skip to main content
Glama
open-dental-mcp

open-dental-mcp

by sanjibani

open-dental-mcp

Model Context Protocol (MCP) server for Open Dental — dental practice management software.

Talk to your Open Dental data from Claude, Cursor, or any MCP client. Read patients, appointments, providers, procedures, recalls. Write communications (phone calls, messages) back to patient charts.

Built against the Open Dental REST API. No existing MCP for Open Dental — this is the first.


What you can do with it

You:   "Pull patient 4523 and show me their last 5 appointments + outstanding recalls."
Claude: *calls get_patient, then find_appointments, then find_recalls*

You:   "Find every recall due this month and draft a friendly reminder for each."
Claude: *calls find_recalls with due_date window, drafts the messages*

You:   "Just got off a call with the Smith family about rescheduling — log it."
Claude: *calls log_communication with the right comm_type + comm_mode*

You:   "What providers are working at clinic 2 tomorrow?"
Claude: *calls list_providers + find_appointments, filters*

Related MCP server: personaleasy-mcp-server

Install

pip install -e .

Configure

You need two API keys from Open Dental's Developer Portal:

  1. Developer API Key — applies to your integration (you register via vendor.relations@opendental.com)

  2. Customer API Key — generated per-customer in the Developer Portal

export OPENDENTAL_DEVELOPER_KEY="..."
export OPENDENTAL_CUSTOMER_KEY="..."

Who uses this server?

  1. Approved Open Dental API Partners building tools for dental practices. Your developer key + customer keys work directly.

  2. Dental practices / DSOs doing custom integration work. Email vendor.relations@opendental.com to get set up.

Use with Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "open_dental_mcp": {
      "command": "open_dental_mcp",
      "env": {
        "OPENDENTAL_DEVELOPER_KEY": "your-developer-key",
        "OPENDENTAL_CUSTOMER_KEY": "your-customer-key"
      }
    }
  }
}

Tools

Tool

Type

What it does

health_check

Diagnostic

Verifies credentials

get_patient

Read

Fetch a patient by PatNum

find_patients

Read

Search by name / phone / email / DOB

update_patient

Write

Patch patient fields

get_appointment

Read

Fetch an appointment by AptNum

find_appointments

Read

List appointments (by date / patient / provider)

create_appointment

Write

Book a new appointment

list_providers

Read

All providers in the practice

list_clinics

Read

All clinics (offices) accessible

list_operatories

Read

Treatment rooms

list_appointment_types

Read

Cleaning / filling / exam definitions

find_procedurelogs

Read

Treatments performed

log_communication

Write

Log a phone call / email / message

find_recalls

Read

Hygiene follow-up reminders

Common patterns

Pre-visit brief

User:  I'm seeing patient 4523 at 2pm. Brief me.
Agent: get_patient(patnum=4523)
       find_appointments(patnum=4523, limit=5)
       find_procedurelogs(patnum=4523, limit=10)
       find_recalls(patnum=4523)
       → Summary: patient info, last visits, what's been done, what's due

Recall campaign

User:  Build this week's recall list and draft rebooking messages.
Agent: find_recalls(due_date_start="2026-06-26", due_date_end="2026-07-03")
       → for each: pull patient, draft a friendly message

Post-call documentation

User:  Just took a call from the Smiths about rescheduling next week's cleaning.
Agent: find_patients(lname="Smith", fname="...", phone="...")
       log_communication(
         patnum=<found>,
         comm_datetime="2026-06-26T15:30:00",
         comm_type=1,           # ApptRelated
         comm_mode=2,           # Phone
         sent_or_received=1,    # Received
         note="Patient called to reschedule cleaning. Will call back with new date."
       )

API coverage

Open Dental endpoint

MCP tool

GET /patients/{id}

get_patient

GET /patients

find_patients

PUT /patients/{id}

update_patient

GET /appointments/{id}

get_appointment

GET /appointments

find_appointments

POST /appointments

create_appointment

GET /providers

list_providers

GET /clinics

list_clinics

GET /operatories

list_operatories

GET /appointmenttypes

list_appointment_types

GET /procedurelogs

find_procedurelogs

POST /commlogs

log_communication

GET /recalls

find_recalls

Full Open Dental API: https://www.opendental.com/site/apispecification.html

Development

pip install -e ".[dev]"
pytest
open_dental_mcp

Need a custom MCP for your SaaS?

I build production-grade MCP servers for vertical SaaS — insurance, dental, veterinary, legal, property mgmt, home services. Typical engagement: 2-4 weeks, $25K-$120K. Source-owned, MIT-licensed, no vendor lock-in.

See sanjibani/mcp-services or email sanjibani@users.noreply.github.com.


Ships in the sanjibani vertical-MCP portfolio — see also hawksoft-mcp, open-dental-mcp, ezyvet-mcp, jobber-mcp, paid-skills, mcp-vertical-template.




MIT — see LICENSE.

Acknowledgements

See also

Available Tools

14 tools
create_appointmentA

Create a new appointment.

appointment_json is a JSON object string with at minimum: PatNum, AptDateTime, ProvNum, Op, AppointmentTypeNum. See Open Dental API docs for the full schema.

Inputs: appointment_json (required). Returns: result

find_appointmentsA

List appointments with optional filters.

Use date=YYYY-MM-DD for a single day, or date_start + date_end for a range. Filter by patnum, provnum, or clinicnum.

Inputs: date, limit, patnum, provnum, +3 more. Returns: result

find_patientsA

Search for patients by name / phone / email / DOB. Returns matching records.

At least one criterion must be provided. Use this to find a patient's PatNum before calling get_patient or other record-specific tools.

Inputs: email, fname, limit, lname, +2 more. Returns: result

find_procedurelogsC

List procedure log entries (treatments performed). Filterable.

Inputs: limit, patnum, date_end, date_start. Returns: result

find_recallsB

List recalls due for patients. Use due_date_start + due_date_end to get everyone due for a hygiene visit in a date window.

Inputs: limit, patnum, recall_type, due_date_end, +1 more. Returns: result

get_appointmentB

Fetch a single appointment by AptNum.

Inputs: aptnum (required). Returns: result

get_patientA

Fetch a single patient by PatNum (Open Dental's internal patient ID).

Inputs: patnum (required). Returns: result

health_checkA

Verify credentials are valid by hitting /providers (always accessible).

Inputs: no named parameters. Returns: result

list_appointment_typesB

List appointment type definitions (cleaning, filling, exam, etc.).

Inputs: no named parameters. Returns: result

list_clinicsA

List clinics (offices) accessible to this developer account.

Inputs: no named parameters. Returns: result

list_operatoriesB

List operatories (treatment rooms). Optionally filter by clinic number.

Inputs: clinicnum. Returns: result

list_providersA

List all providers (dentists + hygienists) in the practice.

Inputs: no named parameters. Returns: result

log_communicationB

Log a phone call / email / message to a patient chart (commlog).

Open Dental uses integer codes — see: https://www.opendental.com/site/apicommlogs.html

Common values: comm_type: 1=ApptRelated, 2=Insurance, 3=Recalls/Statements, 4=General, 5=Lab, 6=Financial, 7=Medical, 8=Other comm_mode: 1=None, 2=Phone, 3=Email, 4=TextMessage, 5=Mail sent_or_received: 0=Sent, 1=Received

Inputs: note (required), patnum (required), comm_type (required), comm_datetime (required), +2 more. Returns: result

update_patientA

Update fields on an existing patient record.

updates_json is a JSON object string of fields to change, e.g. '{"Email": "new@example.com", "WkPhone": "5551234567"}'. Only fields included in the object will be modified.

Inputs: patnum (required), updates_json (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 14 tools

    Disambiguation5/5

    Each tool has a clear and distinct purpose, targeting different entities (appointments, patients, procedures, recalls, clinics, etc.) with no overlap or ambiguity.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern using lowercase with underscores (e.g., create_appointment, list_providers), making them predictable and easy to understand.

    Tool Count5/5

    With 14 tools covering core dental practice operations, the count is well-scoped and appropriate for the domain, avoiding bloat or insufficiency.

    Completeness2/5

    The tool set is predominantly read-focused, missing critical write operations such as creating patients or updating/deleting appointments, which limits agent autonomy and may cause failures.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables integration with the Cliniko practice management system through MCP tools and resources. Supports patient management, appointment scheduling, and practice data access through natural language interactions.
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables dental clinic staff to manage appointments, verify patient affiliation, and track accounts receivable through MCP tools, with OAuth 2.1, per-tool scopes, and human approval required for every mutation.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables LLMs and MCP clients to interact with patient records, encounters, and practice information through tools for clinical, scheduling, messaging, and administrative workflows.
      MIT