Find Doctor — поиск врача и медицинских услуг

SkillSearch

Search for a doctor or medical service — analyzes reviews, ratings, prices, and distance. Comparison and recommendations. Triggers: "найди врача", "найди [specialty]", "где принимает", "хороший терапевт", "поиск врача", "find doctor", "куда пойти к [specialty]"

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Find Doctor — поиск врача и медицинских услуг skill

What this skill tells your AI

The instructions your AI receives, as published by alxyrgin/health-os in .claude/skills/find-doctor/SKILL.md and read by ahel’s review.

Назначение

Найти лучшего врача нужной специальности или медицинскую услугу: агрегировать данные с платформ отзывов, сравнить по рейтингу, цене, расстоянию и доступности. Предложить оптимальный вариант.

Запрос пользователя

$ARGUMENTS

Локация и доступ к медицине

Читать из Data/context/environment.json, не из этого файла. Адрес и страховка в тексте скилла устаревают при первом же переезде и расходятся с данными.

Что нужноОткуда брать
Город, район, улица, ближайшее метроlocation.city, location.district, location.street, location.nearest_metro
Страховкаhealthcare_access.insurance
Есть ли ДМС и какойhealthcare_access.dms, healthcare_access.dms_details
Готовность ездитьhealthcare_access.travel_readiness, healthcare_access.max_travel_time_min
Транспортhealthcare_access.preferred_transport

Ниже по тексту [метро], [район], [город] — подстановки из этих полей.

Если файл отсутствует или нужные поля пусты — спросить пользователя один раз, использовать ответ в текущем поиске и предложить записать его в Data/context/environment.json, чтобы не спрашивать снова.

Workflow

1. Уточнить запрос

Из сообщения пользователя определить:

  • Специальность (обязательно) — терапевт, ортопед, гастроэнтеролог и т.д.
  • Цель визита (если указана) — конкретная жалоба, обследование, second opinion
  • Срочность — плановый / нужно быстро
  • Бюджет — если есть ограничения
  • Предпочтения — пол врача, возраст, конкретная клиника

Если специальность неясна → спросить. Остальное — опционально, не допрашивать.

2. Проверить существующие контакты

Прочитать Data/doctors/contacts.jsondoctors[].

Статусы врача:

СтатусЗначение
activeНаблюдается сейчас или готов пойти повторно
historicalБыл в прошлом: другой город, детство, разовый визит. Не отбрасывать — это опыт пациента
rejectedОтказался идти повторно. Не предлагать снова

Записи без поля status считать historical.

Искать врачей нужной специальности любого статуса, кроме rejected, и разбирать по случаям:

  • Есть active → «У тебя уже есть [ФИО] в [клиника]. Ищем нового или к нему?»
  • Есть только historical → упомянуть и пояснить, почему это не готовый вариант: «Был [ФИО], [клиника], [period] — [город, если не текущий]. Продолжаем искать нового?»
  • Есть rejected → в выдаче не предлагать; если тот же врач всплывёт в результатах поиска, пометить «🚩 отказ в прошлом»
  • Ничего нет → идти дальше молча

Фильтр только по active не годится: сейчас у всех записей статус historical, и такой шаг не сработал бы ни разу.

Специальность сопоставлять по вхождению подстроки, а не по точному совпадению: в данных встречается «травматолог-ортопед, к.м.н.», «нейрофизиолог (ЭЭГ, РЭГ)», «педиатр (участковый)».

Прочитать Data/doctors/visits/_index.json:

  • Были ли визиты к врачам этой специальности?
  • Если были → кратко: «Последний визит: [дата] к [ФИО], [клиника]»

3. Два пути — ОМС и частный

Всегда показывать оба варианта:

3a. ОМС-путь (приоритетный)

WebSearch: [специальность] по ОМС [город] ЕМИАС запись

Выяснить:

  • Доступна ли эта специальность по ОМС напрямую или нужно направление от терапевта
  • Как записаться через ЕМИАС / Госуслуги
  • Ближайшие поликлиники к [метро] с этим специалистом
  • Примерные сроки ожидания

Если в healthcare_access.dms стоит true — добавить третий путь: что покрывает ДМС по dms_details.

3b. Частный путь

Переходить к шагам 4–7 ниже.

4. Поиск врачей на платформах

ВАЖНО: трёхэтапная верификация!

