# Doctoreto (pypi · doctoreto-mcp)

Unofficial read-only Doctoreto: Iranian doctors, visit fees, free appointment times, clinics, labs.

- Trust score: 78/100 (medium)
- Change this week: +15
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-22

## Components

- pypi · `doctoreto-mcp`: 78/100 (this document), [markdown](https://verifymcp.io/servers/sepehr071-doctoreto-mcp/doctoreto-mcp.md), [page](https://verifymcp.io/servers/sepehr071-doctoreto-mcp/doctoreto-mcp)

## Channel facts

- Registry: `pypi`
- Package: `doctoreto-mcp`
- Version: `0.4.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-22.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 1 of 35 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to sepehr071/doctoreto-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 59/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3272 tokens (~233/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability check failed: the tool surface changed between 0.2.2 and 0.4.1: 0 tool removals, 14 breaking changes, 0 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Doctoreto MCP server?

Doctoreto runs locally as a PyPI package, launched with uvx doctoreto-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add sepehr071-doctoreto-mcp -- uvx doctoreto-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "sepehr071-doctoreto-mcp": {
      "command": "uvx",
      "args": [
        "doctoreto-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "sepehr071-doctoreto-mcp": {
      "command": "uvx",
      "args": [
        "doctoreto-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add sepehr071-doctoreto-mcp -- uvx doctoreto-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sepehr071-doctoreto-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "doctoreto-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sepehr071-doctoreto-mcp --command uvx --arg doctoreto-mcp
```

### Hermes

```yaml
mcp_servers:
  sepehr071-doctoreto-mcp:
    command: "uvx"
    args: ["doctoreto-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "sepehr071-doctoreto-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "doctoreto-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add sepehr071-doctoreto-mcp -t stdio -c uvx -a doctoreto-mcp
```

### Other

```json
{
  "mcpServers": {
    "sepehr071-doctoreto-mcp": {
      "command": "uvx",
      "args": [
        "doctoreto-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-22 (score 78, +15)

- [security regression] Stability: fail → unverified
- [security regression] Tool safety: pass → unverified
- [security improvement] Malware scan: unverified → pass
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Package version: 0.4.0 → 0.4.1

### 2026-10-19 (score 63, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-18 (score 78, 0)

- [security regression] Stability: fail → unverified
- [security regression] Tool safety: pass → unverified
- [security regression] Malware scan: pass → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Package version: 0.3.0 → 0.4.0

### 2026-10-16 (score 78, +15)

- [security regression] Stability: unverified → fail
- [security regression] Tool safety: pass → unverified
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Package version: 0.2.2 → 0.3.0

### 2026-10-15 (score 63, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-14 (score 78, +29)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: fail
- [functional] First check of Destructive annotations: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: good
- [functional] First check of Tool coverage: 100
- [functional] First check of Tool coverage: 100

### 2026-10-13 (score 49, +15)

- [security improvement] Malware scan: unverified → pass
- [functional] Package version: 0.2.1 → 0.2.2

### 2026-10-12 (score 34)

First indexed and scored.

## MCP tools (14)

### `dt_suggest` (~150 tokens)

Suggest doctors, specialities and centers

Search-box suggestions: doctors (hash id), speciality slugs, service tags and centers for a free phrase.

E.g. 'قلب' -> speciality 'cardiologist'. Doctors match by name, so for a speciality use the slug.
Next: dt_search_doctors, dt_doctor or dt_center.

Input parameters:

- `city_id`: Numeric city id from dt_cities to rank one city first, e.g. 2200 (Tehran).
- `limit` (integer): Max items of each kind.
- `query` (string, required): What the user typed, in Persian: a doctor's name, a speciality or a symptom, e.g. 'قلب' or 'پرآذران'.

### `dt_search_doctors` (~351 tokens)

Search doctors

Search doctors by city, speciality, neighborhood, service tag, name, gender, insurance and visit type.

Cards carry the hash `id` for dt_doctor; online prices are not in cards (use dt_doctor).
Next: dt_doctor -> dt_free_slots.

Input parameters:

- `city`: City slug from dt_cities, e.g. 'tehran'. Omit for the whole country.
- `gender`: Only male or only female doctors.
- `has_free_slot` (boolean): Only doctors with a free appointment slot.
- `insurance_ids`: Insurance ids from dt_insurances (any of them), e.g. [1]. Few doctors list insurances.
- `limit` (integer): Doctors per page (about 1 KB each).
- `name`: Doctor's name in Persian (part is enough), e.g. 'پرآذران'.
- `near_lat`: Latitude of a point in Iran, e.g. 35.7575.
- `near_lon`: Longitude of a point in Iran, e.g. 51.4100.
- `neighborhood`: Neighborhood slug from dt_neighborhoods, with city only, e.g. 'pasdaran'.
- `page` (integer): 1-based page number.
- `service_tag`: Service or symptom tag slug from dt_suggest, e.g. 'echocardiography'.
- `sort` (string): default = site ranking (sponsored first); popular = reviews and recommend rate.
- `speciality`: Speciality slug from dt_specialities or dt_suggest, e.g. 'cardiologist'.
- `visit_type`: Only doctors offering this visit; instant = on-call phone/text now.

### `dt_specialities` (~116 tokens)

Specialities

List specialities with the slug dt_search_doctors needs; `total` counts all matches.

\`level` is specialist, subspecialist, fellowship or general; `parent` is the broader speciality
(interventional cardiology -> cardiologist). Prefer `query`. Next: dt_search_doctors(speciality=slug).

Input parameters:

- `limit` (integer): Max entries (about 100 exist).
- `query`: Part of the name or slug, e.g. 'قلب' or 'cardio'. Omit for all.

### `dt_cities` (~125 tokens)

Cities

Find a city's slug (for search filters) and numeric id (for dt_suggest); main cities first.

With `speciality`: only main cities that have such doctors, with counts (a search may find more elsewhere).
Next: dt_search_doctors(city=slug) or dt_neighborhoods.

Input parameters:

- `limit` (integer): Max cities.
- `query`: Part of the city name in Persian or the slug, e.g. 'شیراز'.
- `speciality`: Only cities that have doctors of this speciality, with counts, e.g. 'cardiologist'.

### `dt_neighborhoods` (~129 tokens)

Neighborhoods

Neighborhoods of a city (most doctors first) and nearby cities, each with a doctor count.

District groupings (منطقه 3, غرب) are filters too. Next: dt_search_doctors(city=..., neighborhood=slug).

Input parameters:

- `city` (string, required): City slug from dt_cities, e.g. 'tehran'.
- `limit` (integer): Max neighborhoods.
- `query`: Part of the neighborhood name in Persian or slug, e.g. 'پاسداران'.
- `speciality`: Count only doctors of this speciality, e.g. 'cardiologist'.

### `dt_insurances` (~100 tokens)

Insurances

List basic and supplementary insurers with the ids dt_search_doctors(insurance_ids=...) takes.

\`total` counts all matches. Few doctors list insurances, so the filter narrows a search a lot; centers list
theirs in dt_center.

Input parameters:

- `limit` (integer): Max insurers (about 84 exist).
- `query`: Part of the insurer's name in Persian, e.g. 'تامین' or 'آتیه'.

### `dt_doctor` (~201 tokens)

Doctor profile

A doctor's profile with every bookable service, its price in Toman and its next free time.

\`services[]` lists each office and online visit with `consultation_id` (input of dt_free_slots), `fee`
(office visit: paid at the office; online: the online price), `pay_online_now` (charged when booking),
the office address and coordinates, and `next_free`. Also about text, review summary (count, recommend
percent, 1-5 category averages), office waiting time, treated conditions and photo.
Long texts are cut (about 800 chars); full_text returns them whole.
Next: dt_free_slots, dt_reviews.

Input parameters:

- `doctor` (string, required): Doctor hash id ('xqbEWZ') or page URL ('https://doctoreto.com/doctor/dr-kambiz-parazaran/xqbEWZ').
- `full_text` (boolean): Return complete texts instead of cutting long ones.

### `dt_free_slots` (~164 tokens)

Free appointment slots

Free appointment times of one service (office visit, phone/video call, clinic offer, lab admission).

Returns only days with free times: date, weekday, Jalali date and free start times (HH:MM, Tehran local).
Past times today are dropped. `bookable_until` is the last day opened (often ~30 days ahead). Text
consultations usually have no slots.

Input parameters:

- `consultation_id` (integer, required): Consultation id from dt_doctor services[], dt_center bookable[] or dt_offer variants[], e.g. 1943.
- `days` (integer): Number of days to check from start_date.
- `start_date`: First day, Gregorian YYYY-MM-DD; default today (Tehran), e.g. '2026-10-14'.

### `dt_reviews` (~186 tokens)

Reviews

Patient reviews (doctors and centers newest first, offers oldest first): stars 1-5, recommends, text
(cut at 400 chars unless full_text), labels, visit type, reason, office waiting time, date (Gregorian + Jalali) and reply.

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.

Input parameters:

- `full_text` (boolean): Return complete texts instead of cutting long ones.
- `id` (string, required): Hash id or page URL of the doctor, center or offer, e.g. 'xqbEWZ'.
- `limit` (integer): Reviews per page.
- `of` (string, required): Whose reviews: a doctor, a center or a clinic offer.
- `page` (integer): 1-based page number.

### `dt_search_centers` (~373 tokens)

Search centers

Find hospitals, clinics, infirmaries, laboratories, imaging centers and pharmacies with filters.

Cards carry the hash `id` for dt_center. With near_lat and near_lon it searches a square around the point
sorted by distance; dense areas return only part of the centers and count the rest in `more_in_area`.
Without them `limit` cuts the upstream page (`on_page` items). No insurance filter: see dt_center.
Next: dt_center, dt_reviews(of='center').

Input parameters:

- `city`: City slug from dt_cities, e.g. 'tehran'.
- `limit` (integer): Centers per page (the API pages by 20).
- `name`: Part of the center's name in Persian, e.g. 'قلب'.
- `near_lat`: Latitude of a point in Iran, e.g. 35.7575.
- `near_lon`: Longitude of a point in Iran, e.g. 51.4100.
- `neighborhood`: Neighborhood slug from dt_neighborhoods, with city only, e.g. 'pasdaran'.
- `online_lab_admission` (boolean): Only laboratories that take online admission bookings.
- `open_24h` (boolean): Only centers open around the clock (pharmacies, hospitals).
- `ownership`: State (public) or private.
- `page` (integer): 1-based page number.
- `radius_km` (number): With near_lat/near_lon: half-width of the square searched, in km.
- `service_tag`: Service tag slug from dt_suggest, e.g. 'mri'.
- `speciality`: Department / speciality slug from dt_specialities, e.g. 'ophthalmologist'.
- `type`: Kind of center, e.g. 'laboratory'.

### `dt_center` (~174 tokens)

Center details

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.
Next: dt_free_slots, dt_doctor, dt_reviews(of='center').

Input parameters:

- `center` (string, required): Center hash id ('YNrrOb') or page URL ('https://doctoreto.com/center/raz-shiraz-lap/YNrrOb').
- `doctors` (integer): How many of its doctors to list (0 = none).
- `full_text` (boolean): Return complete texts instead of cutting long ones.

### `dt_health_articles` (~140 tokens)

Health articles

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).

