paziresh24-mcp
paziresh24-mcp is a read-only MCP server for finding Iranian doctors and clinics on Paziresh24 and checking profiles, reviews, appointment availability, prices, holidays, and FAQ.
Resolve Persian/English city, specialty, and query terms into search slugs with
pz_suggest.Search doctors or hospitals/clinics by city, specialty, name, gender, degree, visit type, work time, and sorting/paging with
pz_search_doctors.Turn Paziresh24 URLs into doctor or center slugs with
pz_resolve_url.Read hospital/clinic profiles, departments, contact details, map, and doctors with
pz_center.Read full doctor profiles: specialties, about, ratings, insurance, online visit channels/prices, centers, services, and hours with
pz_doctor.Check the earliest available in-person or online appointment with
pz_first_available.Read patient reviews, rating averages, and waiting times with
pz_reviews.Find days with free slots and specific free appointment times via
pz_free_daysandpz_free_slots.Get exact visit fee, VAT, payable total in Toman, and refund-on-cancel setting with
pz_visit_price.Look up official Iranian public holidays with
pz_holidays.Read Paziresh24 FAQ answers about booking, cancelling, online visits, payments, and refunds with
pz_faq.It cannot log in, book, hold slots, pay, cancel, chat, or post reviews; it provides profile links for booking.
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., "@paziresh24-mcpfind a female cardiologist in Tehran with an online visit today"
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.
paziresh24-mcp: Paziresh24 MCP server for AI agents
Let your AI agent find the right Iranian doctor on Paziresh24 (پذیرش۲۴). An unofficial, read-only MCP server for Paziresh24, Iran's doctor appointment booking site: search doctors by specialty, city, name and online visit, read profiles, prices, insurances and patient reviews, and see free appointment times, from Claude, Cursor or Copilot.
For AI agents · Why · What it can do · Quick start · Tools · How it works · Good to know · FAQ · Configuration · فارسی · Development · Related servers
For AI agents
What: unofficial MCP server (model context protocol) for Paziresh24 (پذیرش۲۴, paziresh24.com), the Iranian doctor appointment site: doctors, hospitals and clinics, in-person and online visits. Queries in Persian or English.
Install:
uvx paziresh24-mcporclaude mcp add paziresh24 -- uvx paziresh24-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none, no API key or account. Optional
PAZIRESH24_MCP_PROXYsets an HTTP proxy for every request (a comma-separated list rotates after a block); system proxy settings are ignored.Access: read-only. It cannot log in, hold a slot, book, pay or post a review, so no confirmation is needed before calling any tool. Give the user the doctor's profile
urlto book.Tools: 12, all prefixed
pz_, all annotatedreadOnlyHint: true. Start withpz_suggest(words to city and specialty slugs),pz_search_doctors,pz_doctor,pz_free_slots,pz_visit_price.Typical sequence:
pz_suggest->pz_search_doctors->pz_doctor->pz_first_availableorpz_free_slots->pz_visit_price.Use when: the user wants to find a doctor, compare ratings, insurance and online visit fees, or see free appointment times in Iran.
Do not use when: the user wants to actually book or pay, or needs medical advice.
Output: compact JSON. Prices in Toman, dates Gregorian
YYYY-MM-DD, times Tehran localHH:MM. Doctors are identified by their Persian slug; slot and price tools takecenter_id,user_center_idandservice_idfrompz_doctor(online visits use center5532).Machine-readable: server.json, and the catalog of all Iranian MCP servers iran-mcp (
TOOLS.md,servers.json,llms.txt).
Related MCP server: mrbilit-mcp
Why
Paziresh24 (paziresh24.com) is Iran's largest doctor appointment site, listing doctors, hospitals and clinics, with in-person
booking and online visits by phone or messenger. Picking one means comparing specialties, ratings, insurance,
prices and who has a free slot soon. An agent with paziresh24-mcp reads the same data the site shows and does
the comparing for you, then gives you the profile link to book:
You: A female cardiologist in Tehran with an online visit today, not too expensive?
Agent: calls
pz_search_doctors(city="tehran", specialty="cardiovascular", visit_type="online", gender="female", sort="earliest")→pz_doctor(slug="دکتر-هدیه-جباری-0")→pz_free_slots(center_id="5532", ...)→pz_visit_price(center_id="5532", ...)Dr. Hedieh Jabbari (cardiologist, 5.0 from 11 ratings) has online visits over WhatsApp today from 15:00 (10-minute slots: 15:00, 15:10, 15:20, ...). The visit is 500,000 Toman + 15,000 VAT = 515,000 Toman. Book it here: https://www.paziresh24.com/dr/دکتر-هدیه-جباری-0/
Real tool output from 2026-10-06; slots and prices change all the time. Prices are in Toman.
What it can do
Search doctors by city, specialty, name, online visit, gender, degree and work time, sorted by best, nearest free time or cheapest online visit
Resolve words: Persian or English city and specialty names to search slugs, plus the site's type-ahead
Read a profile: specialties, about text, medical council code, offices and hospitals with address, phone and map, services, weekly hours, insurance contracts, online visit channels
Find a time: the earliest free appointment, the days with free slots, and the free times of each day (in person and online)
Know the cost: online visit fee, VAT and the payable total in Toman
Check reviews: rating averages, average waiting time and paged patient reviews (no reviewer names)
Hospitals and clinics: departments, doctors, phone, website, map
Read-only by design: no login, no slot holds, no booking, no payment
Example prompts:
"A dermatologist in Shiraz who accepts Tamin Ejtemaei and has a free slot this week."
"Cheapest online pediatrician visit available today?"
"What do patients say about this doctor? https://www.paziresh24.com/dr/..."
"Which cardiologists work at Treata hospital, and who is free soonest?"
"Is next Thursday an official holiday in Iran, and is this doctor free the day after?"
یک متخصص پوست خانم در تهران که امروز ویزیت آنلاین دارد و گران نیست؟
نزدیک‌ترین نوبت خالی دکتر قلب در شیراز کی است؟
چطور نوبت ویزیت آنلاین را لغو کنم و پولم برمی‌گردد؟
Quick start
You need uv. No API key or account.
claude mcp add paziresh24 -- uvx paziresh24-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"paziresh24": { "command": "uvx", "args": ["paziresh24-mcp"] }
}
}Click Install in Cursor above, or add the Claude Desktop block to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"paziresh24": { "type": "stdio", "command": "uvx", "args": ["paziresh24-mcp"] }
}
}codex mcp add paziresh24 -- uvx paziresh24-mcpOr in ~/.codex/config.toml:
[mcp_servers.paziresh24]
command = "uvx"
args = ["paziresh24-mcp"]Add to ~/.gemini/settings.json:
{
"mcpServers": {
"paziresh24": { "command": "uvx", "args": ["paziresh24-mcp"] }
}
}Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.
It's a standard stdio MCP server: run uvx paziresh24-mcp, or pip install paziresh24-mcp and run paziresh24-mcp.
Then just ask, in Persian or English, with one of the example prompts above.
Tools
Doctors are identified by their Persian slug, the part after /dr/ in the profile URL
(دکتر-هدیه-جباری-0); slot and price tools take the center_id, user_center_id and service_id
that search results and pz_doctor return.
Tool | What it does |
| Persian or English words → city slugs, specialty slugs and query completions |
| Doctors (or hospitals and clinics) by city, specialty, name, online visit, gender, degree, with sorting and paging |
| A paziresh24.com link → doctor or center slug |
| Hospital or clinic: address, phone, website, departments and doctors |
Tool | What it does |
| Full profile: specialties, about, rating, insurances, online visit, centers, services, prices, weekly hours |
| Earliest free in-person and online slot, per center |
| Patient reviews (paged) with rating averages and waiting time per center |
Tool | What it does |
| Days with free slots over the whole booking window, days off and holidays |
| Free appointment times per day for a date range |
| Fee, VAT and payable total in Toman, and the refund-on-cancel setting |
| Official Iranian holidays between two dates |
Tool | What it does |
| Paziresh24's official FAQ: booking, cancelling, online visits, refunds |
All 12 tools are annotated readOnlyHint: true and return compact JSON in one text block, so they don't flood the agent's context.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
paziresh24-mcp (runs on your machine)
│
│ HTTPS (JSON)
├──────▶ apigw.paziresh24.com (search, free days and slots, prices, holidays)
├──────▶ drprofile.paziresh24.com (doctor profiles)
├──────▶ ravi-apis.paziresh24.com (reviews and ratings)
├──────▶ saman / biko.paziresh24.com (availability, insurance)
└──────▶ www.paziresh24.com (cities, specialties, hospitals, FAQ)paziresh24-mcp runs locally and calls the same public endpoints the Paziresh24 website uses.
There's no hosted server in between, no API key, and nothing about you is sent anywhere else. Requests use a
Chrome-like TLS and header profile, at most 2 at a time with a short random delay, time out after 20 seconds and
are retried up to twice on connect errors, timeouts, 429 and 5xx. Reference data (cities, specialties, FAQ) is
cached for 6 hours. Redirects away from *.paziresh24.com are refused.
Good to know
Prices are in Toman (1 Toman = 10 Rial). The APIs answer in Rial; the server divides by 10.
In-person office visits usually show price 0: they are paid at the office and the fee is not published. Online visits have a real fee;
pz_visit_priceadds the VAT (3% on the checked example).Times are Tehran local (
HH:MM), dates GregorianYYYY-MM-DD(1405-07-18 = 2026-10-10).Online visits live in Paziresh24's virtual center
5532(phone call or messenger such as WhatsApp; seechannels).Search cards carry the doctor's
genderand photo (image, from pic.paziresh24.com; a real photo even where the profile has none).Insurance: search cards list accepted insurance names, but there is no insurance filter. A
pz_doctorresult withoutinsurancesmeans no data, not "no insurance". Empty fields are omitted from all results; review text is clipped to 400 characters (passfull_text=truefor everything; same forpz_doctor,pz_center,pz_faq) and is untrusted site content.Centers with booking off stay in
pz_doctorwithbooking_off: true(call their phone);booking_opensmeans the booking period has ended and new slots open at that time. Search cards give the first free time per center as well as the doctor's earliest overall.Booking is not possible here. Booking needs an SMS login, so the agent gives you the doctor's profile URL. Free slots are listed, never held.
sort="earliest"drops doctors without a free slot. The order follows the site's search API; search results can include sponsored doctors.Limits:
pz_search_doctorsreturns at most 50 results per page. Reviews are paged (1-50 per page, default 5), and reviewer names are never returned.Specialty groups are broad: a group slug such as
ophthalmologyalso includes related professions (for example optometrists); theexp-slug of the same title (exp-ophthalmology) lists only that specialty.pz_suggestreturns both.Holidays:
pz_holidaysdepends on the site's holidays endpoint, which answered HTTP 500 on 2026-10-10; if it fails, retry later.What it does not do: no login, booking, cancelling, payment, chat, bookmarks or posting reviews; no patient data; no medical advice.
Checked against the website: on 2026-10-06 every tool's output was compared with the live paziresh24.com pages (names, prices, first free times, review order, search totals). Free days and slots were compared only where the site shows them without holding a slot.
FAQ
Yes: this unofficial MCP server wraps the public endpoints the Paziresh24 website itself uses, so Claude, Cursor or Copilot can search doctors and read free times and prices.
Add the server with claude mcp add paziresh24 -- uvx paziresh24-mcp (or use the Cursor and VS Code buttons above),
then ask in Persian or English, for example "a cardiologist in Tehran with an online visit today".
It is unofficial, open source (MIT) and free. It is read-only, needs no account or API key, and runs on your machine without sending data to any other server.
No, and that's deliberate. It never calls login, slot-hold, booking, payment or review endpoints (a test fails if their paths appear in the code). The agent finds the doctor and the time; you book on the profile page.
Not in the search: the site's API ignores an insurance filter. Each search card lists the insurance names the doctor
accepts, and pz_doctor returns the insurance contracts, so the agent can check them for you.
No geo block was seen: direct calls and calls through a proxy in Turkey both worked (2026-10-06). If your network
blocks the site, set PAZIRESH24_MCP_PROXY.
Some Paziresh24 gateway routes sometimes hang for 20-30 seconds. The server retries up to twice; if it still fails, try again in a minute.
Install the optional browser fallback (see Configuration). It clears the check once with a headless Chromium; without it the tool reports an error that says so.
Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.
npx @modelcontextprotocol/inspector uvx paziresh24-mcpConfiguration
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
If the site shows a bot-check page, install the optional browser fallback: pip install "paziresh24-mcp[browser]"
(or uvx --from "paziresh24-mcp[browser]" paziresh24-mcp), then run patchright install chromium.
فارسی: سرور MCP پذیرش۲۴
paziresh24-mcp یک سرور MCP غیررسمی برای پذیرش۲۴ (سامانه نوبت‌دهی آنلاین پزشکان) است که به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد در میان پزشکان ایران پزشک پیدا کند: جستجو بر اساس تخصص، شهر، نام و ویزیت آنلاین، خواندن پروفایل، بیمه‌ها، قیمت و نظرات بیماران، و دیدن زمان‌های خالی نوبت.
فقط خواندنی است: وارد حساب نمی‌شود، نوبت نگه نمی‌دارد، نوبت ثبت نمی‌کند و پرداخت نمی‌کند.
برای گرفتن نوبت، لینک صفحه پزشک را به شما می‌دهد.
همه قیمت‌ها به تومان است.
۱۲ ابزار دارد که همگی با
pz_شروع می‌شوند.روی سیستم خود شما اجرا می‌شود، کلید API لازم ندارد و به هیچ سرور واسطی داده نمی‌فرستد.
توصیه پزشکی نمی‌کند.
کلمات جستجو: پذیرش۲۴، پذیرش 24، نوبت دهی پزشک، نوبت اینترنتی پزشک، نوبت دکتر، ویزیت آنلاین، مشاوره آنلاین پزشک، پیدا کردن پزشک متخصص، نزدیک‌ترین نوبت خالی، هزینه ویزیت، نظرات بیماران، بیمه تامین اجتماعی، سرور MCP، هوش مصنوعی.
نصب در Claude Code (اول uv را نصب کنید):
claude mcp add paziresh24 -- uvx paziresh24-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.
بعد بپرسید: «یک متخصص پوست خانم در تهران که امروز ویزیت آنلاین دارد و گران نیست؟»
Development
git clone https://github.com/sepehr071/paziresh24-mcp && cd paziresh24-mcp
uv sync
uv run python -m pytest # offline, against recorded responses
uv run python -m pytest -m live # real APIs
uv run ruff check .Tools live in src/paziresh24_mcp/search.py, doctor.py, slots.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.
Related servers
iran-mcp: catalog of all Iranian-service MCP servers
doctoreto-mcp for doctor visit fees, free times, clinics and labs
jabama-mcp for Jabama stays
mrbilit-mcp for Mrbilit travel tickets
flytoday-mcp for Flytoday flights
Disclaimer
Unofficial and not affiliated with or endorsed by Paziresh24. It is read-only and uses the public endpoints of the paziresh24.com website, which can change without notice. It is not medical advice. Please keep request rates reasonable.
If this saves you clicks, a star helps others find it.
Author
Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.
License
Available Tools
12 toolspz_centerHospital or clinic profileARead-onlyIdempotent
Profile of a hospital or clinic: type, address, phone, website, map, about, departments and its doctors (slug, department, specialty, basic insurances).
Next: pz_search_doctors(center_id=..., sort='earliest') for its doctors by nearest free time, or pz_doctor.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Center slug from a pz_search_doctors center result (or its URL), e.g. 'بیمارستان-تخصصی-و-فوق-تخصصی-تریتا'. | |
| full_text | No | True = do not clip the about text (default 1500 chars). | |
| specialty | No | Only doctors whose department or specialty contains this Persian text, e.g. 'قلب'. | |
| doctors_limit | No | Max doctors to list (0 = none). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive, openWorld), lowering the bar. The description adds genuine value by disclosing the return content (departments, per-doctor slug/department/specialty/insurances), which is the only place this is captured since there is no output schema. No auth or rate-limit notes, so not 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 sentences, front-loaded: the first defines the tool and its payload, the second gives the routing hint. Zero filler; every clause carries 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 no output schema, the description must carry the return-shape burden, and it does list the returned fields. Combined with 100% parameter coverage and annotations handling the safety profile, an agent has enough to invoke it correctly; only the exact response structure is left implicit.
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 four parameters (slug, full_text, specialty, doctors_limit) are already documented in the schema. The description itself adds no parameter-level syntax or semantics beyond the schema, 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?
The description states a specific resource (hospital/clinic profile) and enumerates exactly what it contains: type, address, phone, website, map, about, departments and doctors. This lets an agent distinguish it from pz_search_doctors (search) and pz_doctor (single doctor) without opening 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?
It explicitly routes the agent onward ('Next: pz_search_doctors(center_id=..., sort='earliest') for its doctors by nearest free time, or pz_doctor'), and the schema's slug description names pz_search_doctors as the source. There is clear context but no explicit when-not-to-use or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_doctorDoctor profileARead-onlyIdempotent
Full profile of one doctor: specialties, about, rating averages, insurances, online visit (channels, price in Toman) and every center with address, phone, map, first free slot and services (ids, price, duration, hours).
booking_off: true = booking switched off (call the phone); booking_opens = new slots open then.
A service's center_id + user_center_id + service_id feed pz_free_days, pz_free_slots and
pz_visit_price. Next: pz_reviews, pz_first_available.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Doctor slug (Persian, e.g. 'دکتر-هدیه-جباری-0') or profile URL. | |
| full_text | No | True = do not clip the about text (default 1200 chars). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, yet the description still adds domain behavior: `booking_off: true` means booking is disabled and you should call the phone, and `booking_opens` marks when new slots appear. That is genuine operational context beyond the structured fields, though auth/permission or rate-limit behavior is not covered.
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 return-content summary is front-loaded and the follow-on routing is packed into two terse clauses with backticked field names. It is dense but every sentence carries information; the field-list sentence is long but earns its length by describing the payload.
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 no output schema, the description compensates well by enumerating the returned fields and interpreting the booking-related flags. Full read-only annotations cover the safety profile, so an agent has nearly everything needed to call it correctly; only some field semantics (e.g., rating averages, user_center_id) remain unstated.
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 schema already documents both parameters in detail (slug format with an example, and full_text's default 1200-char clipping). The description adds no additional parameter-level meaning, 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 a specific resource (full profile of one doctor) and enumerates exactly what is returned: specialties, about, rating averages, insurances, online visit channels/pricing, and per-center details with services. This clearly distinguishes it from the search/list siblings and lets an agent know it is the single-entity detail endpoint.
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 explicit downstream routing: the service's center_id/user_center_id/service_id 'feed pz_free_days, pz_free_slots and pz_visit_price' and 'Next: pz_reviews, pz_first_available'. That is strong chain guidance, though it never states the inverse condition (e.g., use pz_search_doctors first to obtain a slug, or when not to call this).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_faqPaziresh24 FAQARead-onlyIdempotent
Answers from the official Paziresh24 FAQ: booking, cancelling or moving, online visits, payment and refunds.
Without a query it lists the questions only. Use for "how do I ..." questions about the site.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max answers. | |
| query | No | Topic words in Persian, e.g. 'لغو نوبت' (cancel), 'استرداد' (refund), 'ویزیت آنلاین' (online visit). Empty = list every question. | |
| full_text | No | True = do not clip answers (default 1500 chars). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description adds real behavioral context beyond them by disclosing the no-query listing mode, but it never mentions that answers are clipped at 1500 characters by default, which materially affects what the agent receives.
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 short sentences, front-loaded with the resource and its scope, followed by the one mode-switching behavior worth knowing. Every sentence earns its place with no redundancy.
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 FAQ retrieval tool with complete schema coverage and no output schema, the description covers domain, trigger condition and the no-query mode. The only notable omission is any hint that long answers are truncated unless full_text is set, which is left entirely to the schema.
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 limit, query and full_text are already fully documented in the schema (including Persian examples and the empty-list behavior). The description only restates the query-less listing mode, adding no new parameter semantics — the correct baseline of 3.
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?
Names a specific resource (the official Paziresh24 FAQ) and enumerates the content domains it covers: booking, cancelling/moving, online visits, payment and refunds. That is enough to separate it from the sibling data-lookup tools (pz_search_doctors, pz_visit_price, pz_holidays), though no sibling is named explicitly.
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?
"Use for 'how do I ...' questions about the site" gives a clear trigger condition, and "Without a query it lists the questions only" describes a distinct browse mode. There is no explicit when-not guidance or named alternative, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_first_availableEarliest free appointmentARead-onlyIdempotent
Whether a doctor can be booked now and the nearest free slot, in person, online and per center (Tehran time).
A quick check before pz_free_days / pz_free_slots; names and service ids are in pz_doctor.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Doctor slug (Persian, e.g. 'دکتر-هدیه-جباری-0') or profile URL. |
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 adds genuinely new context: that it answers a yes/no bookability question, returns the nearest slot, and expresses results in Tehran time.
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 short sentences, front-loaded with the core answer (can this doctor be booked now), followed by scope and the sibling routing hint. 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?
For a single-param, no-output-schema read tool with rich annotations, the description covers what comes back and when to reach for it. The phrase "per center" is mildly ambiguous given the tool accepts only a doctor slug.
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?
Only one parameter and schema coverage is 100%, with the schema already documenting the slug format (Persian slug or profile URL). The description adds nothing about the slug, 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+resource: reports whether a doctor is bookable now plus the nearest free slot, and scopes it to in-person, online and per-center with an explicit time zone. It also positions itself against siblings (pz_free_days / pz_free_slots), so an agent can tell it apart without opening another 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?
"A quick check before pz_free_days / pz_free_slots" gives explicit ordering guidance and names the alternative tools it precedes. It stops short of stating when NOT to use it (e.g. when you already know the date window and should go straight to free_slots).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_free_daysFree appointment daysARead-onlyIdempotent
Days with a free appointment for one service at one center over the whole booking window (often 6-8 weeks), with weekly days off and holidays.
Ids from pz_doctor. Next: pz_free_slots for the times of chosen days.
| Name | Required | Description | Default |
|---|---|---|---|
| center_id | Yes | center_id from pz_doctor or a search card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit. | |
| service_id | Yes | service_id of a service at that center. | |
| user_center_id | Yes | user_center_id of the same center (doctor-at-center id). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, read-only, idempotent, open-world read, so the bar is lower. The description adds genuine behavioral context beyond that: the booking window span (often 6-8 weeks) and that weekly days off and holidays are factored in, which explains why some days are absent from results.
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 with zero waste: purpose and scope first, then the workflow pointer. Front-loaded and easy to scan.
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 annotations covering the safety profile, all three params documented in the schema, and no output schema required, the description supplies the needed purpose and continuation. Minor gap: no hint about result shape or volume for a window that can span weeks.
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 schema already states where each id comes from (pz_doctor, search card). The description's 'Ids from pz_doctor' largely repeats the schema rather than adding new meaning, so 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?
States a specific resource (days with a free appointment) scoped to one service at one center across the entire booking window, and names pz_free_slots as the follow-on. It clearly separates itself from pz_free_slots, though it leaves the distinction from pz_first_available unstated.
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?
Provides a workflow chain: ids come from pz_doctor, and pz_free_slots should be called next to get times for chosen days. This gives clear context for when to invoke it, but no explicit when-not/tie-breaking guidance against other availability siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_free_slotsFree appointment slotsARead-onlyIdempotent
Free appointment start times (Tehran HH:MM) per day for one service at one center, for a date range.
Ids from pz_doctor or a search card; find days with pz_free_days. With no free slot in the range,
next_free_day gives the next one.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | No | Last day, inclusive (default date_from); at most 14 days after it. | |
| center_id | Yes | center_id from pz_doctor or a search card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit. | |
| date_from | No | First day, Gregorian YYYY-MM-DD (default today), e.g. '2026-10-10'. | |
| service_id | Yes | service_id of a service at that center. | |
| user_center_id | Yes | user_center_id of the same center (doctor-at-center id). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent read. The description adds non-obvious value: the timezone and time format of results, and the fallback behavior that `next_free_day` supplies a next date when the range yields nothing.
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 what the tool returns, then the id provenance and the empty-result fallback. Tight overall, with no redundant sentences, though the trailing fragment about next_free_day reads slightly disjointed.
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 no output schema, the description usefully characterizes the return shape (per-day start times in Tehran HH:MM) and the fallback field. It covers what an agent needs to call and interpret the tool, missing only pagination or rate-limit 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 description coverage is 100%, so the schema already documents the id patterns, date formats and the 14-day cap on date_to. The description only restates the general 'one service at one center, for a date range' framing, adding nothing beyond schema detail.
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 (free appointment start times), a precise format (Tehran HH:MM), and the scope (per day, one service at one center, over a date range). It is immediately distinguishable from pz_free_days, which returns days rather than start times.
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?
Explains where the required ids come from (pz_doctor or a search card) and routes the agent to pz_free_days to discover which days to query. That is clear workflow context, though there is no explicit statement of when not to use this tool or a hard exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_holidaysPublic holidaysARead-onlyIdempotent
Official Iranian public holidays and occasions between two dates (Persian name, Hijri date).
Fridays are not listed. Use before suggesting appointment days.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | Yes | Last day, Gregorian YYYY-MM-DD, at most a year later, e.g. '2026-12-31'. | |
| date_from | Yes | First day, Gregorian YYYY-MM-DD, e.g. '2026-10-01'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description still adds non-obvious behavioral context: that Fridays are deliberately omitted and that results carry Persian/Hijri naming, which an agent must know before treating the list as complete.
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 lines: purpose, scope/return, caveat, usage trigger. Nothing is redundant and the resource is stated in the first clause, so the agent can act on the opening sentence alone.
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 two-parameter lookup with no output schema, the description supplies the return fields (Persian name, Hijri date) and the Friday caveat, which is enough to interpret results. It stops short of describing ordering or response shape, but nothing critical for correct invocation 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%, with both date parameters documented including format and the one-year span limit, so the schema carries the semantics. The description only restates 'between two dates' and adds no format or boundary detail beyond it, which is the baseline 3.
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?
Names a specific resource (official Iranian public holidays and occasions) with an explicit scope (between two dates) and return payload (Persian name, Hijri date), so an agent knows exactly what it gets. It does not name or differentiate itself from the closest sibling (pz_free_days), which is the only thing keeping it off a 5.
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 an actionable workflow trigger: 'Use before suggesting appointment days,' which tells the agent where this fits relative to scheduling siblings. It states one exclusion ('Fridays are not listed') but offers no explicit when-not or named alternative tool, so it falls 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.
pz_resolve_urlResolve a Paziresh24 URLARead-onlyIdempotent
Turn a paziresh24.com link into its kind ('doctor' or 'center'), slug and clean URL.
Use when the user pastes a link. Next: pz_doctor or pz_center.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | paziresh24.com link (/dr/..., /center/..., /factor/v2/...), e.g. 'https://www.paziresh24.com/dr/دکتر-هدیه-جباری-0/'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value by disclosing the returned content (kind, slug, clean URL), which is important since there is no output schema. Minor gap: no statement about failure behavior for unrecognized or non-paziresh24 URLs.
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 short sentences, zero filler, with the input action front-loaded and the routing hint second. Nothing redundant with the title or 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?
For a single-parameter URL parser with no output schema, the description covers the essential facts: input source (pasted link), encoded result fields, and the follow-up tools. An agent has everything needed 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 description coverage is 100% and the single 'url' parameter is fully documented in-schema with length bounds and example path formats. The description adds nothing about parameter syntax beyond the schema, 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 verb+resource ('turn a paziresh24.com link into...') and enumerates the outputs: kind ('doctor' or 'center'), slug, clean URL. This clearly differentiates it from the sibling search/lookup tools, which take queries rather than URLs.
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?
'Use when the user pastes a link' gives an explicit trigger condition, and 'Next: pz_doctor or pz_center' names the downstream alternatives an agent should route to based on the returned kind. The agent knows both when to call it and what to do afterwards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_reviewsDoctor reviewsARead-onlyIdempotent
Patient reviews (stars 1-5, text clipped to 400 chars, visit reason, center, verified visit), paged, plus on the first page a summary: rating averages, counts and waiting time per center.
Reviewer names and ids are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Doctor slug (Persian, e.g. 'دکتر-هدیه-جباری-0') or profile URL. | |
| sort | No | 'relevant' = the site's default order. | relevant |
| limit | No | Reviews per page. | |
| offset | No | Reviews to skip, e.g. 5 for page 2. | |
| full_text | No | True = do not clip review text (default 400 chars). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the 400-character clip on review text, that the summary appears only on the first page, and the privacy guarantee that reviewer names and ids are never returned.
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 sentences, tightly front-loaded on the payload contents, with the privacy note last. The parenthetical list is dense but every item is load-bearing; nothing is redundant.
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 no output schema, the description carries the burden of describing the return shape, and it does so field-by-field including the first-page-only summary. Minor gap: it does not say how many total reviews exist or how to detect the last page, which matters for a paged tool.
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 sort/limit/offset/full_text semantics are already documented in the schema and the 3 baseline applies. The description reinforces the clip behavior tied to full_text but adds no syntax, ranges or pagination math 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 states precisely what is returned: patient reviews with stars, clipped text, visit reason, center and verified-visit flag, plus a first-page summary of averages, counts and waiting times. It is clearly distinguishable from the doctor/center/search siblings by resource (reviews), though it never names them for contrast.
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?
No when-to-use guidance, no prerequisites, and no mention of alternatives among the twelve sibling tools. The reader must infer from the 'slug' parameter that this is invoked on a doctor profile; nothing in the description says so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_search_doctorsSearch doctorsARead-onlyIdempotent
Search doctors (or hospitals and clinics) by city, specialty, name, visit type, gender and degree, sorted and paged.
Doctor cards carry slug, url, image, rating, insurances, first free in-person and online slots,
online_visit (only when offered, price in Toman) and the ids the slot tools need (a missing
service_id comes from pz_doctor). Next: pz_doctor, or pz_free_days / pz_free_slots.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City slug from pz_suggest, e.g. 'tehran'; 'ir' = all of Iran (best for online visits and names). | ir |
| page | No | 1-based page number. | |
| sort | No | 'earliest' = nearest free slot first (drops doctors without free slots). | best |
| text | No | Persian text: doctor name ('هدیه جباری'), disease or center. | |
| limit | No | Results per page (the site caps it at 50). | |
| degree | No | Academic degree, e.g. 'فوق تخصص' (subspecialist). | |
| gender | No | Doctor's gender. | |
| center_id | No | Only doctors of one hospital or clinic: its center_id from pz_center, e.g. '204'. | |
| specialty | No | Specialty slug from pz_suggest: a group ('cardiovascular') or an expertise ('exp-cardiovascular-diseases'). | |
| work_time | No | Works in that part of the day. | |
| visit_type | No | 'online' = online visit, 'in_person' = office booking. | any |
| centers_only | No | List hospitals and clinics of the city instead of doctors (ignores specialty). |
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). The description adds genuinely new behavioral context by enumerating the returned doctor-card fields — slug, url, image, rating, insurances, first free in-person/online slots — and noting that online_visit appears only when offered with price in Toman, which matters because there is no output schema. It does not mention rate limits or pagination 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?
The opening sentence is front-loaded with verb, resource and facets, and the follow-up routing line is compact. The middle sentence listing card fields is dense but each field earns its place given the absence of an 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?
For a 12-parameter, all-optional search tool with no output schema, the description covers the filter surface, the return shape, and the next-step tools, which is close to sufficient. Minor gaps remain around paging/sorting semantics and total-result behavior, but those are largely covered by the schema.
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 each parameter is already fully documented in the schema itself. The description only restates the facet list and the service_id dependency, adding no syntax or format detail beyond what the schema provides; 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?
The first sentence gives a specific verb (Search) plus resource (doctors) and enumerates the exact filter facets — city, specialty, name, visit type, gender, degree — including the alternate mode (hospitals and clinics). It also names the sibling tools this feeds into (pz_doctor, pz_free_days, pz_free_slots), so an agent can place it in the pipeline 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?
It supplies concrete routing context: 'Next: pz_doctor, or pz_free_days / pz_free_slots,' and the conditional 'a missing service_id comes from pz_doctor.' That tells the agent when to follow up, though it never states when to prefer an alternative (e.g. pz_first_available) or when not to use this search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_suggestSuggest cities, specialties and queriesARead-onlyIdempotent
Turn words into pz_search_doctors arguments: matching cities, specialties (with slugs) and the site's query completions (use one as text).
Call first when you lack the city or specialty slug. Next: pz_search_doctors.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items in each list. | |
| query | Yes | City ('تهران', 'shiraz'), specialty or symptom ('قلب'), or start of a doctor's name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description adds real behavioral context beyond them: it is a slug-resolution step, it returns slug-bearing lists, and one completion should be reused as a downstream `text` value.
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 sentences, front-loaded with the transformation and followed by the ordering instruction. 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 no output schema, the description responsibly sketches the return shape (cities, specialties with slugs, completions). Minor ambiguity remains: it references a `text` argument that belongs to pz_search_doctors rather than this tool, which could momentarily confuse an agent.
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 params are documented (the `query` description even enumerates city/specialty/name forms), so the schema does the heavy lifting. The description only adds that outputs become arguments for another tool, not new meaning for `query` or `limit`.
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 concrete transformation ('turn words into pz_search_doctors arguments') and enumerates exactly what comes back: cities, specialties with slugs, and query completions. This clearly distinguishes it from the sibling pz_search_doctors it feeds.
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 an explicit trigger ('Call first when you lack the city or specialty slug') and the follow-up step ('Next: pz_search_doctors'). The agent knows both when to use it and where to go afterwards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pz_visit_priceVisit priceARead-onlyIdempotent
Exact price of one service in Toman: fee, VAT and payable total (the online-visit invoice), plus the refund-on-cancel setting.
Most useful for online visits (center_id '5532'); office visits usually show 0.
| Name | Required | Description | Default |
|---|---|---|---|
| center_id | Yes | center_id from pz_doctor or a search card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit. | |
| service_id | Yes | service_id of a service at that center. | |
| user_center_id | Yes | user_center_id of the same center (doctor-at-center id). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real behavioral value: the composition of the returned invoice and the degenerate zero-price case for office visits. It does not cover failure modes (e.g. what happens if the IDs don't match) or pagination/response shape, but for a simple read that is a minor gap.
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 short sentences, no filler, and the payoff (what you get back) is stated before the caveat about when the result is useless. Every clause carries 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 no output schema, the description correctly takes on the burden of describing return values, and the annotations cover safety. What remains thin is provenance guidance — where to obtain the three required IDs — though the schema descriptions partially cover this.
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 each of the three IDs is already documented in the schema, including the '5532' = online visit mapping. The description's center_id '5532' remark largely restates the schema, adding no syntax or sourcing detail beyond it, 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 (price of one service) and itemizes the exact outputs: fee, VAT, payable total, and the refund-on-cancel setting. No sibling tool deals with pricing, so there is no ambiguity to disambiguate.
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 a clear usage signal — 'Most useful for online visits (center_id 5532)' — and warns that office visits 'usually show 0,' which is effectively a when-not-to-trust-the-result condition. It stops short of naming an alternative tool or stating prerequisites, so it is context rather than full routing.
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.
12 tool updates
v0.3.0- Changed
pz_center8 fields changed- removed
Input schema / properties / doctors_limit / titleRemoved value: -"Doctors Limit" - added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "True = do not clip the about text (default 1500 chars).", + "type": "boolean" +} - changed
Input schema / properties / slug / descriptionPrevious value: -"Center slug from a pz_search_doctors center result (or its /center/... URL), e.g. 'بیمارستان-تخصصی-و-فوق-تخصصی-تریتا'."New value: +"Center slug from a pz_search_doctors center result (or its URL), e.g. 'بیمارستان-تخصصی-و-فوق-تخصصی-تریتا'." - removed
Input schema / properties / slug / titleRemoved value: -"Slug" - changed
Input schema / properties / specialty / descriptionPrevious value: -"Only doctors whose department or specialty contains this Persian text, e.g. 'قلب' or 'زنان'."New value: +"Only doctors whose department or specialty contains this Persian text, e.g. 'قلب'." - removed
Input schema / properties / specialty / titleRemoved value: -"Specialty" - removed
Input schema / titleRemoved value: -"pz_centerArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_centerDictOutput", - "type": "object" -}New value: +null
- Changed
pz_doctor5 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "True = do not clip the about text (default 1200 chars).", + "type": "boolean" +} - changed
Input schema / properties / slug / descriptionPrevious value: -"Doctor slug from pz_search_doctors (Persian, e.g. 'دکتر-هدیه-جباری-0') or the doctor's paziresh24.com profile URL."New value: +"Doctor slug (Persian, e.g. 'دکتر-هدیه-جباری-0') or profile URL." - removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"pz_doctorArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_doctorDictOutput", - "type": "object" -}New value: +null
- Changed
pz_faq5 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "True = do not clip answers (default 1500 chars).", + "type": "boolean" +} - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"pz_faqArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_faqDictOutput", - "type": "object" -}New value: +null
- Changed
pz_first_available4 fields changed- changed
Input schema / properties / slug / descriptionPrevious value: -"Doctor slug from pz_search_doctors (Persian, e.g. 'دکتر-هدیه-جباری-0') or the doctor's paziresh24.com profile URL."New value: +"Doctor slug (Persian, e.g. 'دکتر-هدیه-جباری-0') or profile URL." - removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"pz_first_availableArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_first_availableDictOutput", - "type": "object" -}New value: +null
- Changed
pz_free_days8 fields changed- changed
Input schema / properties / center_id / descriptionPrevious value: -"center_id from pz_doctor or a pz_search_doctors card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit."New value: +"center_id from pz_doctor or a search card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit." - removed
Input schema / properties / center_id / titleRemoved value: -"Center Id" - changed
Input schema / properties / service_id / descriptionPrevious value: -"service_id of a service at that center, e.g. '1a4a8ec2-fdf9-436e-a32b-8fc4485f609c'."New value: +"service_id of a service at that center." - removed
Input schema / properties / service_id / titleRemoved value: -"Service Id" - changed
Input schema / properties / user_center_id / descriptionPrevious value: -"user_center_id of the same center (the doctor-at-center id), e.g. '09558bad-168d-4df8-b39d-437a260ca6fc'."New value: +"user_center_id of the same center (doctor-at-center id)." - removed
Input schema / properties / user_center_id / titleRemoved value: -"User Center Id" - removed
Input schema / titleRemoved value: -"pz_free_daysArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_free_daysDictOutput", - "type": "object" -}New value: +null
- Changed
pz_free_slots12 fields changed- changed
Input schema / properties / center_id / descriptionPrevious value: -"center_id from pz_doctor or a pz_search_doctors card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit."New value: +"center_id from pz_doctor or a search card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit." - removed
Input schema / properties / center_id / titleRemoved value: -"Center Id" - changed
Input schema / properties / date_from / descriptionPrevious value: -"First day, Gregorian YYYY-MM-DD (default today in Iran), e.g. '2026-10-10'."New value: +"First day, Gregorian YYYY-MM-DD (default today), e.g. '2026-10-10'." - removed
Input schema / properties / date_from / titleRemoved value: -"Date From" - changed
Input schema / properties / date_to / descriptionPrevious value: -"Last day, inclusive (default date_from); at most 14 days after date_from."New value: +"Last day, inclusive (default date_from); at most 14 days after it." - removed
Input schema / properties / date_to / titleRemoved value: -"Date To" - changed
Input schema / properties / service_id / descriptionPrevious value: -"service_id of a service at that center, e.g. '1a4a8ec2-fdf9-436e-a32b-8fc4485f609c'."New value: +"service_id of a service at that center." - removed
Input schema / properties / service_id / titleRemoved value: -"Service Id" - changed
Input schema / properties / user_center_id / descriptionPrevious value: -"user_center_id of the same center (the doctor-at-center id), e.g. '09558bad-168d-4df8-b39d-437a260ca6fc'."New value: +"user_center_id of the same center (doctor-at-center id)." - removed
Input schema / properties / user_center_id / titleRemoved value: -"User Center Id" - removed
Input schema / titleRemoved value: -"pz_free_slotsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_free_slotsDictOutput", - "type": "object" -}New value: +null
- Changed
pz_holidays4 fields changed- removed
Input schema / properties / date_from / titleRemoved value: -"Date From" - removed
Input schema / properties / date_to / titleRemoved value: -"Date To" - removed
Input schema / titleRemoved value: -"pz_holidaysArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_holidaysDictOutput", - "type": "object" -}New value: +null
- Changed
pz_resolve_url4 fields changed- changed
Input schema / properties / url / descriptionPrevious value: -"A paziresh24.com link (doctor profile /dr/..., center /center/..., online visit /factor/v2/...), percent-encoded or not, e.g. 'https://www.paziresh24.com/dr/دکتر-هدیه-جباری-0/'."New value: +"paziresh24.com link (/dr/..., /center/..., /factor/v2/...), e.g. 'https://www.paziresh24.com/dr/دکتر-هدیه-جباری-0/'." - removed
Input schema / properties / url / titleRemoved value: -"Url" - removed
Input schema / titleRemoved value: -"pz_resolve_urlArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_resolve_urlDictOutput", - "type": "object" -}New value: +null
- Changed
pz_reviews11 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "True = do not clip review text (default 400 chars).", + "type": "boolean" +} - changed
Input schema / properties / limit / defaultPrevious value: -10New value: +5 - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / offset / descriptionPrevious value: -"Reviews to skip (paging), e.g. 10 for page 2."New value: +"Reviews to skip, e.g. 5 for page 2." - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - changed
Input schema / properties / slug / descriptionPrevious value: -"Doctor slug from pz_search_doctors (Persian, e.g. 'دکتر-هدیه-جباری-0') or the doctor's paziresh24.com profile URL."New value: +"Doctor slug (Persian, e.g. 'دکتر-هدیه-جباری-0') or profile URL." - removed
Input schema / properties / slug / titleRemoved value: -"Slug" - changed
Input schema / properties / sort / descriptionPrevious value: -"'relevant' = the site's default order, 'newest' first."New value: +"'relevant' = the site's default order." - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"pz_reviewsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_reviewsDictOutput", - "type": "object" -}New value: +null
- Changed
pz_search_doctors22 fields changed- changed
Input schema / properties / center_id / descriptionPrevious value: -"Only doctors of one hospital or clinic: its center_id from pz_center or a center result, e.g. '204'."New value: +"Only doctors of one hospital or clinic: its center_id from pz_center, e.g. '204'." - removed
Input schema / properties / center_id / titleRemoved value: -"Center Id" - removed
Input schema / properties / centers_only / titleRemoved value: -"Centers Only" - changed
Input schema / properties / city / descriptionPrevious value: -"English city slug from pz_suggest, e.g. 'tehran', 'isfahan', 'mashhad'; 'ir' = all of Iran (best for online visits and name searches)."New value: +"City slug from pz_suggest, e.g. 'tehran'; 'ir' = all of Iran (best for online visits and names)." - removed
Input schema / properties / city / titleRemoved value: -"City" - changed
Input schema / properties / degree / descriptionPrevious value: -"Academic degree, e.g. 'فوق تخصص' (subspecialist), 'متخصص' (specialist), 'فلوشیپ' (fellowship)."New value: +"Academic degree, e.g. 'فوق تخصص' (subspecialist)." - removed
Input schema / properties / degree / titleRemoved value: -"Degree" - removed
Input schema / properties / gender / titleRemoved value: -"Gender" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / page / titleRemoved value: -"Page" - changed
Input schema / properties / sort / descriptionPrevious value: -"Order. 'earliest' = nearest free appointment first (drops doctors without free slots); 'cheapest_online' = cheapest online visit first."New value: +"'earliest' = nearest free slot first (drops doctors without free slots)." - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - changed
Input schema / properties / specialty / descriptionPrevious value: -"Specialty slug from pz_suggest: a group ('cardiovascular', 'dermatology', 'general-practitioner') or an expertise ('exp-cardiovascular-diseases')."New value: +"Specialty slug from pz_suggest: a group ('cardiovascular') or an expertise ('exp-cardiovascular-diseases')." - removed
Input schema / properties / specialty / titleRemoved value: -"Specialty" - changed
Input schema / properties / text / descriptionPrevious value: -"Free text in Persian: a doctor's name ('هدیه جباری'), a disease or a center, e.g. 'آزمایشگاه'."New value: +"Persian text: doctor name ('هدیه جباری'), disease or center." - removed
Input schema / properties / text / titleRemoved value: -"Text" - changed
Input schema / properties / visit_type / descriptionPrevious value: -"'online' = doctors with an online visit (phone or messenger), 'in_person' = office booking."New value: +"'online' = online visit, 'in_person' = office booking." - removed
Input schema / properties / visit_type / titleRemoved value: -"Visit Type" - changed
Input schema / properties / work_time / descriptionPrevious value: -"Doctor works in that part of the day."New value: +"Works in that part of the day." - removed
Input schema / properties / work_time / titleRemoved value: -"Work Time" - removed
Input schema / titleRemoved value: -"pz_search_doctorsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_search_doctorsDictOutput", - "type": "object" -}New value: +null
- Changed
pz_suggest5 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / query / descriptionPrevious value: -"Persian or English word: a city ('تهران', 'shiraz'), a specialty or symptom ('قلب', 'پوست'), or the start of a doctor's name."New value: +"City ('تهران', 'shiraz'), specialty or symptom ('قلب'), or start of a doctor's name." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"pz_suggestArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_suggestDictOutput", - "type": "object" -}New value: +null
- Changed
pz_visit_price8 fields changed- changed
Input schema / properties / center_id / descriptionPrevious value: -"center_id from pz_doctor or a pz_search_doctors card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit."New value: +"center_id from pz_doctor or a search card, e.g. '291c1bfe-e8f3-414a-a82d-d6fe081683fb'; '5532' = online visit." - removed
Input schema / properties / center_id / titleRemoved value: -"Center Id" - changed
Input schema / properties / service_id / descriptionPrevious value: -"service_id of a service at that center, e.g. '1a4a8ec2-fdf9-436e-a32b-8fc4485f609c'."New value: +"service_id of a service at that center." - removed
Input schema / properties / service_id / titleRemoved value: -"Service Id" - changed
Input schema / properties / user_center_id / descriptionPrevious value: -"user_center_id of the same center (the doctor-at-center id), e.g. '09558bad-168d-4df8-b39d-437a260ca6fc'."New value: +"user_center_id of the same center (doctor-at-center id)." - removed
Input schema / properties / user_center_id / titleRemoved value: -"User Center Id" - removed
Input schema / titleRemoved value: -"pz_visit_priceArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "pz_visit_priceDictOutput", - "type": "object" -}New value: +null
12 tool updates
v0.1.0- First observed
pz_center - First observed
pz_doctor - First observed
pz_faq - First observed
pz_first_available - First observed
pz_free_days - First observed
pz_free_slots - First observed
pz_holidays - First observed
pz_resolve_url - First observed
pz_reviews - First observed
pz_search_doctors - First observed
pz_suggest - First observed
pz_visit_price
TDQS
Scored across 12 tools
Each tool targets a distinct step in the booking research workflow: URL parsing, search suggestions, search, profiles, availability checks, reviews, FAQ, holidays, and pricing. Tool descriptions explicitly clarify boundaries and next steps, leaving almost no room for misselection.
All tools use a consistent 'pz_' prefix and snake_case, with clear, descriptive names. The only deviation from a strict verb_noun pattern is that several tools are noun-only (e.g., pz_center, pz_doctor, pz_reviews), but this remains predictable and readable.
Twelve tools are well-scoped for a medical appointment discovery domain, with each tool earning its place (search, profiles, availability, pricing, reviews, FAQ, holidays, and URL resolution). No tool feels redundant or excessive.
The surface thoroughly covers discovery, availability, and pricing, with clear guidance for each step. However, no tool enables actual booking, cancellation, or user account actions, which are notable gaps for a booking platform, though the server may intentionally be read-only.
Maintenance
Related MCP Connectors
Research 7,400+ US doctors: search, semantic search, profiles, reviews & procedure pricing.
Search a healthcare provider directory and get full provider details by id.
US provider, KOL, executive and organization search over de-identified claims data.
Find and book doctor, dentist & nurse appointments. 2M+ providers by insurance & cost in the US.
Related MCP Servers
- 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.1010 npmMIT
- AlicenseAqualityAmaintenanceEnables AI agents to search and compare the cheapest flights, trains, buses, private taxis and hotels across Iran, including free seats, baggage allowances, refund rules and exact prices, for a single date or across weeks. All 22 tools are read-only and return compact structured JSON, so an agent can plan multi-mode trips and hotel stays without logging in or booking.2222570 PyPI2MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search a catalog of roughly 960,000 fashion products across about 10,000 Iranian online and Instagram shops, comparing prices and discounts, checking per-color and per-size stock, browsing categories and curated listings, and finding similar items at other shops. It also lets agents assess shop trust signals such as ratings and buyer surveys, surface flash sales and discount codes, and read blog style guides, all read-only with no login or ordering.14428 PyPI2MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search Iranian doctors by speciality, city, neighborhood, insurance and visit type, compare office and online consultation fees, check free appointment times up to a month ahead, and read reviews. Also covers hospitals, clinics, labs, pharmacies, fixed-price clinic offers and health articles, all read-only so booking happens on the site via a returned link.14554 PyPI2MIT