A free walkthrough
How to make a call schedule with AI, free.
Connect Claude Code or Codex to the free PostCallMD app. A solver does the assigning, so no hallucinations or missed assignments. Your agent writes the draft into the app. You review it and publish.
In this setup, PostCallMD holds your schedule data, while your agent grabs the data from PostCallMD and runs the solver to figure out the schedule, then posts it back to PostCallMD for review.
Do it yourself in eight steps, free. Or have us do it for you.
The first two steps are a one-time setup. Don't want a PostCallMD account? The open-source route might be for you.
The steps
Eight steps. Two happen once, two the first month, four every month.
Before you start. You need the Claude (or Codex) desktop app and a paid plan: Pro, Max, Team or Enterprise. PostCallMD is free. The Claude/OpenAI plan is not. The Code tab in the Claude app runs the solver on your computer, and a normal chat cannot. We recommend claude.ai/download. The solver also needs Python. A Mac has it. On Windows, install Python from python.org first. The agent checks for Python in step 4 and tells you if it is missing.
Once
-
Create a free PostCallMD account
No credit card, no sales call, and Free does not expire. One account covers one organization, with all of its sites and clinicians. The person who connects the agent needs an admin or owner seat, with a verified email.
Create a free account -
Connect PostCallMD to your agent
A connector is a door that Claude uses to work in PostCallMD. You add it to your Claude account once, and you sign in with the account from step 1. You do not need a terminal or a key.
The connector URLhttps://my.postcallmd.com/api/mcp
- In the Claude desktop app, open Settings, then Connectors.
- Select Add custom connector.
- Type
PostCallMDas the name. Paste the connector URL. Select Continue. - Do not change the settings on the next screens. Select Continue, then Add.
- Select Connect. A browser tab opens. Sign in to PostCallMD, select your practice, and approve.
The sign-in is yours to do. Claude cannot do it for you. If Claude shows a list of PostCallMD tools with switches, do not change them. On a Team or Enterprise plan, only an admin can add a connector. Ask your admin to do line 1 to line 4. Then you do line 5.
Codex does not use Claude connectors. You add PostCallMD from a terminal once, and you sign in with the account from step 1. You do not need a key.
Codex: paste this into a terminalcodex mcp add postcallmd --url https://my.postcallmd.com/api/mcp codex mcp login postcallmd
- Open a terminal. Paste the two lines and press Return.
- The second line opens a browser tab. Sign in to PostCallMD, select your practice, and approve.
- Start Codex.
The sign-in is yours to do. Codex cannot do it for you.
The first month
-
Set up your practice with your agent
The MCP server carries the setup prompt, so you have nothing more to paste. It tells the agent what to read first and that it must not publish. You do the setup in one conversation.
- In the Claude desktop app, open the Code tab. Select a folder for the agent to work in. A new, empty folder is best.
- Type
Set up my practiceand press Return. The agent reads your practice and leads you through the setup. - Paste a photo or a spreadsheet of this month’s schedule. The agent shows you the sites, shift types, clinicians and colors it read, and creates them when you say yes. It also saves the schedule into the app as your existing schedule, with each assignment as you had it, locked, and counted as history for fairness. To add another schedule later, type
Upload a schedule I already have. - Tell the agent your rules in plain English, one at a time. Describe only the rules beyond the built-in ones below: who covers which site, how much call each person owes, who never pairs with whom. The agent writes your rules into the app.
- Tell the agent to read your rules back to you. They are what every build follows. If a rule is wrong, tell the agent to correct it.
Built in. The free solver keeps these rules with no setup: a day off after call, nobody post-call on a shift marked as closed to post-call, one person for both Saturday and Sunday of a weekend, no back-to-back weekends (a practice setting, with exemptions per person), and a strong preference against call the day before or the day after a vacation. PRN clinicians get no share of call. You place their shifts. Holidays are not built in yet. You set holiday coverage by hand.
-
Build your solver
The first month, the agent builds the solver that makes your schedule, and saves it in your account. This happens once. The solver needs Python on your computer. The agent checks for it and tells you if it is missing. The first run takes longer than the monthly run.
- In the Code tab, open the folder from step 3.
- Before you type, set the mode. Use Ask mode, not Auto, for your first schedule. The mode menu is next to the box where you type.
- Type
Make my first scheduleand press Return. You can add the month:Make my first schedule for December. - Claude asks one time to install the free scheduling engine. Click Allow.
- The agent reads your practice and your rules from the app, and a note on what the data cannot express. It asks you only for what the app does not hold. It runs the solver on your month and saves the result in your account as a draft. It does not assign call by hand.
- Open the draft in the app. If it is correct, tell the agent. The agent saves the solver in your account. Every month after this, it runs that solver.
If Claude says a step was blocked, change the mode from Auto to Ask, then type
go. If something fails, Claude should tell you in plain words what to click or say. If it shows you a command, tell it:explain that in plain words.Built in. The free solver keeps these rules with no setup: a day off after call, nobody post-call on a shift marked as closed to post-call, one person for both Saturday and Sunday of a weekend, no back-to-back weekends (a practice setting, with exemptions per person), and a strong preference against call the day before or the day after a vacation. PRN clinicians get no share of call. You place their shifts. Holidays are not built in yet. You set holiday coverage by hand.
The solver makes the call schedule. You staff the daily assignments in Daily Staffing.
Every month
-
Review and approve requests
Your clinicians send vacation, no-call and swap requests from the phone app. Open Review Requests in the app and approve or deny each one. The agent reads only the approved requests, so this comes before the build.
-
Run your solver
If the agent says it is not signed in, open Settings, then Connectors in the Claude app. Select PostCallMD, then select Connect again, as in step 2.
- In the Code tab, open the folder from step 3.
- Type
Schedule <month>, for exampleSchedule December, and press Return. - The agent reads the approved requests, the coverage targets and last month’s schedule from the app. It runs the solver it saved in step 4 and saves the result in your account as a draft. It does not assign call by hand. If it finds no saved solver, it stops and tells you to do step 4.
-
Edit the draft in PostCallMD
Open the draft in the app. Move what you disagree with and read the fairness report. Before you publish, check these:
- Each weekend has one person on first call (for example 1C) for both Saturday and Sunday.
- Nobody works the day after first call.
- Vacations are empty, and nobody has call the day before or the day after one. If the solver had to break that, the agent tells you which day.
- Holidays have the coverage you want.
- PRN staff have only the shifts you gave them.
If a rule was misread, tell the agent and run it again.
-
Publish
Press publish. Every clinician sees the schedule on their phone, and requests for next month start to land in one queue. Nothing reaches your clinicians before this step.
Sign-in and keys. In Codex, you sign in with codex mcp login postcallmd in place of Connect. Other agents: add the same address as an HTTP MCP server, then sign in. The sign-in from step 2 lasts one hour and renews by itself for up to 30 days while you use it. A group that runs the solver once a month will sign in again most months. You add the connector in step 2 once only. To disconnect, open Settings, then MCP, and remove the row named Connected agent. A script, a cron job or curl cannot sign in through a browser, so it needs an API key. Make the key in Settings, then MCP. You must set its scopes and an expiry: seven days by default, ninety days at most. Treat the key like a password and never paste it into a chat. Nothing on this page needs a key.
Why this page exists
A senior resident asked Reddit. The top reply said no AI could do it.
They were half right. ChatGPT alone won’t build you a fair call schedule. It’ll happily invent one that looks fine, double-book a post-call doc, and quietly skip a vacation request. But an AI coding agent, connected to a real solver, will do it deterministically and in seconds. That’s the gap this page closes.
I built the free walkthrough for the senior resident, the chief, the fellow, the one partner in the group, the person who got handed the spreadsheet and is now spending every other weekend trying to make it fair. If that’s you, follow the steps above. If you know someone like that, send them this page.
What the solver produces
A schedule that respects every rule.
Below is the solver’s sample output, laid out as a real call calendar. Two weeks. Six clinicians. One OR shift and one OB shift per day. Every hard rule respected. Only the laptop route’s agent runs this sample first, so you can see the mechanics work before swapping in your own group. On the app route the agent goes straight to your practice, and the draft lands in your account, where you edit it before you publish.
Go ahead and try it: drag any OR or OB shift to another clinician’s row. The shift counts on the left re-tally so you can see fairness shift in real time. Vacations and hard blocks stay locked.
| Clinician | 1 Mon |
2 Tue |
3 Wed |
4 Thu |
5 Fri |
6 Sat |
7 Sun |
8 Mon |
9 Tue |
10 Wed |
11 Thu |
12 Fri |
13 Sat |
14 Sun |
|---|
A few things worth noticing, because they prove the rules were respected, not invented around:
- Cary’s vacation June 5 to 7 is honored. Zero assignments those days. Want to add a pre-call buffer? Just one prompt away.
- Reed’s hard block on June 2 is honored, even though Reed covers five other shifts in the window.
- Johns asked off OB on June 10 only (one shift type, not the whole day). The schedule honored that without blocking other shift types. That distinction matters in real groups.
- Weekend calls are spread across the group. Nobody is “the one who always covers.”
What your agent will need from you
Four things. You don’t type any of them into a spreadsheet. Unless you want to.
If you shared last month’s schedule in step 3, the roster and the history are already in the app, and the agent reads them through the MCP server. The rest you paste in whatever shape you have it. Your agent does the formatting.
Your roster
Names of the people on call, and what each person can cover. A bulleted list works. A screenshot of the roster from QGenda works too.
Your coverage pattern
Which shifts run on which days. “One OB every day, one OR every weekend day, two OR on weekdays” is enough.
Time-off requests
Vacation, no-call, and soft preferences. On the app route your clinicians submit these from their phones and the agent reads the approved ones. Or paste a screenshot of the list from Sheets, QGenda or wherever it lives. Don’t retype them.
Recent history
Last month or two of who covered what, so the new schedule stays fair against what just happened. Or tell the agent you’re starting fresh.
Why this works (and ChatGPT alone doesn’t)
Plausible answers vs. checked answers.
Once upon a time, if you asked an LLM how many r’s were in strawberry, it would confidently tell you two. A one-line Python program would just count the letters and return three. That’s the difference between a plausible answer and a checked answer.
Your call schedule needs the checked answer. A language model predicts the most likely next token, which is genuinely great for translating messy human rules into something more precise. It’s the wrong tool to be the schedule. It will produce a calendar that looks reasonable and quietly skip a vacation, double-book a post-call physician, or leave a weekend uncovered.
A real scheduler works differently. You hand it the people, the shifts, and the rules. It searches for assignments that satisfy every rule. If the rules conflict, it tells you the schedule is impossible instead of inventing one.
The scheduler under the hood, on both routes, is Google’s OR-Tools, the open-source engine they use for routing and logistics. It’s deterministic, it doesn’t hallucinate, and it’s free. Your AI agent’s only job is to translate your group’s rules into the scheduler’s inputs and read the results back to you, or write them into the app.
Which AI
Use Claude Code or Codex, not a chat window.
This walkthrough is built around an AI agent that runs on your laptop and can read files, run programs, and connect to the app. Two options, both free to try:
- Claude Code from Anthropic. claude.com/claude-code
- Codex from OpenAI. openai.com/codex
A chat window like ChatGPT or Claude.ai can’t do this. It can’t read your roster files, can’t run the scheduler, and can’t connect to the MCP server. It’ll guess at what your inputs look like and make confident things up. The whole point of an agent is that it can do the work and check itself, instead of guessing.
Privacy
Two routes, two answers.
Even without patient information, physician schedules, vacation requests, and internal group rules can still be sensitive. What each route does with them:
- The app route. Your practice lives in your PostCallMD account. The agent reads it and writes the draft through the MCP server, after you sign in through the browser and approve the scopes. No key is typed anywhere. The sign-in renews only while you use it, and you can disconnect in Settings, then MCP. Nothing reaches your clinicians until you publish. A call schedule holds no patient information: names, dates, sites and assignments.
- The laptop route. The scheduler runs on your machine. The schedule is computed locally and never uploaded.
- Both routes. Your AI assistant still sees the conversation you have with it. Pick a tool that doesn’t train on your inputs, both Claude Code and Codex have settings or default behavior for this. Check before you paste real names.
If you’d rather not paste real names into any AI tool at all, use initials or made-up IDs for the first run. The schedule comes out the same shape either way.
The open-source route
Prefer to keep it on your laptop? Point your agent at the repo.
The same solver, MIT licensed, run on your machine. No account and nothing in the cloud. You get a printable schedule, not a place to manage requests, track fairness across months, or publish to phones. Good for a residency rotation, a first experiment, or a group that is not ready for an app.
I'd like help making a call schedule. The tool's on GitHub at niceschedule/ai-call-scheduler. Clone it and have a look. I'm a doctor, not a programmer, so talk to me in plain English and just run things rather than handing me terminal commands. Start by running the built-in sample so I can see the output, then ask me about my group.
The repo itself: github.com/niceschedule/ai-call-scheduler. MIT-licensed, the same code the app route runs.
The laptop route, end to end: the agent reads the rules, runs the solver, and prints the shifts.
Where this stops being enough
This is great until the rules get real.
The free app gives the schedule a home: requests in one queue, history that carries across months, fairness reports, a phone app for every clinician, and publishing. Your agent brings the solver. For many groups that is enough for a long time.
What stays hard is the rules. Out of the box, the open-source solver handles these:
- Every shift is covered, every day.
- Each person works only the shifts they are allowed to work.
- One assignment per person per day.
- Approved vacation and must-off days stay empty.
- Caps on shifts, and on weekend shifts, per person.
- A rest gap between two calls.
- A fair spread of call against each person’s target and recent history.
- A fair spread of weekend call.
- A day off after call, and nobody post-call on a shift marked as closed to post-call.
- One person for both Saturday and Sunday of a weekend, and no back-to-back weekends.
- No call the day before or the day after a vacation, where it can avoid it.
- No share of call for PRN clinicians. You place their shifts.
These need the agent to change the solver’s code:
- Holidays. Until then, you set holiday coverage by hand.
- Partner tiers.
- Day call and night call as separate shifts.
Someone has to write those rules down, turn them into code, and tune them every month as the group changes. On Free, that someone is you and your agent. The repo’s cookbook shows the agent how to add a night shift. An infeasible month at eleven at night is still yours.
If you would rather hand that part to us, that is Custom. We write your rules down and build the solver. The app generates the draft, and a person tunes it every month. You approve the first live schedule before you pay. See how Custom works, or compare the two plans.
Questions
Questions people ask before they try this.
Can ChatGPT make a call schedule?
If you connect ChatGPT to PostCallMD, it can build a constraint solver which considers all your practice’s rules and builds the fairest schedule possible. Without PostCallMD, a large language model like Claude will hallucinate an assignment. To get started, ask ChatGPT about PostCallMD’s open source solver.
Can Claude make a call schedule?
If you connect Claude to PostCallMD, it can build a constraint solver which considers all your practice’s rules and builds the fairest schedule possible. Without PostCallMD, a large language model like Claude will hallucinate an assignment. To get started, ask Claude about PostCallMD’s open source solver.
Is there a free call scheduling app?
Yes. PostCallMD is a free call scheduling app for independent medical group. Free includes vacation and swap requests, building and publishing the schedule, fairness reports, a phone app for every clinician, spreadsheet import, data export, and the MCP server and API keys connecting your own agent. One account covers one organization, with unlimited sites and clinicians.
What is an MCP server for scheduling?
In PostCallMD, the MCP server is the connection that lets an AI agent such as Claude Code or Codex work inside your account. MCP is an open standard for connecting an agent to another program. Ours lets the agent read your practice and write a draft into the app. Both are included in the free plan, and nothing reaches your clinicians until you publish.
Does it hallucinate?
A solver will not hallucinate. It is a deterministic system. This is why you need PostCallMD’s solver and AI. PostCallMD hands the assigning to a solver and not to a language model. Your agent only translates your rules into the solver’s inputs, and it can still misread a rule, so check the draft before you publish. The fairness reports in the free app track every clinician’s calls, weekends and vacation, which makes a misread rule easy to spot.