Input parameters:

- `limit` (integer): Max articles.
- `query` (string, required): Disease, test, drug or treatment in Persian, e.g. 'فشار خون' or 'آزمایش تیروئید'.
- `text_chars` (integer): Characters of article text to include per article; 0 = summary only.

### `dt_search_offers` (~322 tokens)

Search clinic offers

Search clinic offers: fixed-price procedures and packages (ultrasound, laser, dental, check-ups).

Cards give price and discounted price (Toman), `pay_online` (the deposit when `payment` is deposit_online,
the rest at the place) and the default `consultation_id` for dt_free_slots. No sort. `limit` cuts the
upstream page (`on_page` items): raise it to see the rest, `page` jumps a whole page.
Next: dt_offer, dt_free_slots, dt_reviews(of='offer').

Input parameters:

- `center`: Only offers at this place (hash id), e.g. 'ZWpOLy'.
- `city`: City slug from dt_cities, e.g. 'tehran'.
- `doctor`: Only offers of this doctor (hash id or page URL).
- `limit` (integer): Offers to return from the page (the API pages by about 40).
- `max_price`: Maximum price in Toman, e.g. 2000000.
- `min_price`: Minimum price in Toman, e.g. 1000000.
- `neighborhood`: Neighborhood slug, e.g. 'pasdaran'.
- `page` (integer): 1-based page number.
- `query`: Service in Persian, e.g. 'سونوگرافی' or 'لیزر'.
- `service_tag`: Service tag slug, e.g. 'rhinoplasty'.
- `speciality`: Speciality slug, e.g. 'cardiologist'.

