Gives AI agents an attending-physician-grade clinical decision-support consult, not a diagnosis
Translation pending
AI summary · revised during review
Developer toolsPython · ShellGitHub @sstarzhOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
An MCP server that gives Claude, OpenClaw, or any other MCP-capable agent an attending-physician-grade clinical consult service.Read the full README ↗An MCP server that gives Claude, OpenClaw, or any other MCP-capable agent an attending-physician-grade clinical consult service.
It has five layers:
MedicationRequest / ServiceRequest with status=draft) are checked in code against the chart (allergy cross-reactivity, interactions, pregnancy, pediatric age and weight, Beers criteria, kidney function). Controlled substances are refused. A licensed clinician reviews and issues anything real.⚠️ Decision support, not a doctor. This software does not diagnose, prescribe, or replace a licensed clinician who can examine the patient. It is not a medical device and has not been cleared by the FDA or any other regulator. Do not use it for real patient care without clinical oversight, validation, and the regulatory and privacy review that applies to you (HIPAA, GDPR). In an emergency, call your local emergency number.
| Tool | Purpose |
|---|---|
second_opinion | A second opinion on earlier advice (this service's or the patient's own doctor's): blinded independent work-up, then verdict, misses, safety concerns and next steps |
consult | Full attending consult note for adults and children (audience: clinician, patient, or caregiver for a parent) |
red_flag_screen | Deterministic emergency triage of free text. Call it first. |
calc_* (18) | eGFR (CKD-EPI 2021), Cockcroft-Gault, CHA2DS2-VASc, HAS-BLED, HEART, QTc, MAP, Wells PE, PERC, CURB-65, qSOFA, Centor/McIsaac, MELD-Na, GCS, anion gap, corrected Ca, corrected Na, BMI |
calc_* pediatric (10) | Age-normal vital signs (PALS), weight-based dose → mg and mL with adult caps, Holliday-Segar fluids, bedside Schwartz eGFR, APLS weight estimate, PECARN head trauma, PECARN febrile infant, Westley croup, Clinical Dehydration Scale, Pediatric Appendicitis Score |
drug_label | FDA prescribing information: boxed warning, dosing, contraindications, pregnancy, and more |
drug_interaction_check | Pairwise screen built from each drug's FDA label interaction section |
normalize_drug | Maps brand or misspelled names to RxNorm ingredients |
pubmed_search / pubmed_abstract | Literature search, optionally limited to systematic reviews, RCTs, and guidelines |
verify_citations | Checks every PMID in a text against PubMed (verified, mismatch, not found, unchecked) and flags links outside recognised guideline and journal publishers |
clinical_trials_search | Recruiting trials from ClinicalTrials.gov |
list_skills / get_skill | The specialty playbooks, with review freshness and outdated guideline editions |
search / fetch | Search across skills, calculators, and PubMed, then read a result (the convention ChatGPT connectors and deep research use) |
whoami | Shows the signed-in account, to confirm a connector works |
| / / / / |
consult takes optional depth (quick / standard / thorough, trading speed for verification), patient_id (include the chart), provider (anthropic | openai | meta | llama), and second_opinion (run the case past every configured provider and reconcile the notes).
The server also exposes prompts (personal_doctor_visit, patient_intake, attending_consult, pediatric_consult, medication_review) and resources (skill://{name}).
| Layer | When it runs | Added latency |
|---|---|---|
| Deterministic red-flag screen (negation-aware, about 60 rules, 35 vignettes in CI) | Every consult, before the model | under 1 ms |
| Patient chart with lab and vital trends and recent visits | Every consult | one encrypted read |
| Self-check of the note: can't-miss coverage, under-triage, allergy conflicts (including cross-reactive classes), children's doses without a weight, fabricated citations, uncertainty. When a red flag's danger is a diagnosis (ectopic pregnancy, stroke, PE, septic arthritis…), it must be in the differential, not just mentioned in the prose; presentation-type flags (suicide risk, airway) only need the note to address them | Every consult, after the note | about 0.2 ms |
| One-shot revision with the self-check findings | Only when a critical finding remains and at least 25 s of the time budget is left; kept only if it helps | one completion |
| Auto-escalation to high effort | Urgent screens when the caller didn't choose a depth; emergencies stay fast | modest |
second_opinion: blinded independent work-up by a stronger or different model, then a critical comparison and verdict | When the patient asks, or doubts a diagnosis or treatment | about one consult |
MEDICAL_DOCTOR_SECOND_OPINION is an ordered list of reviewers, each provider or provider:model (e.g. openai,meta:<model>). Entries without a usable key (or, for Llama, without MEDICAL_DOCTOR_LLAMA_BASE_URL) are skipped, and the consult's own provider is used only if nothing else listed is usable, so meta:<another Meta model> works on a Meta-only server. With nothing usable listed: claude-fable-5-1 at high effort (falling back to Opus; change it with MEDICAL_DOCTOR_SECOND_OPINION_MODEL, which applies to Claude only), else another model family with a key, else the consult's own provider at thorough depth. When the reviewer is the same model the server uses for consults, the result says so (same_model plus a note).self_check.suggest_second_opinion.consult(images=[...]) takes up to 4 https URLs or base64 images (rash, wound, eye, a lab report). Images are not stored.consult returnsnote: the Markdown consult note.structured: the same note as validated data (ConsultSummary).
urgency is never lower than the deterministic red-flag screen; the model's own call stays in model_urgency.source reads markdown_fallback.citation_check: every PMID in the note looked up in PubMed and marked verified, mismatch (a real article on a different topic), not_found, or unchecked. PubMed being unreachable is never counted as verified.timing: where the time went, with no clinical content: total, model, tool and finish seconds, rounds, the note-writing round, output and hidden-reasoning tokens, and note length. medical-doctor-mcp eval --consult prints it per case with averages.red_flag_screen, tool_calls, usage, and, for a second opinion, panel.self profile is opened automatically.my_chart loads the chart at the start of a conversation, and chart_record saves anything the patient mentions.patient_id.MEDICAL_DOCTOR_AUTO_CHART=0 to save only on request.person:<name> can.MEDICAL_DOCTOR_DATA_KEYS. Every record is bound to its row (owner, patient, section, item), so a copied ciphertext won't decrypt elsewhere. Only opaque IDs and timestamps are stored in clear.medical-doctor-mcp gen-data-key k2 and prepend it. Old keys stay listed until patient keys are re-wrapped (RecordRepo.rewrap_keys).patient_access_log reports whether the chain is intact. Clinical text is never logged.~/.medical-doctor/records.db with an auto-created key file. On servers it lives in Postgres (Supabase), in the medical_doctor schema with RLS on.| Provider | Set | Default model | Notes |
|---|---|---|---|
anthropic (default) | ANTHROPIC_API_KEY | claude-opus-5-5 | Prompt-cached skill library, guideline web search (trusted publishers only), server-side refusal fallback |
openai | OPENAI_API_KEY | gpt-6-sol | Chat Completions function calling; optional MEDICAL_DOCTOR_OPENAI_REASONING_EFFORT |
meta | MODEL_API_KEY (or META_API_KEY) | muse-spark-1.3 | Meta Model API (https://api.meta.ai/v1, OpenAI-compatible). Also muse-spark-1.2, or muse-spark-1.1 for 1M-token context. *-contributor models are refused: Meta uses their traffic to improve its products, so they must never see patient data. |
llama | LLAMA_API_KEY + MEDICAL_DOCTOR_LLAMA_BASE_URL | meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8 | Open-weight Llama on any OpenAI-compatible host: Together, Groq, Fireworks, vLLM, Bedrock. (Meta's own Llama API was retired in July 2026.) |
MEDICAL_DOCTOR_PROVIDER. Override models per provider with MEDICAL_DOCTOR_ANTHROPIC_MODEL, MEDICAL_DOCTOR_OPENAI_MODEL, MEDICAL_DOCTOR_META_MODEL, or MEDICAL_DOCTOR_LLAMA_MODEL. Model IDs differ between Llama hosts.MEDICAL_DOCTOR_SECOND_OPINION=anthropic,openai,meta and call consult(..., second_opinion=true). Every configured model writes a note in parallel; the primary model then writes one reconciled note with an explicit Points of disagreement section, and never drops a can't-miss diagnosis that any model raised.skills/<name>/SKILL.md)Adult & general: clinical-reasoning · emergency-triage · evidence-based-medicine · pharmacotherapy · lab-interpretation · cardiology · pulmonology · infectious-disease · endocrinology · neurology · gastroenterology · obstetrics-gynecology · psychiatry · geriatrics · patient-communication
Pediatrics: pediatrics (core: history, norms, dosing safety, never-in-children list) · pediatric-emergency (PALS, sepsis, seizures, PECARN, ingestions, abuse recognition) · neonatology (jaundice, febrile neonate/HSV, BRUE, feeding, safe sleep) · pediatric-infectious-disease (fever by age, AOM, strep, UTI, pneumonia, Kawasaki, measles) · well-child-development (growth, milestones, autism/ADHD, screening, immunizations, adolescent health)
The red-flag screen also catches pediatric danger signs: infant respiratory distress, a floppy or lethargic baby, bilious vomiting or intussusception, button-battery and other dangerous ingestions (with Poison Control), dehydration in infants, prolonged fever (Kawasaki), and newborn jaundice.
Claude Code and OpenClaw both use the Agent Skills standard (a folder containing SKILL.md with name and description frontmatter), so the same folders work in this server, in Claude Code, and in OpenClaw.
git clone https://github.com/sstarzh/medical-doctor && cd medical-doctor
pip install -e . # or: uv pip install -e .
export ANTHROPIC_API_KEY=sk-ant-... # powers the `consult` tool
Without an API key, every tool except consult works. In that case consult falls back to protocol mode: it returns the red-flag screen and the physician charter, and the calling agent (for example Claude Desktop) runs the consult itself using the server's tools and skills.
The server speaks standard MCP over stdio (local) and Streamable HTTP (remote, at /mcp). It works with ChatGPT, Claude (web, desktop, and Code), Microsoft Copilot Studio, Cursor, VS Code/Copilot, Windsurf, Gemini CLI, OpenAI Codex, OpenClaw, the OpenAI Responses API and Agents SDK, the Anthropic MCP connector, LangChain, n8n, and others. Clients that only support stdio can connect through mcp-remote.
→ Per-client setup: docs/CLIENTS.md
Quick starts:
# Local, for one person (no auth needed)
claude mcp add medical-doctor -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY -- medical-doctor-mcp
# Remote: ChatGPT / claude.ai → Add custom connector → https://<your-host>/mcp → sign in with Google
claude mcp add --transport http medical-doctor https://<your-host>/mcp
Remote deployments should always use authentication. Set MEDICAL_DOCTOR_AUTH to one of these:
| Mode | What it does | Use when |
|---|---|---|
oauth | Built-in OAuth 2.1 authorization server. Users sign in with Google, GitHub, Microsoft (Entra ID), or any OIDC provider (Okta, Auth0, Keycloak, Ping, Axiad, …). Supports discovery (RFC 9728/8414), Dynamic Client Registration (RFC 7591), PKCE, resource-bound tokens (RFC 8707), refresh rotation, and revocation. | ChatGPT, Claude, and IDEs connect with just a URL |
jwt | Accepts access tokens from your existing authorization server, validated against its JWKS (signature, iss, aud, exp). | You already run Auth0, Okta, Entra, Keycloak, WorkOS, Descope, or Stytch with DCR enabled |
apikey | Static bearer keys only. | Server-to-server agents and automation |
none | No authentication. | Local stdio or a localhost-only setup |
API keys (MEDICAL_DOCTOR_API_KEYS) also work alongside oauth and jwt, for headless agents.
https://<your-host>/oauth/callback/google.export MEDICAL_DOCTOR_AUTH=oauth
export MEDICAL_DOCTOR_PUBLIC_URL=https://<your-host>
export GOOGLE_CLIENT_ID=... GOOGLE_CLIENT_SECRET=...
export MEDICAL_DOCTOR_ALLOWED_DOMAINS=yourcompany.com # and/or [email protected],[email protected]
medical-doctor-mcp --transport http --host 0.0.0.0
Other providers work the same way, each with redirect URI https://<your-host>/oauth/callback/<provider>:
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET.MICROSOFT_CLIENT_ID / _SECRET / MICROSOFT_TENANT_ID.OIDC_ISSUER / OIDC_CLIENT_ID / OIDC_CLIENT_SECRET.When more than one is configured, the sign-in page offers a button for each. All variables are listed in .env.example.
Security design
oauth mode unless you set an allowlist (domains or emails), or explicitly opt in with MEDICAL_DOCTOR_ALLOW_ANY_USER=1. Every consult spends your Anthropic credits.email claim (the "nOAuth" issue).MEDICAL_DOCTOR_MAX_SESSION_DAYS, default 90) that rotation can't extend.0600 permissions (MEDICAL_DOCTOR_DB). Authorization codes work once and expire in 5 minutes.MEDICAL_DOCTOR_CONSULT_LIMIT_PER_HOUR caps consults per user to protect model spend. Counters live in the SQLite database, so the limit holds across worker processes and restarts. Replicas on different hosts need a shared volume or a per-replica limit.X-Forwarded-* headers are trusted only from FORWARDED_ALLOW_IPS (default 127.0.0.1). Set it to your load balancer's address range.jwt mode, the email allowlist requires . Set only if your authorization server never lets users set their own email.docker build -t medical-doctor-mcp .
docker run -p 8000:8000 -v md-data:/data --env-file .env medical-doctor-mcp # → https://<your-host>/mcp
app.py is the Vercel entry point. Sign-in data lives in Supabase Postgres (set POSTGRES_URL), so it survives across serverless instances.MEDICAL_DOCTOR_AUTH. The server refuses to start publicly without it, because anyone could run paid consults and records are tied to a signed-in identity./data volume. With POSTGRES_URL or MEDICAL_DOCTOR_DATABASE_URL (Supabase, Neon, RDS, …), you can run any number of instances.MEDICAL_DOCTOR_AUTH=jwt with an external authorization server, plus MEDICAL_DOCTOR_STATELESS=1.cloudflared tunnel --url http://localhost:8000.OpenClaw can use this project in two ways, and you can combine them:
medical-doctor-mcp (stdio) or the HTTP endpoint in OpenClaw's saved MCP servers. See OpenClaw's MCP docs; the CLI form is openclaw mcp add. An example is in examples/openclaw-mcp.json../scripts/install-skills.sh openclaw # → ~/.openclaw/workspace/skills/
./scripts/install-skills.sh claude # → ~/.claude/skills/
You can also publish them to ClawHub.For an OpenClaw "doctor" agent, use examples/openclaw-AGENTS.md as the agent's operating instructions.
OpenClaw's config keys change fast. Check the current OpenClaw docs for exact paths.
| Env var | Default | Meaning |
|---|---|---|
ANTHROPIC_API_KEY | – | Credentials for consult (an ant auth login profile also works) |
MEDICAL_DOCTOR_PROVIDER | anthropic | anthropic / openai / meta / llama (see Model providers) |
MEDICAL_DOCTOR_MODEL | provider default | Model for the default provider |
OPENAI_API_KEY, MODEL_API_KEY, LLAMA_API_KEY | – | Credentials for the OpenAI, Meta and Llama providers |
MEDICAL_DOCTOR_SECOND_OPINION | – (automatic) | Ordered second-opinion reviewers, provider or provider:model, e.g. anthropic,meta:<model>. Unusable entries are skipped; the consult's own provider is used only if it is the only one usable |
MEDICAL_DOCTOR_CONSULT_TIMEOUT | 270 | Overall time budget per consult in seconds, under Vercel's 300 s limit |
MEDICAL_DOCTOR_DATA_KEYS | – | Key-encryption key(s) for patient records, kid:base64,… (medical-doctor-mcp gen-data-key). Required for records on servers; created automatically for local stdio. |
MEDICAL_DOCTOR_CONSULT_DEPTH | standard | Default consult depth: quick (~4 tool rounds, low effort, no web search), standard (8 rounds, 2 guideline searches), thorough (12 rounds, high effort, 5 searches). Callers can override per consult with depth. |
MEDICAL_DOCTOR_EFFORT | medium | Reasoning effort for standard depth: low / medium / high / xhigh / max. Applies to Claude and Meta Muse Spark (max is sent to Meta as xhigh; if a host rejects the parameter it is dropped) |
MEDICAL_DOCTOR_SECOND_OPINION_MODEL | claude-fable-5-1 |
The consult uses the server-side refusal fallback (fallbacks: "default"). If a safety classifier declines a legitimate clinical question, the request is retried on Anthropic's recommended fallback model. The whole skill library sits in a prompt-cached system block, so repeat consults pay roughly 10% of the input cost for it.
case ─► red_flag_screen (regex, negation-aware) ─┐
▼
Claude / OpenAI / Muse Spark / Llama (Med-Peds attending) + charter + 29 skills
│ tool loop: calc_* (adult + pediatric) · drug_label · interactions · PubMed · trials · web search (guidelines)
▼
consult note: Urgency → Problem representation → Differential (⚠️ can't-miss)
→ Evaluation → Management (cited) → What would change it
→ Patient explanation → Evidence → disclaimer + JSON summary
│
▼
structured summary (validated; urgency floor = red-flag screen) + PubMed citation check
evals/cases.yaml holds 24 adult and pediatric vignettes (ACS, stroke, SAH, PE, sepsis, ectopic, febrile neonate, Kawasaki, croup, and others).
medical-doctor-mcp eval runs the deterministic screen on all of them (in CI on every push).medical-doctor-mcp eval --consult --provider openai runs real consults and scores the structured output. A case fails outright on under-triage, an unflagged can't-miss diagnosis, or a fabricated citation.metadata.last_reviewed, review_interval_days, and clinical_review. Overdue skills are flagged to the model inside the consult prompt.
medical-doctor-mcp check-freshness lists review status and cited guideline editions more than 5 years old.clinical_review: pending until a licensed clinician signs them off.LOG_FORMAT=json.X-Request-Id, echoed back and stamped on every log line).consult span. Install .[otel] and set OTEL_EXPORTER_OTLP_ENDPOINT to export them to Honeycomb, Grafana, Datadog, Langfuse and others.skills/<name>/SKILL.md with name (it must match the folder name), description and metadata.last_reviewed frontmatter. The server, Claude Code, and OpenClaw all pick it up.calculators.py, register it in CALCULATORS, and add a test with a published reference value.sources.py and a tool in server.py..github/workflows/ci.yml runs the test suite (with Postgres) and the red-flag screen evals on Python 3.11, 3.12, and 3.13 for every pull request and every push to main..github/workflows/evals.yml (manual) runs full consult evals on a chosen provider. guideline-freshness.yml (monthly) checks skill review dates..github/workflows/claude-code-review.yml: Claude reviews every pull request and posts inline comments..github/workflows/claude.yml: mention @claude in an issue or PR comment to ask questions or request changes.The two Claude workflows need one-time setup:
ANTHROPIC_API_KEY repository secret. Alternatively, add CLAUDE_CODE_OAUTH_TOKEN from claude setup-token and switch the input as noted in the workflow file.Running /install-github-app in Claude Code does both steps for you.
pip install -e '.[dev]'
pytest
Tests cover the full OAuth flow as ChatGPT and Claude run it (discovery, DCR, consent, Google sign-in, PKCE token exchange, refresh rotation, revocation, allowlist denial), JWT validation, API keys, each adult and pediatric calculator against published reference values, the red-flag triage (including negation handling), the MCP surface, the consult tool loop (with a fake Claude client), and the data-source parsers (with mocked HTTP).
patient_createpatient_listpatient_chartpatient_updatepatient_delete_item| The personal-doctor chart for you and family members (encrypted, private to the account) |
my_chart / chart_record | Load the patient's chart at the start of a conversation (opens one on the first visit), and save everything they mention (merged, not duplicated) |
ehr_connect | Connects a patient portal (Epic MyChart, Oracle Health, athenahealth, any SMART on FHIR server) and imports the records |
patient_import_fhir | Imports records from a hospital, clinic or health-app FHIR R4 export (conditions, medications, allergies, labs, vitals, immunizations, procedures, family history). Re-importing updates entries instead of duplicating them. |
patient_export / patient_erase / patient_access_log | FHIR R4 export, permanent erasure (crypto-shredding), and a tamper-evident access log |
preventive_care_due | Screenings, vaccines, and counseling due by age, sex, and risk (USPSTF A/B, CDC/ACIP, AAP Bright Futures) |
draft_prescription / draft_referral | Drafts for a licensed clinician, with deterministic safety checks and patient- and clinician-facing calls to action |
care_plan_update | Track drafts and follow-ups (accepted, completed, declined) |
Patient/$everythingpatient_import_fhirehr_connect(patient_id, fhir_base_url, portal) returns a link. The user opens it, signs in to their portal (Epic MyChart, Oracle Health/Cerner, athenahealth, or any SMART on FHIR server) and approves read access. Conditions, medications, allergies, labs, vitals, immunizations and procedures are then imported into the profile.
patient_import_fhir or entered by hand.patient_id to consult, and only as a minimal clinical summary.email_verified: trueMEDICAL_DOCTOR_JWT_TRUST_UNVERIFIED_EMAIL=1Claude reviewer model for second opinions (other providers: use provider:model in MEDICAL_DOCTOR_SECOND_OPINION) |
MEDICAL_DOCTOR_AUTO_CHART | 1 | Open a chart on the first visit and save stated facts and visit notes automatically |
MEDICAL_DOCTOR_FAST_MODE | 0 | 1 turns on Claude fast mode (about 2.5x faster output at 2x the token price; Claude API only). Falls back to standard speed automatically when fast mode is rate-limited. |
MEDICAL_DOCTOR_WEB_SEARCH | 1 | Lets the attending use Claude web search, restricted to guideline publishers (CDC, FDA, NICE, WHO, USPSTF, ACC/AHA, …); sites with user comments are excluded |
MEDICAL_DOCTOR_VERIFY_CITATIONS | 1 | Check every PMID in consult notes against PubMed |
LOG_FORMAT | text (json on Vercel) | json for one JSON object per log line |
OTEL_EXPORTER_OTLP_ENDPOINT | – | Export traces over OTLP (needs pip install '.[otel]') |
MODEL_API_KEY, MEDICAL_DOCTOR_META_MODEL | – / muse-spark-1.3 | Meta Model API key and model; *-contributor models are refused |
MEDICAL_DOCTOR_LLAMA_BASE_URL | – | Required for the llama provider (OpenAI-compatible Llama host) |
MEDICAL_DOCTOR_SMART_CLIENTS | – | Patient-portal app IDs, e.g. epic=<client id>,oracle=<client id>; enables ehr_connect |
MEDICAL_DOCTOR_SMART_SECRETS | – | Only for portals that registered the app as confidential: epic=<secret> |
MEDICAL_DOCTOR_SMART_SCOPES | SMART v1 patient read scopes | Override the requested scopes |
MEDICAL_DOCTOR_MAX_TOOL_ROUNDS | 12 | Upper bound on tool calls per consult |
MEDICAL_DOCTOR_SKILLS_DIR | bundled | Use your own or extended skill library |
NCBI_API_KEY, OPENFDA_API_KEY | – | Optional; raise rate limits |
MEDICAL_DOCTOR_AUTH | none | none / apikey / oauth / jwt (see Authentication) |
MEDICAL_DOCTOR_PUBLIC_URL | – | Public base URL; required when auth is on |
MEDICAL_DOCTOR_CORS_ORIGINS | * | Origins allowed for browser-based clients |
MEDICAL_DOCTOR_STATELESS | 0 | 1 for load-balanced or serverless deployments (always on in app.py) |
POSTGRES_URL / MEDICAL_DOCTOR_DATABASE_URL | – | Postgres for sign-in data (Supabase pooled URI); replaces the SQLite file |
MEDICAL_DOCTOR_DB_CA_CERT | – | The database's CA certificate (PEM text or a file path). Set it and the connection verifies the server's certificate and host name (sslmode=verify-full); without it the connection is encrypted but not verified |
MEDICAL_DOCTOR_CONSULT_LIMIT_PER_HOUR | 20 | Per-user consult cap (0 = unlimited) |
MEDICAL_DOCTOR_ALLOW_UNAUTHENTICATED | 0 | The server refuses to listen on a non-loopback address, or run on Vercel, without auth unless this is 1 |