-
-
One sentence to Alexa: three people, three plans, a doctor for each in their own plan's network.
-
CMS confirmed only 47% of sampled directory records as accurate and up to date; 0 of 10,075 public records state a patient age.
-
Doctors who can't see a child that age, or aren't in the child's plan, are set aside with the reason, before anyone calls.
-
Maintains state across sessions: the checkup year booked around daycare, and "what's left?" the next day.
-
How it works: self-hosted MCP server + MCP Apps, a deterministic gate, three real directory sources, sandbox booking.
-
Built to be checked: 68/68 verify checks, 16/16 mutations caught, every "never" is code with a test.
InNetwork is an Alexa+ add-on: a self-hosted MCP server (spec 2025-11-25 over Streamable HTTP, plus 2026-07-28 on the same endpoint) with MCP Apps screens for Echo Show. The Alexa+ add-on toolkit is in preview with select partners, so I simulate Alexa+ in a web host that ships in the repo. It uses the official MCP client, the MCP Apps bridge and a 1280×800 Echo Show frame. A classic Alexa skill (ASK SDK and APL) calls the same server for the checkup-year scene.
Inspiration
I'm a mom of two, and my kids are on different health plans. One call to book an orthopedist for my son took exactly an hour. The office our pediatrician referred us to said their doctor doesn't see children that young and offered one across town, a long drive away. Hard with two little kids. Meanwhile, after two births, I need a full checkup of my own with six different doctors, and I've been putting it off for months, because finding and booking each one feels like a nightmare.
That's my family's story, not a survey. The problem behind it has been measured, though. In a federal secret-shopper review of marketplace provider directories, CMS confirmed only 47% of sampled records as accurate and up to date (plan year 2021, risk-based sample). When I audited six public insurer directories myself, 0 of 10,075 records said what age a doctor sees.
What it does
You say one sentence: "Alexa, I need a gastroenterologist, an allergist for my five-year-old, and an orthopedist for my little one. He's under two."
InNetwork splits it into three people, three plans and three searches, and works through them on its own. It checks each person against their own plan's network: an insurer's FHIR Plan-Net directory for one plan, the CMS marketplace provider file for the second, a Medicaid managed-care directory for the third. It sets aside doctors who can't see that person and says why ("Doesn't see children under 3", "Not in his plan's network"), and the source of each reason is kept with it. Then it places the visits around the family's routine, so my visits fall while the kids are at daycare and theirs after pickup. It reads the plan back, books when I say yes, confirms by voice and in writing (Alexa app and email), and I can cancel anytime.
It maintains state across sessions. Once I tell it I've met my out-of-pocket max, it lays out the rest of my checkup year before the plan resets: primary care and OB-GYN at the same clinic, dermatology, and lab work after primary care. The next day, in a new session and after a server restart, "Alexa, what's left on my checkup plan?" still works.
There are things it never does. It doesn't pick a specialty or read symptoms, and it won't book out of network without a second yes. It doesn't store a child's age (the age band is used for one search only), read member IDs aloud, call anything "free", promise emergency help, or turn a parent's notes into ratings.
How I built it
- The MCP server (
@modelcontextprotocol/server2.3.1) has 9 typed tools with strict input schemas, and one endpoint serves both protocol eras. I checked it independently with MCP Inspector CLI--strict. - MCP Apps (
@modelcontextprotocol/ext-apps2.0.3) draws six customer screens, built to the Alexa+ add-on design guide (768×480 base ×1.667 for Echo Show 8, light and dark). I designed the screens image-first: mockups first, I picked one per screen, then the HTML was built to match. The simulator host adds a "behind the scenes" developer screen that shows what is live, a file, a sample or a sandbox. - No model runs inside the product. A deterministic gate checks network, patient age and new patients, and every decision carries its source. The 13 "never" rules are code, each with a test. A mutation check removes each rule in a throwaway copy and proves its test turns red (16 of 16).
- Voice comes first and the screen second. The longest Alexa reply in the demo is about 12 seconds (it used to be 17 seconds, plus an 8-second coverage line, before I cut it). Hours, sources and the coverage line ("plans usually pay 100% of covered in-network care… Source: HealthCare.gov") stay on the screen instead of being read out.
- The data comes from Florida Blue's FHIR Plan-Net API (a live network check in
automode; the cards use a recorded sample), Oscar's CMS marketplace provider file (from a file set of about 17 GB, files up to 1.5 GB, read by streaming), Molina's Medicaid managed-care directory (FHIR Plan-Net) and NPPES for joins. The doctors on screen are fictional, and every name is checked against NPPES to make sure it matches nobody. - The classic Alexa skill (ASK SDK, APL, signature-verified endpoint) is an MCP client of the same server for the checkup-year scene. It is built and tested against the server (5 tests), and on Oct 20 I ran it on a real Echo Show 8 (the live clip at 2:02 in the video).
npm run verifyruns 68 checks in about 45 seconds, all offline except the NPPES name guard, with no keys: both MCP eras, the demo story word for word, state across sessions and a restart, negative controls, mutation checks, and browser checks of the simulator and all seven screens.
Why this is an ecosystem gap
Alexa+ can already book appointment-based services, but the documented booking path (Local Booking SPI, updated July 21, 2026) names "salons, spas, fitness centers" and has no field for a health plan's network or a patient's age. FHIR Plan-Net, the standard insurer directories publish in, has no structured field for the patient ages a practice sees, and in 10,075 records nobody wrote it anywhere else either. Zocdoc's own help page (June 22, 2026) answers "Can I customize the exact age range?" with "Not at this time."
So today the age check happens on the phone. InNetwork keeps an office's age policy once a booking has taught it, as a property of the office with no family data, so the next family doesn't have to call. In the demo those policies are sandbox data and labelled that way.
Challenges I ran into
Three plans meant three data shapes: a FHIR API, a marketplace file set of about 17 GB, and a Medicaid directory whose plan record had an empty network.
The directories also disagree with themselves. One insurer hides /metadata and files gastroenterologists under internal medicine, and 5 of its 14 plans point to a network that none of the practitioner roles I read use. Another stopped answering every request for the rest of the day because of an undocumented quota. And 4 of 30 in-network orthopedists listed at Orlando addresses report practicing in another state. Each of these is in the friction log with the command and the number.
The practices' own websites don't fill the gap. Of 18 practice pages that opened for a polite automated read, none states a minimum patient age (coverage is 18 of 71, and I say so).
Accomplishments I'm proud of
I have a measured number anyone can re-run: npm run audit:directories shows that 0 of 10,075 public directory records (5,649 practitioner roles and 4,426 locations, six insurers, 414 requests, 0 errors) state a patient age. A must-light control on a synthetic record proves the counter works.
The audit code became its own open-source package, plannet-directory-check, which checks public insurer directories and NPPES (MIT, offline tests).
The product has 13 refusals in code, the mutation check catches 16 of 16, and verify passes 68 of 68 checks on a fresh clone.
What I learned
The hard part of booking a doctor isn't the booking. It's knowing, before anyone calls, whether this doctor takes this person's plan and sees this person's age. No public directory I checked says the second part, so the product has to learn it once and keep it for the next family, without keeping anything about the family.
Beyond the hackathon
For Alexa+, a health-care profile in Alexa+ booking with "plan network" and "patient age group" as booking fields (feature request FR1) would let any clinic or scheduling partner plug in. The gate, the routine-aware planner and the refusals live in the server, so they would carry over unchanged.
For directories, a structured age field in FHIR Plan-Net (FR2) and the open audit package would let insurers and CMS measure the gap the same way I did.
For families, it fits any household on more than one plan: kids on Medicaid or CHIP with a parent on employer or marketplace coverage, or a family split between two employers' plans.
What's next
Real booking partners, a structured age field in a public directory, and a household profile both parents can share.
About the video: the family scenes are an AI-generated dramatization based on my family, labelled on screen. The narration is my own voice, AI-cloned from my recording. Alexa's voice is synthetic and labelled on screen, except in the live clip at 2:02: a real Echo Show 8 running the classic skill, with the real Alexa voice, labelled "Real recording · not AI-generated". The demo runs on sandbox data with fictional doctors. The developer view labels the source of every step; in this recording none of them is a live call: they are recorded directory samples and sandbox steps, and the screen says so.
Built With
- alexa-presentation-language
- alexa-skills-kit
- cms-qhp
- esbuild
- fhir
- hl7-plan-net
- mcp-apps
- model-context-protocol
- node.js
- nppes
- playwright
- typescript
- zod

Log in or sign up for Devpost to join the conversation.