### `dt_offer` (~91 tokens)

Clinic offer details

One clinic offer in full: price, discount, deposit, who performs it and where, description, terms,
capacity, expiry, rating, and bookable variants with `consultation_id` for dt_free_slots.

Input parameters:

- `full_text` (boolean): Return complete texts instead of cutting long ones.
- `offer` (string, required): Offer hash id ('ArraJa'), numeric id ('129311') or page URL.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/sepehr071-doctoreto-mcp/doctoreto-mcp#diagnostics

## Score history

- 2026-10-22: 78
- 2026-10-21: 63
- 2026-10-20: 63
- 2026-10-19: 63
- 2026-10-18: 78
- 2026-10-17: 78
- 2026-10-16: 78
- 2026-10-15: 63
- 2026-10-14: 78
- 2026-10-13: 49
- 2026-10-12: 34

## Common questions

### What is the Doctoreto MCP server?

Doctoreto is an MCP server listed in the public MCP registry as io.github.sepehr071/doctoreto-mcp. Unofficial read-only Doctoreto: Iranian doctors, visit fees, free appointment times, clinics, labs. This page covers its PyPI package (doctoreto-mcp).

### Is the Doctoreto MCP server safe to use?

Doctoreto scores 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 22 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Doctoreto MCP server expose?

Doctoreto exposes 14 tools: dt_suggest, dt_search_doctors, dt_specialities, dt_cities, dt_neighborhoods, and 9 more. Their descriptions and schemas cost roughly 2,622 tokens of context every time the server is loaded.

### Is the Doctoreto MCP server still maintained?

Doctoreto is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Doctoreto MCP server under?

Doctoreto declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/doctoreto-mcp/
- Socket report: https://socket.dev/pypi/package/doctoreto-mcp
- Repository: https://github.com/sepehr071/doctoreto-mcp
- Changelog RSS feed: https://verifymcp.io/servers/sepehr071-doctoreto-mcp/doctoreto-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/sepehr071-doctoreto-mcp/doctoreto-mcp.json
- HTML version of this page: https://verifymcp.io/servers/sepehr071-doctoreto-mcp/doctoreto-mcp
