DrChrono MCP server for AI agents

Live

OAUTH 2.0

PRACTICE MANAGEMENT

AI

DrChrono gives your agent practice management in DrChrono: search patients, book and update appointments, read clinical notes and billing line items, manage problems, allergies, and medications, and work the task center.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
DrChrono
agent · Acme Q3
Run
What's open on Dr. Chen's calendar at the Main Street office on Friday?
S
drchrono_get_availability
117ms
Front desk agent
Dr. Chen has 3 open slots at the Main Street office on Friday: 9:30am, 11:00am, and 3:15pm.
Sources: DrChrono availability, 1 office
drchrono
3 slots
18:29
Message Claude...

Tools your front desk agent reaches for on DrChrono, scoped per user.

CALL ANY TOOL
47 tools for practice management in DrChrono: search and update patients, book and reschedule appointments, read clinical notes, eligibility checks, and billing line items, manage problems, allergies, and medications, and handle tasks.
drchrono_create_allergy
Create allergy
Record an allergy for a patient. Returns the created allergy with its id. Use drchrono_update_allergy to change it or mark it inactive.
Parameters
Name
Type
Required
Description
doctor
integer
Required
ID of the doctor who diagnosed the allergy. Get doctor IDs from drchrono_list_doctors. Example: 12345.
patient
integer
Required
ID of the patient with the allergy. Get patient IDs from drchrono_list_patients. Example: 12345.
description
string
Optional
What the patient is allergic to. Example: Penicillin.
notes
string
Optional
Additional notes from the provider. Example: Reported by patient.
reaction
string
Optional
Short description of the reaction. Example: Hives.
rxnorm
string
Optional
RxNorm code of the drug, for a drug allergy. Example: 7980.
snomed_code
string
Optional
SNOMED code for the allergy. Example: 91936005.
snomed_reaction
string
Optional
SNOMED code for the reaction, from the PHIN VADS reaction value set. Example: 247472004.
status
string
Optional
Allergy status: active or inactive. DrChrono uses active when this is omitted on create. Example: active. One of: `active`, `inactive`.
verification_status
string
Optional
Verification status: confirmed, unconfirmed, refuted or entered-in-error. Example: confirmed. One of: `confirmed`, `unconfirmed`, `refuted`, `entered-in-error`.
drchrono_create_appointment
Create appointment
drchrono_create_patient
Create patient
drchrono_create_task
Create task
drchrono_get_allergy
Get allergy
drchrono_get_appointment
Get appointment
drchrono_get_availability
Get availability
drchrono_get_clinical_note
Get clinical note
drchrono_get_eligibility_check
Check get eligibility
drchrono_get_line_item
Get line item
drchrono_get_office
Get office
drchrono_get_patient
Get patient
drchrono_get_task
Get task
drchrono_list_allergies
List allergies
drchrono_list_appointment_profiles
List appointment profiles
drchrono_list_clinical_note_field_types
List clinical note field types
drchrono_list_clinical_note_field_values
List clinical note field values
drchrono_list_clinical_notes
List clinical notes
drchrono_list_doctors
List doctors
drchrono_list_line_items
List line items
drchrono_list_offices
List offices
drchrono_list_patients
List patients
drchrono_list_task_categories
List task categories
drchrono_list_task_notes
List task notes
drchrono_list_tasks
List tasks
drchrono_search_insurance_payers
Search insurance payers
drchrono_update_allergy
Update allergy
drchrono_update_appointment
Update appointment
drchrono_update_patient
Update patient
drchrono_update_problem
Update problem

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// DrChrono tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["drchrono"], toolNames: [
    "drchrono_list_patients",
    "drchrono_get_availability",
    "drchrono_create_appointment"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Find Maria Lopez and book her with Dr. Chen at the first open slot on Friday" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["drchrono"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Find Maria Lopez and book her with Dr. Chen at the first open slot on Friday" }],
  tools,
});

// Execute the tool call with the user's vaulted DrChrono OAuth token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["drchrono"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Find Maria Lopez and book her with Dr. Chen at the first open slot on Friday" }],
  tools,
});

// Tool call runs with the user's vaulted DrChrono OAuth token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["drchrono"] }, pageSize: 100,
});

const agent = new Agent({
  name: "front_desk_agent",
  model: "gemini-2.5-pro",
  instruction: "DrChrono tools scoped to this user",
  tools,
});

await agent.run("Find Maria Lopez and book her with Dr. Chen at the first open slot on Friday");
Try these prompts
Copy any prompt into your agent. Each maps directly to a DrChrono tool. Click to copy, paste into your agent, done.
Scheduling
Copy the prompt
Copied
Show open slots for Dr. Chen at the Main Street office on Friday.
Copy the prompt
Copied
Book this patient with Dr. Chen on Friday at 9:30am in exam room 2.
Copy the prompt
Copied
Mark this appointment as Arrived.
Patient chart
Copy the prompt
Copied
Search for patients named Maria Lopez born in 1984.
Copy the prompt
Copied
List this patient's active problems and medications.
Copy the prompt
Copied
Get the clinical note from this patient's last appointment.
Billing and tasks
Copy the prompt
Copied
List billing line items for Dr. Chen's appointments this week.
Copy the prompt
Copied
Show past eligibility checks for this patient.
Copy the prompt
Copied
Create a task for the billing team to review this patient's account.
SEE HOW AUTH WORKS
Each user signs in to DrChrono once, and Scalekit stores and refreshes their tokens. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
DrChrono
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
DrChrono
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
DrChrono
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
DrChrono
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other healthcare connectors.
Support and Ops Teams
Meeting prep
Pulls agenda, participant context, and open action items before every meeting.
Engineering Teams
Slack triage
Polls Slack for new messages, classifies bugs and support requests with a LangGraph router, files GitHub issues or Zendesk tickets, and confirms in the thread.
Test other agents
See the same per-user auth pattern across other healthcare connectors.
OPS
Meeting prep agent
Assemble the agenda, HubSpot attendee history, and open action items from Gmail before every meeting on the calendar.
ENGINEERING
Slack triage agent
Classify new Slack messages as bugs or support requests, file the GitHub issue or Zendesk ticket, and reply in the thread.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared DrChrono token looks fine in a demo. In production every appointment change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
DrChrono today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access DrChrono as the user or through a shared service account?
As the user. Each user signs in to DrChrono once, and Scalekit stores and refreshes their tokens. Appointment changes and chart updates in your audit trail are attributed to that user, not a shared service account.
Where is the DrChrono OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in DrChrono?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the read tools without drchrono_update_patient or drchrono_create_appointment. The connector has no delete tools. Scalekit also enforces scope checks before every API call.
What happens when a user revokes DrChrono access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Does adding a medication in DrChrono send a prescription?
No. drchrono_create_medication adds a medication to the patient's medication list. It does not send an eRx. drchrono_update_medication sets a stop date or marks a medication inactive.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""drchrono"": {
""url"": ""https://mcp.scalekit.com/drchrono"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.drchrono]
url = ""https://mcp.scalekit.com/drchrono""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""drchrono"": {
""url"": ""https://mcp.scalekit.com/drchrono"",
""type"": ""http""
}
}
}