doctoreto-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@doctoreto-mcpA cardiologist in Pasdaran, Tehran, as soon as possible. What does the visit cost?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🩺 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.
Related MCP server: Doktor MCP Server
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 mcp add doctoreto -- uvx doctoreto-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"doctoreto": { "command": "uvx", "args": ["doctoreto-mcp"] }
}
}Click Install in Cursor above, or add the Claude Desktop block to ~/.cursor/mcp.json.
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"doctoreto": { "type": "stdio", "command": "uvx", "args": ["doctoreto-mcp"] }
}
}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.
Tool | What it does |
| Free phrase → matching doctors, speciality slugs, service tags and centers |
| Doctors by city, speciality, neighborhood, name, gender, insurance, visit type, free slot; sorting |
| Speciality list with the slugs the search needs |
| City slug and id; cities that have a speciality, with doctor counts |
| Neighborhoods of a city and nearby cities, with doctor counts |
| Basic and supplementary insurers with their ids |
Tool | What it does |
| Profile, every office and online service with fee, deposit, address and next free time, review summary |
| Free appointment times per day for one service (office, phone, video, offer, lab), up to 31 days |
| Reviews of a doctor, center or offer: stars, text, labels, waiting time, replies (no names) |
Tool | What it does |
| Hospitals, clinics, labs, imaging, pharmacies by city, type, 24h, state/private, or near a point |
| One center: hours, departments, insurances, lab rules, bookable services, doctors |
Tool | What it does |
| Fixed-price procedures and packages by text, city, speciality, price range, doctor or place |
| One offer: price, deposit, provider, terms, variants with their free times |
| 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
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.
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.
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.
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.
Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.
npx @modelcontextprotocol/inspector uvx doctoreto-mcpConfiguration
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
فارسی
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
Available Tools
14 toolsdt_centerCenter detailsARead-onlyIdempotent
A center's page: address, coordinates, departments, services, accepted insurances, attributes, opening
hours, lab admission rules, bookable services with consultation_id (for dt_free_slots) and its doctors
(hash ids for dt_doctor, with each doctor's earliest free slot).
Doctor private offices (type office) have no center page: use dt_doctor for them. Booking needs an SMS
login on the site: give the user url. Next: dt_free_slots, dt_doctor, dt_reviews(of='center').
| Name | Required | Description | Default |
|---|---|---|---|
| center | Yes | Center hash id from a search ('YNrrOb') or its page URL ('https://doctoreto.com/center/raz-shiraz-lap/YNrrOb'). | |
| doctors | No | How many of its doctors to list (0 = none). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description layers on non-obvious behavior: the auth/SMS requirement for booking, the fact that office-type doctors lack a center page, and that returned entries carry `consultation_id` and doctor hash ids that feed specific sibling tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource's contents, then the practical routing notes. Dense and slightly telegraphic in the opening enumeration, but nearly every clause carries information the agent needs to chain calls.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists, the description still highlights the output fields that matter for orchestration (consultation_id, doctor hash ids, earliest free slot), plus the exclusions and prerequisite. Nothing needed to select or call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are fully documented there, including the hash-or-URL format and the default/cap on `doctors`. The description adds only indirect cues (mentions of hash ids and consultation ids), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a center's page) and enumerates exactly what it returns: address, coordinates, departments, services, insurances, attributes, opening hours, lab admission rules, bookable services and doctors. It explicitly carves out what it is NOT for ('Doctor private offices (type office) have no center page: use dt_doctor'), cleanly separating it from the sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit alternatives and conditions: use dt_doctor for office-type practitioners, and the follow-up chain is spelled out ('Next: dt_free_slots, dt_doctor, dt_reviews(of="center")'). It also surfaces a prerequisite the agent must relay to the user (booking needs an SMS login).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_citiesCitiesARead-onlyIdempotent
Find a city's slug (for search filters) and numeric id (for dt_suggest).
Without arguments returns the main cities first. With speciality returns only cities that have doctors
of it, with the doctor count (main cities only; a search may still find doctors elsewhere).
Next: dt_search_doctors(city=slug) or dt_neighborhoods.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max cities. | |
| query | No | Part of the city name in Persian or the slug, e.g. 'شیراز'. | |
| speciality | No | Only cities that have doctors of this speciality, with counts, e.g. 'cardiologist'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, non-destructive, so the safety profile is handled. The description adds genuinely new behavioral detail beyond them: default ordering ('main cities first'), that `speciality` mode returns doctor counts, and the important caveat that counts cover main cities only while searches may surface doctors elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the tool's core purpose and output meaning, followed by mode behavior and next steps. No filler; every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't describe return values, and it still covers purpose, mode-dependent behavior, the key caveat, and chaining to sibling tools. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented and the baseline is 3. The description goes beyond the schema by explaining the semantics of `speciality` (returns only cities having such doctors, with counts, main cities only) and the default no-argument behavior of `limit`/`query`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find a city's slug ... and numeric id') and even names the downstream consumers of each output field (search filters, dt_suggest). This clearly distinguishes it from siblings like dt_suggest and dt_neighborhoods without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit behavioral modes (no arguments vs. with `speciality`) and an explicit follow-up path: 'Next: dt_search_doctors(city=slug) or dt_neighborhoods.' It also warns that the speciality filter is incomplete because 'a search may still find doctors elsewhere.' It lacks an explicit when-not-to-use statement, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_doctorDoctor profileARead-onlyIdempotent
A doctor's profile with every bookable service, its price in Toman and its next free time.
services[] lists each office and online visit (phone, text, video, instant) with consultation_id
(input of dt_free_slots), fee (the full price: for an office visit the fee paid at the office, for
online visits the online price), pay_online_now (charged when booking; usually 0 for office visits),
the office address and coordinates, and next_free (Tehran time). Also the about text, review summary
(count, recommend percent, 1-5 averages per category), office waiting time and treated conditions.
Booking needs an SMS login on the site: give the user url. Next: dt_free_slots, dt_reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| doctor | Yes | Doctor hash id from a search ('xqbEWZ') or the doctor's page URL ('https://doctoreto.com/doctor/dr-kambiz-parazaran/xqbEWZ'). The slug alone cannot be resolved. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, open-world profile, so the description does not need to restate safety. It adds real behavioral context instead: `pay_online_now` is charged at booking and is usually 0 for office visits, `fee` means different things for office vs online visits, and booking requires an SMS-authenticated login. That is meaningful value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then dense but purposeful field-level detail. Every clause carries information (fee semantics, time zone, booking prerequisite); it is long but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the return shape (services[], reviews summary, waiting time, conditions), the Tehran-time convention, the input chain into dt_free_slots, and the booking auth hurdle. An output schema exists so return-field prose is partly redundant, but the description is complete enough for an agent to call and use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `doctor` parameter is already fully documented in the schema (hash id vs full page URL, slug not resolvable). The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (a doctor's profile) and enumerates exactly what it returns: bookable services, price in Toman, and next free time. This clearly separates it from siblings like dt_search_doctors (discovery) and dt_center (facility profiles).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent forward: 'Next: dt_free_slots, dt_reviews', and notes the prerequisite that booking needs an SMS login on the site and the user must be given `url`. It stops short of stating when NOT to call it (e.g. to just find a doctor, use dt_search_doctors), so it is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_free_slotsFree appointment slotsARead-onlyIdempotent
Free appointment times of one service (office visit, phone/video call, clinic offer, lab admission).
Returns only days with free times: date, English weekday, Jalali date and the free start times
(HH:MM, Tehran local; for phone/video the call start). Times already past today are dropped.
bookable_until is the last day the doctor has opened (often about 30 days ahead). Text consultations
usually have no time slots. Booking needs an SMS login on doctoreto.com: give the user the page URL.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days to check from start_date. | |
| start_date | No | First day, Gregorian YYYY-MM-DD; default today (Tehran), e.g. '2026-10-14'. | |
| consultation_id | Yes | Consultation id of one service, from dt_doctor services[], dt_center services[] or dt_offer variants[], e.g. 1943. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safe-read profile (readOnly, idempotent, non-destructive), and the description goes beyond them by disclosing filtering behavior (only days with free times are returned, past times today are dropped), the timezone of returned HH:MM values (Tehran local), and the meaning/bound of `bookable_until` (~30 days ahead). It stops short of describing pagination or failure modes when a service has no availability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and return shape are front-loaded in the first two sentences, with caveats and the booking note trailing. It is tight overall, though the SMS-login/URL sentence is slightly tangential to invoking this read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description only needs to add the non-structured context it does provide: which days are omitted, timezone, text-consultation caveat, and the booking prerequisite. What is missing is minimal, mostly failure/no-availability behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so days/start_date/consultation_id are already documented in the schema, including examples and formats. The description adds contextual framing about timezone and the fact that times are start times (for phone/video, the call start), but supplies no syntax or default behavior beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource: 'Free appointment times of one service', and enumerates the service kinds (office visit, phone/video call, clinic offer, lab admission). Combined with the sibling names (dt_doctor, dt_offer, dt_center), an agent can tell this is the availability-lookup tool rather than a listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful operating context — text consultations usually have no slots, and booking requires an SMS login on doctoreto.com — but it never states when to call this versus dt_doctor/dt_offer, nor the prerequisites that must hold before calling (e.g. needing a consultation_id already fetched). Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_health_articlesHealth articlesARead-onlyIdempotent
Search Doctoreto's health magazine (about 5,000 articles) for background on a condition, test or treatment.
Returns title, link, publish date and a summary; set text_chars to read the articles. General information only, not medical advice: for a diagnosis book a doctor (dt_search_doctors).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max articles. | |
| query | Yes | Disease, test, drug or treatment in Persian, e.g. 'فشار خون' or 'آزمایش تیروئید'. | |
| text_chars | No | Characters of article text to include per article; 0 = summary only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely useful context beyond them: the scope disclaimer that output is general information rather than medical advice, and a preview of returned fields (title, link, publish date, summary) plus how text_chars changes the response. It does not discuss rate limits or result-ranking behavior, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the resource and its scope, followed by the return fields and the disclaimer/alternative routing. Every clause earns its place; nothing is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with a full output schema and 100% parameter documentation, the description supplies exactly the missing pieces: intended use, output preview, disclaimer, and sibling routing. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents all three parameters. The description adds a modest but real point beyond the schema: that the default response is a summary and that text_chars is the switch that turns on full article text, linking the parameter to the output shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (Doctoreto's health magazine, ~5,000 articles) plus the intended subject matter (condition, test, treatment). It also gestures at the sibling boundary by naming dt_search_doctors for the adjacent need, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('background on a condition, test or treatment'), explicit when-not ('General information only, not medical advice'), and names the alternative tool (dt_search_doctors) with the condition that selects it (for a diagnosis). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_insurancesInsurancesARead-onlyIdempotent
List basic and supplementary insurers with the ids dt_search_doctors(insurance_ids=...) takes.
About 84 insurers. Few doctors list insurances, so an insurance filter narrows a search a lot; centers list theirs in dt_center.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Part of the insurer's name in Persian, e.g. 'تامین' or 'آتیه'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely useful non-obvious context: the dataset is small (~84 insurers) and sparse in doctor listings, which materially affects how an agent should use the result. It does not cover pagination or result ordering, but the output schema exists to carry return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose and the downstream consumer before the caveat. Every sentence carries information — the id linkage, the corpus size, and the doctor/center distinction — with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, a fully described single-parameter schema, and an output schema present, the description supplies everything else an agent needs: the tool's role in the doctor-search workflow, the approximate result size, and the data-sparsity caveat. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single 'query' parameter is fully documented in the schema, including a Persian example ('تامین' or 'آتیه'). The description adds no additional syntax or matching-semantics detail (e.g., substring vs prefix matching), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List basic and supplementary insurers') and goes further by naming the exact consumer of the returned ids: dt_search_doctors(insurance_ids=...). An agent can distinguish this from sibling lookup tools like dt_specialities or dt_cities purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use: the returned ids feed dt_search_doctors, and it warns that 'few doctors list insurances, so an insurance filter narrows a search a lot' — an important behavioral caveat about filter aggressiveness. It also routes center insurance lookups to dt_center. It stops short of explicitly stating when not to use it (e.g., when to prefer dt_specialities instead), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_neighborhoodsNeighborhoodsARead-onlyIdempotent
Neighborhoods of a city (most doctors first) and nearby cities, each with a doctor count.
Some entries are district groupings (منطقه 3, غرب) that work as filters too. Use a slug as dt_search_doctors(city=..., neighborhood=slug); suggest a nearby city when the user's city has few doctors.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City slug from dt_cities, e.g. 'tehran'. | |
| limit | No | Max neighborhoods. | |
| query | No | Part of the neighborhood name in Persian or slug, e.g. 'پاسداران'. | |
| speciality | No | Count only doctors of this speciality, e.g. 'cardiologist'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: results are ordered most-doctors-first, some entries are district groupings that double as filters, and nearby cities are included. It doesn't mention auth or rate limits, but the added content is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose front-loaded; the parenthetical examples and the follow-up usage tip earn their place. Minor structural awkwardness from the mixed prose/semicolon construction, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering return values and annotations covering the safety profile, the description supplies purpose, ordering, filter semantics, and a next-step hint. It is complete enough for an agent to call correctly, with only explicit alternative-tool guidance missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces that a slug is the expected identifier but adds little about city, limit, query, or speciality semantics beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: neighborhoods of a city plus nearby cities, each with a doctor count. It implies its distinction from dt_cities (which returns cities, not neighborhoods) and from dt_specialities, but doesn't name a sibling explicitly, so it stops just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives downstream usage (feed the slug into dt_search_doctors(city=..., neighborhood=slug)) and one conditional (suggest a nearby city when the user's city has few doctors). However it never states when to choose this tool over alternatives like dt_cities, leaving tool selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_offerClinic offer detailsARead-onlyIdempotent
One clinic offer in full: price, discount, deposit, who performs it and where, description, terms,
capacity, expiry, rating, and its bookable variants with consultation_id for dt_free_slots.
Booking and payment need an SMS login on the site: give the user url.
| Name | Required | Description | Default |
|---|---|---|---|
| offer | Yes | Offer hash id ('ArraJa'), numeric id ('129311') or page URL ('https://doctoreto.com/offer/ArraJa'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/no-destructive, so the safety profile is covered. The description adds real context beyond that: the authentication requirement for booking/payment and the instruction to surface `url` to the user, which an agent needs for the downstream flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads the returned payload, the second carries the operational caveat. The long field enumeration is dense but earns its space by telling the agent what detail is available without opening the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description instead points at the one output value that matters downstream (`consultation_id` for dt_free_slots). For a single-parameter read tool this is nearly complete; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented in the schema (hash id, numeric id, or URL). The description adds no parameter syntax of its own, so the schema does the heavy lifting — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (one clinic offer) and enumerates the fields returned — price, discount, deposit, provider, location, terms, capacity, variants — which clearly separates it from dt_search_offers. It never names the sibling explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an actionable workflow hint (booking/payment requires SMS login, hand the user `url`) and a cross-tool pointer (`consultation_id` feeds dt_free_slots), but no explicit when-to-use-this-vs-dt_search_offers guidance or prerequisites for the call itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_reviewsReviewsARead-onlyIdempotent
Patient reviews in the site's order (doctors and centers newest first, offers oldest first): stars 1-5, recommends or not, text, chosen labels, visit type, reason for the visit, office waiting time, date (Gregorian Tehran day and Jalali) and the doctor's reply.
Reviewer names are never returned. There is no sort or filter upstream: to find low ratings, page through (pages = total / limit). The summary (count, recommend percent, category averages) is in dt_doctor.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Hash id or page URL of the doctor, center or offer, e.g. 'xqbEWZ' or 'https://doctoreto.com/center/raz-shiraz-lap/YNrrOb'. | |
| of | Yes | Whose reviews: a doctor, a center or a clinic offer. | |
| page | No | 1-based page number. | |
| limit | No | Reviews per page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile, yet the description adds substantive traits: reviewer names are never returned (privacy), ordering differs by entity type, no server-side sort or filter exists, and pagination must be computed manually. These are real behavioral constraints an agent cannot infer from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return shape and its ordering rule, followed by the operational note and the sibling pointer. Slightly dense mid-sentence field listing keeps it from being maximally tight, but there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the field enumeration is partly redundant, but the ordering rule, privacy note, and pagination math fill in gaps the structured fields do not cover. Adequate for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema cannot: the `of` enum changes ordering behavior, and pagination is described as total/limit. Page and limit semantics otherwise remain with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact resource (patient reviews) for three target types and enumerates the returned fields, including ordering semantics ('doctors and centers newest first, offers oldest first'). It explicitly routes the summary use case to the sibling dt_doctor, so an agent can separate it from other dt_* lookups without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: 'There is no sort or filter upstream: to find low ratings, page through (pages = total / limit)' and points to dt_doctor for aggregates. It doesn't state explicit exclusions or prerequisites, but the when-to-use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_search_centersSearch centersARead-onlyIdempotent
Find hospitals, clinics, infirmaries, laboratories, imaging centers and pharmacies with filters.
Each card has the hash id (input of dt_center), kind, state/private, 24h flag, address, coordinates,
review count and recommend percent, doctor count and whether it takes online bookings. With near_lat and
near_lon it searches a square around the point (map search) and sorts by distance; dense areas return only
part of the centers as cards and count the rest in more_in_area. Insurance filters have no effect
upstream: check insurances in dt_center. Next: dt_center, dt_reviews(of='center').
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City slug from dt_cities, e.g. 'tehran'. | |
| name | No | Part of the center's name in Persian, e.g. 'قلب'. | |
| page | No | 1-based page number. | |
| type | No | Kind of center, e.g. 'laboratory'. | |
| limit | No | Centers per page (the API pages by 20). | |
| near_lat | No | Latitude of a point in Iran, e.g. 35.7575. | |
| near_lon | No | Longitude of a point in Iran, e.g. 51.4100. | |
| open_24h | No | Only centers open around the clock (pharmacies, hospitals). | |
| ownership | No | State (public) or private. | |
| radius_km | No | With near_lat/near_lon: half-width of the square searched, in km. | |
| speciality | No | Department / speciality slug from dt_specialities, e.g. 'ophthalmologist'. | |
| service_tag | No | Service tag slug from dt_suggest, e.g. 'mri'. | |
| neighborhood | No | Neighborhood slug from dt_neighborhoods, with city only, e.g. 'pasdaran'. | |
| online_lab_admission | No | Only laboratories that take online admission bookings. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds real behavioral context: map searches sort by distance, dense areas truncate results and report the remainder via `more_in_area`, and insurance filtering is a dead end. It omits pagination depth/limits and any rate-limit or throttling behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs, front-loaded with what is returned before the mechanics. The card-field enumeration is dense but each item maps to a real decision an agent makes (e.g. `id` as the dt_center input, `more_in_area` for truncation), so the sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 14 optional filters, fast-follow sibling routing, and an output schema present, the definition is nearly self-sufficient — return-shape details are correctly delegated to the output schema. The remaining gap is that no guidance is given on combining filters (e.g. neighborhood requires city) or on paging through dense-area results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 14 parameters and a 3 is the baseline. The description adds only marginal filter semantics (near_lat/near_lon trigger a distance-sorted square search) and actually references an 'insurance filter' that does not exist as a parameter, which could mildly mislead rather than clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and an enumerated resource list ('Find hospitals, clinics, infirmaries, laboratories, imaging centers and pharmacies with filters'), which immediately distinguishes it from the doctor-oriented sibling dt_search_doctors. The agent knows exactly what entity set this tool returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete workflow routing ('Next: dt_center, dt_reviews(of="center")') and a clear negative rule ('Insurance filters have no effect upstream: check `insurances` in dt_center'). It does not, however, contrast itself with dt_search_doctors or explain when a city/neighborhood filter should be preferred over the map (near_lat/near_lon) mode, so the alternative-selection guidance stops short of explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_search_doctorsSearch doctorsARead-onlyIdempotent
Search doctors on Doctoreto by city, speciality, neighborhood, service tag, name, gender, insurance and visit type.
Each card has the hash id (input of dt_doctor), visit types offered, the office visit fee when listed,
office areas, the earliest free slot over all services (Tehran time, with the Jalali date), review count,
recommend percent and bookings. Online consultation prices are not in the cards (the list's phone price
differs from the booking page): call dt_doctor for prices. near_lat/near_lon narrow to doctors near a point.
Next: dt_doctor -> dt_free_slots.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City slug from dt_cities, e.g. 'tehran'. Omit for the whole country. | |
| name | No | Doctor's name in Persian (part is enough), e.g. 'پرآذران'. | |
| page | No | 1-based page number. | |
| sort | No | default = site ranking (sponsored first), popular = review count and recommend rate, earliest = soonest free slot, most_booked = most bookings. | default |
| limit | No | Doctors per page (about 1 KB each). | |
| gender | No | Only male or only female doctors. | |
| near_lat | No | Latitude of a point in Iran, e.g. 35.7575. | |
| near_lon | No | Longitude of a point in Iran, e.g. 51.4100. | |
| speciality | No | Speciality slug from dt_specialities or dt_suggest, e.g. 'cardiologist'. | |
| visit_type | No | Only doctors offering this visit: office (in person), phone, text (chat), video, instant (on-call phone/text now), any_online. | |
| service_tag | No | Service or symptom tag slug from dt_suggest, e.g. 'echocardiography'. | |
| neighborhood | No | Neighborhood slug from dt_neighborhoods, with city only, e.g. 'pasdaran'. | |
| has_free_slot | No | Only doctors with a free appointment slot. | |
| insurance_ids | No | Insurance ids from dt_insurances (any of them), e.g. [1]. Few doctors list insurances. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description still adds real value: it discloses what each card contains, flags that the list's phone price differs from the booking page, and warns that online consultation prices are absent from cards. That is meaningful behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the remaining clauses carry functional information (card contents, price caveat, next steps) rather than filler. It is somewhat dense and wraps across many lines, but each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter search tool with an output schema present, the description supplies the workflow chain, the pricing caveat, and the output card semantics. An agent has everything needed to invoke it correctly and to know what to do next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter including defaults, enums, and slug sourcing. The description only reiterates the filter list and adds a brief note that near_lat/near_lon narrow to a point, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource ('Search doctors on Doctoreto') and enumerates the full filter surface (city, speciality, neighborhood, service tag, name, gender, insurance, visit type). This clearly separates it from the sibling search tools (dt_search_centers, dt_search_offers) which target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a workflow trail ('Next: dt_doctor -> dt_free_slots') and routes the agent to dt_doctor for pricing, which is clear when-to-use-which guidance. It lacks an explicit statement of when not to use this tool or how to choose among sibling search tools, keeping it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_search_offersSearch clinic offersARead-onlyIdempotent
Search Doctoreto clinic offers: fixed-price procedures and packages (ultrasound, echo, laser, dental, check-ups) sold by doctors and centers.
Each card has the price and price after discount (Toman), what is paid online (pay_online: the deposit
when payment is deposit_online, the rest at the place), provider doctor, place, earliest free time,
star rating and the default consultation_id for dt_free_slots. Unknown sort upstream: compare prices
yourself. Next: dt_offer, dt_free_slots, dt_reviews(of='offer').
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City slug from dt_cities, e.g. 'tehran'. | |
| page | No | 1-based page number. | |
| limit | No | Offers to return from the page (the API pages by about 40). | |
| query | No | Service in Persian, e.g. 'سونوگرافی' or 'لیزر'. | |
| center | No | Only offers at this place (hash id), e.g. 'ZWpOLy'. | |
| doctor | No | Only offers of this doctor (hash id or page URL). | |
| max_price | No | Maximum price in Toman, e.g. 2000000. | |
| min_price | No | Minimum price in Toman, e.g. 1000000. | |
| speciality | No | Speciality slug, e.g. 'cardiologist'. | |
| service_tag | No | Service tag slug, e.g. 'rhinoplasty'. | |
| neighborhood | No | Neighborhood slug, e.g. 'pasdaran'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world behavior, so the bar is lower; the description still adds real operational context — that the upstream sort order is unknown and prices must be compared client-side, and that pay_online represents only the deposit when payment=deposit_online (rest paid at the place). It does not discuss pagination limits beyond what the schema says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose before the card contents and next steps, with zero filler sentences. The card-field enumeration is dense but each field maps to a real downstream decision (price, deposit, consultation_id), so it earns its space despite being longer than typical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-param, zero-required search tool with an output schema and full annotation coverage, the description covers purpose, workflow, and a behavioral gotcha well. Return-value explanation is technically redundant given the output schema, and it omits any hint about how the many optional filters combine (e.g., can city and neighborhood be used together), a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 11 parameters (city slug, doctor hash/URL, price bounds, speciality/service_tag/neighborhood slugs) are already documented. The description adds no filter semantics beyond the schema; its pay_online and consultation_id mentions pertain to response cards, not inputs. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (search clinic offers) and immediately defines the domain object — fixed-price procedures and packages sold by doctors and centers — which separates it from dt_search_doctors and dt_search_centers. It also names the detailing sibling dt_offer, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear follow-up workflow (dt_offer for detail, dt_free_slots using the card's consultation_id, dt_reviews with of='offer') and an explicit caution to sort prices manually because upstream sort is unknown. It never states when to prefer this tool over the other search siblings (doctors/centers), so it stops short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_specialitiesSpecialitiesARead-onlyIdempotent
List medical, paramedical and dental specialities with the slug dt_search_doctors needs.
level is specialist, subspecialist, fellowship or general; parent is the broader speciality
(interventional cardiology -> cardiologist). About 100 entries. Next: dt_search_doctors(speciality=slug).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Part of the name in Persian or the slug, e.g. 'قلب' or 'cardio'. Omit for all. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnly/idempotent/openWorld/no-destructive, so the bar is lower. The description adds useful scale ('About 100 entries') and domain semantics for level and parent values, which help the agent interpret results rather than just repeat annotation claims.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and compact overall. The level/parent sentence is somewhat telegraphic ('interventional cardiology -> cardiologist') but earns its place by clarifying hierarchy semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, 100% schema coverage, and full annotations, the description only needs to add routing and domain context, which it does. Minor gap: no note on result ordering or whether the ~100 entries are always returned in full.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single query parameter is fully documented in the schema (Persian/slug, omit for all), so baseline is 3. The description's level/parent notes describe return values, not the parameter, so they add no parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (medical, paramedical and dental specialities) and ties the output purpose to a sibling (the slug dt_search_doctors needs), so an agent can distinguish it from dt_cities, dt_insurances, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear downstream workflow: 'Next: dt_search_doctors(speciality=slug)', which tells the agent when this tool belongs in a chain. It does not state explicit exclusions or when to reach for an alternative sibling, so it falls short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dt_suggestSuggest doctors, specialities and centersARead-onlyIdempotent
Search-box suggestions: matching doctors (with hash id), speciality slugs, service tags and centers.
Use it to turn a free phrase into the slugs and ids the other tools need, e.g. 'قلب' -> speciality 'cardiologist' for dt_search_doctors. Doctors match by name text, so for a speciality prefer the returned speciality slug over the doctor list. Next: dt_search_doctors, dt_doctor or dt_center.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items of each kind. | |
| query | Yes | What the user typed, in Persian: a doctor's name, a speciality or a symptom, e.g. 'قلب' or 'پرآذران'. | |
| city_id | No | Numeric city id from dt_cities to rank one city first, e.g. 2200 (Tehran). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is the matching behavior: doctors match by name text only, and results carry hash ids rather than raw ids. That is genuinely useful nuance beyond the annotations, though it doesn't discuss ranking when city_id is absent or result caps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then usage and mapping, then next steps — a sensible funnel with no filler sentences. The line-wrapping and mid-sentence example make it slightly harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still summarizes the four return categories (doctors with hash id, speciality slugs, service tags, centers), which is what the agent needs to route the result. With only three simple parameters and full schema coverage, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning by framing 'query' as a free-phrase-to-slug translator and by clarifying the semantic difference between the doctor and speciality result sets. It doesn't add format detail beyond the schema's own examples for query and city_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search-box suggestions: matching doctors (with hash id), speciality slugs, service tags and centers') and enumerates exactly what kinds of entities come back. It also names downstream siblings, so an agent can distinguish this from dt_search_doctors or dt_center without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use rule ('turn a free phrase into the slugs and ids the other tools need') plus a concrete workflow example mapping 'قلب' to the speciality slug. It also states a conditional preference — prefer the returned speciality slug over the doctor list for specialities — and names next-step tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
dt_center - First observed
dt_cities - First observed
dt_doctor - First observed
dt_free_slots - First observed
dt_health_articles - First observed
dt_insurances - First observed
dt_neighborhoods - First observed
dt_offer - First observed
dt_reviews - First observed
dt_search_centers - First observed
dt_search_doctors - First observed
dt_search_offers - First observed
dt_specialities - First observed
dt_suggest
TDQS
Scored across 14 tools
Most tools have clear distinct roles: dt_search_doctors vs dt_doctor, dt_search_centers vs dt_center, dt_search_offers vs dt_offer follow an unambiguous search/detail split. The main ambiguity is dt_suggest, which overlaps with dt_specialities, dt_cities and dt_search_doctors by returning the same slugs and ids those tools provide, though its description frames it as a free-text lookup front door.
All names use snake_case with a uniform dt_ prefix, and search tools consistently use a dt_search_* pattern while detail lookups use dt_<entity>. Minor deviation: reference-list tools (dt_specialities, dt_cities, dt_insurances, dt_neighborhoods) don't follow an explicit 'list_' verb, but the convention is still readable and predictable.
Fourteen tools is well within a healthy range and each one maps to a real need: lookup helpers (specialities, cities, neighborhoods, insurances, suggest), doctor and center search/detail pairs, slots, reviews, offers and articles. Nothing feels redundant or padded.
The surface covers the whole discovery lifecycle for doctors, centers, offers and reviews, with solid lookup helpers for filters and a documented handoff to dt_free_slots for availability. The notable gap is that actual booking/payment is not a tool at all — it dead-ends at an external SMS-login URL — and there is no way to write a review, though these are plausibly intentional constraints.
Maintenance
Related MCP Connectors
Doctor-reviewed blood-test markers, conditions & symptoms as agent tools. EN/RU/HE. Hosted.
Physician-reviewed medical opinions and prescriptions for AI agents.
Research 7,400+ US doctors: search, semantic search, profiles, reviews & procedure pricing.
Search a healthcare provider directory and get full provider details by id.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI agents to interact with the Teladoc telehealth platform to search for providers, book virtual appointments, and manage prescriptions. It also supports secure messaging and access to past visit history through the Model Context Protocol.814 npmMIT
- AlicenseAqualityDmaintenanceEnables AI assistants to search the doktor.mx directory for over 56,000 verified doctors and medical specialists across Mexico. It provides tools for verifying professional licenses, finding specialists by symptoms or conditions, and checking medical insurance compatibility.1041 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to search an Oscar Health in-network provider directory for doctors and facilities, with specialty resolution, local filtering by gender and review quality, plan details, and live provider records.MIT
- AlicenseNot gradedqualityBmaintenanceEnables finding doctors in Romania by county, speciality, language, name, and weekly availability, with fuzzy name matching and nearby-county fallback.30 npmMIT