Радиус поиска:

  • По умолчанию: [район] + соседние районы. Соседние определять по карте, а не по списку в этом файле
  • Если пользователь готов ездить дальше (healthcare_access.travel_readiness) → расширять до всего города. Добавить запросы без привязки к метро: [специальность] [город] рейтинг отзывы, лучший [специальность] [город]
  • Если пользователь ищет по цене → обязательно искать по всему городу: дешёвые варианты могут быть не рядом

Этап 1 — WebSearch (найти кандидатов):

Параллельные запросы:

  • site:prodoctorov.ru [специальность] [метро] [город] рейтинг
  • site:prodoctorov.ru [специальность] [район] рейтинг
  • site:docdoc.ru [специальность] метро [метро]
  • site:napopravku.ru [специальность] [метро]
  • Если цель конкретная: лучший [специальность] [город] [цель] отзывы

Из результатов — собрать 5–8 кандидатов с URL их профилей.

Этап 2 — WebFetch агрегаторов (рейтинг и отзывы, НЕ цены):

Для каждого кандидата → WebFetch(profile_url):

  • Рейтинг (число + количество отзывов)
  • Стаж работы
  • Клиника и адрес
  • Ближайшая запись (если есть на странице)
  • Ключевые отзывы — паттерны: что хвалят, на что жалуются
  • Название клиники и её домен — понадобится для этапа 3

⚠️ Цены с агрегаторов НЕ брать — они часто устаревшие и вводят в заблуждение.

Этап 3 — WebFetch официальных сайтов (цены — ground truth):

Для каждого топ-кандидата (топ-5):

  1. WebSearch: site:[домен-клиники] прайс или site:[домен-клиники] цены [специальность]
  2. WebFetch прайс-страницы клиники
  3. Найти цену первичного и повторного приёма

Это ЕДИНСТВЕННЫЙ авторитетный источник цен. Если официальный сайт не отдаёт цены (таймаут, нет прайса, цена за услугу не найдена) → в таблице писать «⚠️ уточнять по тел.». Не подставлять цену с агрегатора.

Если кандидат упоминается как «топ» на нескольких платформах — повышать приоритет.

Правила работы с ценами
  • Агрегаторы — ТОЛЬКО для рейтингов и отзывов. Цены на них часто устаревшие. Перечень — в разделе «Платформы для поиска» ниже, он единственный. Любой не перечисленный там сайт-агрегатор подпадает под то же правило
  • Официальный сайт клиники — ЕДИНСТВЕННЫЙ источник цен. Искать страницу «прайс» / «цены» / «стоимость»
  • Всегда различать тип цены: за 1 зуб, за 1 челюсть, комплексная (обе челюсти), за приём и т.д. В таблице указывать ТИП цены
  • Если на сайте клиники цена не найдена → писать «уточнять», НЕ подставлять цену с агрегатора
  • При поиске услуги (чистка, МРТ и т.д.) — искать прайс-страницу конкретной услуги: site:[домен-клиники] прайс [услуга]

5. Анализ и скоринг

Для каждого кандидата рассчитать условный скор:

Базовые веса (по умолчанию):

ФакторВесКак оценивать
Рейтинг25%Нормализовать к 5.0, учесть количество отзывов (>50 надёжнее)
Отзывы (качество)25%Паттерны: внимательность, точность диагнозов, результат лечения
Цена20%Нормализовать: дешевле = лучше (но не демпинг)
Расстояние20%Минуты от [метро] (метро/авто)
Доступность10%Ближайшая запись: быстрее = лучше

Адаптация весов: если пользователь явно указал приоритет (например «цена — основное», «главное — близко», «нужен лучший специалист»), перераспределить веса:

  • Приоритетный фактор → 40%
  • Остальные факторы делят оставшиеся 60% пропорционально базовым весам
  • Пример: пользователь сказал «цена — основное» → Цена 40%, Рейтинг 15%, Отзывы 15%, Расстояние 15%, Доступность 15%

Корректировки:

  • Мало отзывов (<10) → понизить уверенность, пометить «⚠️ мало отзывов»
  • Негативные паттерны в отзывах (грубость, ошибки) → красный флаг 🚩
  • Врач из клиники, где уже есть другие врачи пользователя → бонус «удобство одного места»

6. Показать пользователю

## Поиск — [специальность] (дата поиска: YYYY-MM-DD)

### ОМС-путь
- [Как попасть бесплатно — направление, ЕМИАС, сроки]
- Ближайшая поликлиника: [название, адрес]

### Частный путь — топ кандидаты

| # | Врач | Клиника | Рейтинг | Отзывы | Цена (источник) | Дорога | Скор |
|---|------|---------|---------|--------|-----------------|--------|------|
| 1 | [ФИО] | [клиника] | ⭐ 4.8 (120) | ✅ хороший | 3 500 ₽ первичный (сайт) | 15 мин | 87 |
| 2 | [ФИО] | [клиника] | ⭐ 4.6 (230) | ✅ отличный | 5 000 ₽ комплекс (сайт) | 25 мин | 82 |
| 3 | [ФИО] | [клиника] | ⭐ 4.9 (45) | ⚠️ мало | уточнять | 10 мин | 78 |

### Детали по кандидатам

#### 1. [ФИО] — [клиника]
- **Стаж:** X лет
- **Адрес:** [адрес], [как добраться от `[метро]`]
- **Цена:** первичный — X ₽, повторный — Y ₽
- **Запись:** ближайшая [дата] / [ссылка на запись]
- **Что хвалят:** [паттерны из отзывов]
- **На что жалуются:** [если есть]
- **Ссылки:** [ПроДокторов] [DocDoc]

#### 2. ...

### Рекомендация
[Кого выбрать и почему — с учётом баланса цена/качество/расстояние]

7. Действия после выбора

Когда пользователь выберет врача:

7a. Сохранить в контакты

Файл Data/doctors/contacts.json — объект-обёртка, а не массив:

{
  "version": 1,
  "doctors": [ … ]
}

Новую запись добавлять (append) в массив doctors[]. Поле version не трогать. Существующие записи не переписывать. Запись объекта врача в корень файла уничтожит и обёртку, и все 7 имеющихся контактов.

Обязательные поля — те же, что у существующих записей:

{
  "name": "[ФИО]",
  "specialty": "[специальность]",
  "clinic": "[клиника]",
  "period": "[YYYY — н.в.]",
  "status": "active",
  "phone": "[если найден]"
}

Дополнительные поля, которые добавляет этот скилл (опциональны, у старых записей их нет — это нормально):

{
  "address": "[адрес]",
  "source": "find-doctor",
  "found_date": "YYYY-MM-DD",
  "checked_date": "YYYY-MM-DD",
  "rating": { "prodoctorov": 0.0, "reviews_count": 0 },
  "price_initial": 0,
  "notes": "[краткие заметки]"
}

Поля id в файле нет ни у одной записи — не выдумывать его. Врач идентифицируется парой name + specialty.

Перед записью проверить, нет ли этого врача в doctors[] уже. Если есть — обновить его запись (status, checked_date, price_initial, rating), а не создавать дубликат.

7b. Создать задачу в Todoist
Задача: «Записаться к [специальность] — [ФИО]»
Description:
  - Клиника: [название], [адрес]
  - Цена: ~X ₽ (первичный)
  - Запись: [ссылка или телефон]
  - Цель визита: [если указана]
Priority: p3 (или p2 если срочно)
Due: [если пользователь указал срок]
7c. Привязать к milestone (если есть)

Если поиск связан с направлением в Data/goals/YYYY.json:

  • Обновить cost_estimate_rub на основе цены врача
  • Привязать todoist_task_id

8. Поиск услуги (не врача)

Если пользователь ищет не врача, а услугу (МРТ, УЗИ, процедура):

Адаптировать workflow:

  • Вместо профилей врачей → искать клиники/центры с услугой
  • WebSearch: [услуга] цена [город] [метро], site:prodoctorov.ru [услуга] рейтинг
  • Дополнительные запросы для цен:
    • [услуга] [город] цена прайс недорого [текущий год]
    • [услуга] [город] рейтинг клиник сравнение цен
  • Для каждой найденной клиники — WebSearch прайс-страницы: site:[домен-клиники] прайс [услуга] или site:[домен] цены [услуга]
  • Сравнивать по: цена (с официального сайта!), оборудование (для МРТ — теслы), рейтинг клиники, расстояние
  • ОМС-путь: доступна ли услуга по ОМС, нужно ли направление
  • Цены — только с официальных сайтов клиник (см. «Правила работы с ценами» в разделе 4)

