🩺 doctoreto-mcp
Let your AI agent find the right doctor on Doctoreto.
Search Iranian doctors by speciality, city, neighborhood and visit type, compare visit fees,
see free appointment times, read reviews, and find hospitals, labs and clinic offers, all from Claude, Cursor or Copilot.
Quick start · What it can do · Tools · FAQ · فارسی
Why
On Doctoreto (doctoreto.com) a doctor card shows a name and a rating, but the things you decide on are a few
clicks deeper: which offices the doctor has, what the visit costs at the office (often hidden on the page), what a
phone or video consultation costs, and when the next free time actually is. An agent with doctoreto-mcp reads the
search, the doctor's services and the slot picker, and hands you the booking link:
You: A cardiologist in Pasdaran, Tehran, as soon as possible. What does the visit cost?
Agent: calls
dt_search_doctors(city="tehran", speciality="cardiologist", neighborhood="pasdaran", has_free_slot=True)→dt_doctor(doctor="xqbEWZ")→dt_free_slots(consultation_id=1943, days=7)
Service Fee Paid when booking Next free Office visit, Pasdaran 250,000 0 Tue 6 Oct, 10:00 (25 free times that day) Phone call, 15 minutes 750,000 750,000 Tue 6 Oct, 10:00 دکتر کامبیز پرآذران, subspecialist in cardiology: 408 reviews, 92% recommend, about 36 minutes wait at the office. The office fee is paid at the office. Book here: https://doctoreto.com/doctor/dr-kambiz-parazaran/xqbEWZ
Real tool output from 2026-10-06; prices and free times change all the time. Prices are in Toman.
What it can do
- 🔎 Find doctors by speciality, city, neighborhood, name, gender, insurance and visit type (office, phone, text, video, instant)
- ⏱️ Soonest first: sort by the earliest free slot, by popularity or by number of bookings; search near a point
- 💰 Real prices: office visit fee (also when the site hides it), online consultation prices, deposits
- 📅 Free times: free appointment times per day for any office or online service, up to a month ahead
- ⭐ Reviews: stars, recommend rate, waiting time, per-category averages; reviewer names are never returned
- 🏥 Centers: hospitals, clinics, laboratories, imaging, pharmacies (24h, state/private, map search), hours and insurances
- 🏷️ Clinic offers: fixed-price procedures (ultrasound, echo, laser, check-ups) with deposits and free times
- 📖 Health magazine: background articles on conditions and tests
- 🔒 Read-only by design: no login, no booking, no payment; the agent gives you the link to book
Quick start
You need uv.
Claude Code
claude mcp add doctoreto -- uvx doctoreto-mcp
Claude Desktop
Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"doctoreto": { "command": "uvx", "args": ["doctoreto-mcp"] }
}
}
Cursor
Click Install in Cursor above, or add the Claude Desktop block to ~/.cursor/mcp.json.
VS Code (Copilot agent mode)
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"doctoreto": { "type": "stdio", "command": "uvx", "args": ["doctoreto-mcp"] }
}
}
Anything else
It's a standard stdio MCP server: run uvx doctoreto-mcp, or pip install doctoreto-mcp and run doctoreto-mcp.
Then just ask:
- "A female dermatologist in Shiraz with a free slot this week, and her visit fee?"
- "Which pediatricians offer a video call today, and how much is it?"
- "A 24-hour pharmacy near Vanak Square."
- "How much is an echocardiography at a Doctoreto clinic in Tehran, and when is the next free time?"
- یک متخصص گوش و حلق و بینی در محدوده سعادتآباد با بیمه تامین اجتماعی
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
doctoreto-mcp (runs on your machine)
│
│ HTTPS (JSON)
├──────▶ api.doctoreto.com (doctors, slots, reviews, centers, offers)
└──────▶ doctoreto.com/blog (health magazine)
doctoreto-mcp runs locally and calls the same public endpoints the Doctoreto website uses.
There's no hosted server in between, no API key, and nothing about you is sent anywhere else.
Tools
Doctors, centers and offers are identified by a 6-character id (xqbEWZ, the last part of
doctoreto.com/doctor/dr-kambiz-parazaran/xqbEWZ); every tool also accepts the page URL itself.
🔎 Find a doctor (6)
| Tool | What it does |
|---|---|
dt_suggest |
Free phrase → matching doctors, speciality slugs, service tags and centers |
dt_search_doctors |
Doctors by city, speciality, neighborhood, name, gender, insurance, visit type, free slot; sorting |
dt_specialities |
Speciality list with the slugs the search needs |
dt_cities |
City slug and id; cities that have a speciality, with doctor counts |
dt_neighborhoods |
Neighborhoods of a city and nearby cities, with doctor counts |
dt_insurances |
Basic and supplementary insurers with their ids |
🩺 One doctor (3)
| Tool | What it does |
|---|---|
dt_doctor |
Profile, every office and online service with fee, deposit, address and next free time, review summary |
dt_free_slots |
Free appointment times per day for one service (office, phone, video, offer, lab), up to 31 days |
dt_reviews |
Reviews of a doctor, center or offer: stars, text, labels, waiting time, replies (no names) |
🏥 Centers (2)
| Tool | What it does |
|---|---|
dt_search_centers |
Hospitals, clinics, labs, imaging, pharmacies by city, type, 24h, state/private, or near a point |
dt_center |
One center: hours, departments, insurances, lab rules, bookable services, doctors |
🏷️ Clinic offers and reading (3)
| Tool | What it does |
|---|---|
dt_search_offers |
Fixed-price procedures and packages by text, city, speciality, price range, doctor or place |
dt_offer |
One offer: price, deposit, provider, terms, variants with their free times |
dt_health_articles |
Doctoreto health magazine articles on a condition, test or treatment |
All 14 tools are annotated readOnlyHint: true and return compact structured JSON, so they don't flood the agent's context.
Good to know
- Prices are in Toman. For an office visit
feeis what you pay at the office andpay_online_nowwhat is charged when booking (usually 0). For phone, text and videofeeis the online price. Anullfee means the doctor lists none. - Use
dt_doctorfor online prices. The search list and the profile show a phone price three times the one on the booking page;dt_doctorreads the booking box, which matches the page. - Dates are Gregorian
YYYY-MM-DD(1405-07-22 = 2026-10-14); times are Tehran local. Jalali dates are given next to them. - Booking happens on the site. It needs an SMS code, so the agent finds the doctor and time and gives you the page link.
- Insurance: few doctors list insurances, so
insurance_idsnarrows a search a lot. Centers list theirs indt_center; the center search ignores insurance filters. - Privacy: no phone numbers and no reviewer names are returned.
FAQ
Can it book an appointment for me?
No, and that's deliberate. It has no login and never calls the booking, payment, review or chat endpoints. The agent finds the doctor, the service and a free time; you book on doctoreto.com with your own phone number.
"slug alone cannot be resolved"
Doctoreto's API needs the 6-character id, not the name slug. Paste the whole page URL
(https://doctoreto.com/doctor/<slug>/<id>), or let the agent search by the doctor's Persian name.
Do I need an Iranian IP?
No geo block was seen: direct calls and calls through a proxy in Turkey both worked (2026-10-06). Cloud servers
were not tested; if Doctoreto blocks one, set DOCTORETO_MCP_PROXY.
A search returns 0 doctors
The filters may be too narrow (an insurance plus a neighborhood often is). Drop a filter, or check the slugs with
dt_suggest, dt_specialities or dt_neighborhoods. An unknown city or speciality slug returns an error.
Claude Desktop says uvx is not found
Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.
How do I debug what the agent sees?
npx @modelcontextprotocol/inspector uvx doctoreto-mcp
Configuration
| Variable | Default | Meaning |
|---|---|---|
DOCTORETO_MCP_PROXY |
unset | HTTP proxy for every request, e.g. http://user:pass@host:port |
فارسی
doctoreto-mcp به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه میدهد در دکترتو پزشک مناسب را بر اساس تخصص، شهر، محله، بیمه و نوع ویزیت (حضوری، تلفنی، متنی، تصویری) پیدا کند، هزینه ویزیت و زمانهای خالی نوبت را ببیند، نظرات بیماران را بخواند و بیمارستان، آزمایشگاه و خدمات دکترتو کلینیک را هم جستوجو کند.
- فقط خواندنی است: وارد حساب نمیشود، نوبت رزرو نمیکند و پرداخت نمیکند؛ لینک صفحه پزشک را برای رزرو میدهد.
- همه قیمتها به تومان است.
- شماره تلفن و نام نظردهندگان را برنمیگرداند.
- روی سیستم خود شما اجرا میشود و به هیچ سرور واسطی داده نمیفرستد.
نصب در Claude Code:
claude mcp add doctoreto -- uvx doctoreto-mcp
بعد بپرسید: «یک متخصص قلب در پاسداران تهران با نزدیکترین نوبت خالی، با هزینه ویزیت»
Development
git clone https://github.com/sepehr071/doctoreto-mcp && cd doctoreto-mcp
uv sync
uv run pytest # offline, against recorded responses
uv run pytest -m live # real APIs
uv run ruff check .
Tools live in src/doctoreto_mcp/search.py, doctor.py, centers.py, offers.py and info.py; each is a typed
async function with a docstring that tells the agent when to use it. Issues and PRs are welcome, especially new tools
and fixes for API changes.
Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions tests,
publishes to PyPI and the MCP Registry, and creates the GitHub Release.
Disclaimer
Unofficial and not affiliated with or endorsed by Doctoreto. It uses the public endpoints of the doctoreto.com website, which can change without notice. It gives information, not medical advice. Please keep request rates reasonable.
License
Metadata
Release files for doctoreto-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| doctoreto_mcp-0.1.1.tar.gz | 454.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| doctoreto_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 484.7 kB
Release files / doctoreto_mcp-0.1.1.tar.gz
| Download URL | doctoreto_mcp-0.1.1.tar.gz |
|---|---|
| Size | 454.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a180afba757094dc14852383da7f361767befe3284e2e8fdc890a726ff1e4631
|
|
BLAKE2b-256 checksum How to use checksums |
8a7798e7effe7983216e18e86faa47a0cec52f87c770c0a5083b74a8740e25ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logRelease files / doctoreto_mcp-0.1.1-py3-none-any.whl
| Download URL | doctoreto_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 30.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b8634e426f2150c87dcaa67a1bfa0d1f897c6858025ba4adc1e48302b255e8bf
|
|
BLAKE2b-256 checksum How to use checksums |
8c94fb8c55d351e1cb7772fd01aade8a7834cfe70e456b26976a961f9aa6d90b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency log