Find Doctor — поиск врача и медицинских услуг
SkillSearchSearch 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.
No other account needed.
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.json → doctors[].
Статусы врача:
| Статус | Значение |
|---|---|
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):
- WebSearch:
site:[домен-клиники] прайсилиsite:[домен-клиники] цены [специальность] - WebFetch прайс-страницы клиники
- Найти цену первичного и повторного приёма
Это ЕДИНСТВЕННЫЙ авторитетный источник цен. Если официальный сайт не отдаёт цены (таймаут, нет прайса, цена за услугу не найдена) → в таблице писать «⚠️ уточнять по тел.». Не подставлять цену с агрегатора.
Если кандидат упоминается как «топ» на нескольких платформах — повышать приоритет.
Правила работы с ценами
- Агрегаторы — ТОЛЬКО для рейтингов и отзывов. Цены на них часто устаревшие. Перечень — в разделе «Платформы для поиска» ниже, он единственный. Любой не перечисленный там сайт-агрегатор подпадает под то же правило
- Официальный сайт клиники — ЕДИНСТВЕННЫЙ источник цен. Искать страницу «прайс» / «цены» / «стоимость»
- Всегда различать тип цены: за 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 | Рейтинг, отзывы, стаж, запись |
| DocDoc | docdoc.ru | Запись, отзывы, рейтинг |
| НаПоправку | napopravku.ru | Отзывы, рейтинг |
| Яндекс Карты | yandex.ru/maps | Рейтинг клиники, отзывы, расстояние |
| Стоматология.рф / stom-firms.ru | stom-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.json → cost_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