Платформы для поиска

Единый перечень агрегаторов — этот. На него ссылаются «Правила работы с ценами» в разделе 4.

ПлатформаURLЧто берём
ПроДокторовprodoctorov.ruРейтинг, отзывы, стаж, запись
DocDocdocdoc.ruЗапись, отзывы, рейтинг
НаПоправкуnapopravku.ruОтзывы, рейтинг
Яндекс Картыyandex.ru/mapsРейтинг клиники, отзывы, расстояние
Стоматология.рф / stom-firms.rustom-firms.ruПрофильный агрегатор по стоматологии — рейтинг и отзывы клиник

Со всех — только рейтинги и отзывы. Цены ни с одной из платформ не брать.

Если сеть недоступна

WebSearch или WebFetch могут не отработать — нет соединения, инструмент недоступен, сайт закрыт для агента.

  • WebSearch не работает → поиск невозможен. Сказать об этом прямо, не выдумывать кандидатов и не подставлять клиники по памяти. Показать то, что доступно офлайн: врачи из Data/doctors/contacts.json по нужной специальности и общий ОМС-путь (направление от терапевта, запись через ЕМИАС). Предложить повторить поиск позже
  • WebFetch не работает при живом WebSearch → работать по выдаче поиска: кандидаты и их клиники — да, рейтинги — с пометкой «из поисковой выдачи, не проверено», цены — нет. В колонке цены писать «⚠️ уточнять по тел.»
  • Часть кандидатов не открылась → не отбрасывать их молча, показать с пометкой «страница недоступна»
  • В шапку результата добавить строку «⚠️ Поиск неполный: [что именно не отработало]»

Никогда не заполнять пробел правдоподобным вымыслом: несуществующая клиника с выдуманной ценой хуже честного «не нашёл».

Актуальность сохранённых данных

rating, price_initial и checked_date в contacts.json — снимок на дату проверки, а не постоянное свойство врача.

Возраст записиЧто делать
До 3 месяцевИспользовать как есть, указав дату проверки
3–12 месяцевПоказать с пометкой «данные от [дата], могли измениться». Цену перепроверить на сайте клиники, если она влияет на решение
Больше 12 месяцевСчитать устаревшими. Не показывать как факт — перепроверить или писать «уточнять»

После перепроверки обновлять checked_date, price_initial и rating в существующей записи, а не заводить нового врача.

Цены в Data/goals/YYYY.jsoncost_estimate_rub, проставленные из старого поиска, при планировании визита старше 6 месяцев тоже перепроверять.

Правила

  • ОМС первым — всегда показывать бесплатный путь, даже если пользователь спрашивает про частного
  • Трёхэтапная верификация — рейтинги с агрегаторов (WebFetch), цены ТОЛЬКО с официальных сайтов клиник. Агрегаторные цены часто устаревшие и вводят в заблуждение
  • Цена — ground truth с сайта клиники — если цена не найдена на официальном сайте, писать «уточнять по тел.», не подставлять данные агрегаторов
  • Не рекомендовать безоговорочно — показывать факты, предлагать выбор
  • Мало отзывов = низкая уверенность — всегда помечать
  • Актуальность — указывать дату поиска, предупреждать что цены могут меняться. TTL сохранённых цен и рейтингов — см. «Актуальность сохранённых данных»
  • Локация — из данныхData/context/environment.json, а не из текста этого файла
  • Запись в контакты — append в doctors[] — обёртку и version не трогать, существующие записи не переписывать
  • Нет данных — так и писать — при недоступной сети не восполнять пробелы догадками
  • Не звонить и не записывать — только найти и предложить, запись — действие пользователя

Критерий завершения: ОМС-путь показан первым и содержит конкретику (нужно ли направление, как записаться, сроки); у каждого кандидата в таблице указан источник цены либо честное «уточнять по тел.»; ни одна цена не взята с агрегатора; локация подставлена из environment.json; если врач сохранён — он добавлен в массив doctors[] с checked_date, а файл после записи остаётся валидным JSON с прежним version; все сбои сети отражены в шапке результата.

⚕️ Информация носит справочный характер. Для принятия решений о лечении обратитесь к врачу.

Signals

GitHub stars
38
Forks
6
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
find-doctor
Source
github.com/alxyrgin/health-os