A NestJS-based MCP server for managing clinic appointments, doctor information, service pricing, knowledge base search, and web search. Integrates with Telegram bot, WhatsApp bot, and MongoDB for data persistence.
This MCP server exhibits major definition quality gaps. While 13 tools are defined with descriptions and some parameter documentation, critical issues undermine their usability: (1) Tool names lack clear verb_noun structure, several are opaque or vague ('move_appointment' should be 'reschedule_appointment'; 'get_appointment_slots' vs 'get_doctor_available_slots' create unnecessary disambiguation work); (2) Most tools accept only a generic 'query' string parameter with minimal constraint documentation, forcing LLMs to guess input format and structure; (3) Output schemas are entirely absent from the codebase, no response types are documented, leaving LLMs unable to plan chained calls or extract relevant fields; (4) Parameter descriptions lack format/constraint details (e.g., 'preferred_date' and 'preferred_time' lack ISO 8601 format guidance, 'contact_phone' lacks pattern/length); (5) Error handling is not documented, no guidance on retryability, user-fixable vs fatal errors, or recovery paths; (6) Russian-language descriptions present a localization issue for English-speaking LLM agents.
Вызвать модератора (администратора) для помощи клиенту. ОБЯЗАТЕЛЬНО вызывай в случаях: (1) Сложные/пограничные операции: сопутствующие заболевания, повторные операции, любые сомнения клиента. (2) Экстренные состояния: не ест, рвота, сильная слабость, судороги, резкое ухудшение, «очень плохо», «не знаем что делать». (3) Послеоперационные вопросы: припухлость шва, выделения, боль, уплотнения, сомнения после операции. (4) Медицинские назначения: дозировки, аналоги препаратов, как давать лекарство, совместимость. (5) Аптека: наличие препаратов, стоимость, аналоги. (6) Нестандартные кейсы: клиент путается в услугах, недоволен, настаивает, эмоционально напряжён. Также вызывай при явной просьбе: «хочу оператора», «свяжите с модератором», «нужна помощь человека», «поговорить с живым человеком».
Отменить запись на прием. Используй когда пользователь хочет отменить запись, удалить прием, отказаться от записи. Например: 'отменить запись', 'отменить прием', 'удалить запись', 'отменить мой прием'.
Создать запись на прием к врачу. Используй когда пользователь хочет записаться на прием, бронирует время у врача или планирует визит в клинику.
Найти услугу для клиента. Используй когда пользователь хочет найти услугу для своего питомца.
Получить доступные окна (слоты) для записи к врачу на основе правил клиники из Redis и существующих записей. Используется для внутренней логики системы записи. Функция получает правила расписания из кэша (ключ 'rules'), находит врача по фамилии, получает его существующие записи из CRM и генерирует доступные временные слоты, исключая занятые времена. Учитывает специальные дни (хирургический, стоматологический, кардиологический) и бизнес-правила клиники.
Output schemas completely missing. No documentation of response types, fields, or structure for any tool. LLMs cannot plan downstream calls or extract referenced IDs without guessing response format.
Generic 'query' parameters with minimal constraints. 9 tools accept only a 'query' string with no format, length, or constraint documentation. LLMs cannot validate input before submission; results in malformed API calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 38 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 31 | - | v1 |
Узнать график работы клиники. Используй когда пользователь спрашивает: во сколько открыто/закрыто, время работы, график работы, когда работает клиника, режим работы, рабочие часы. Инструмент возвращает текущую дату и расписание на ближайшую неделю — кратко распиши пользователю по дням.
Показать доступное время для записи к врачу. Используй когда пользователь спрашивает когда можно записаться к врачу, интересуется свободным временем или хочет узнать доступные окна. Например: 'когда свободен врач', 'какое время у врача', 'когда можно записаться', 'свободные окна'.
Информация о врачах клиники. Используй ТОЛЬКО когда пользователь спрашивает про конкретного врача (кто такой врач X, расскажи про Ступакову, что делает Хромцова) или хочет узнать фамилии/список врачей (какие врачи есть, кто у вас принимает, назовите врачей). Не вызывай для общих вопросов о записи или услугах.
Перенести запись на прием. Используй когда пользователь хочет перенести запись на другое время или дату. Например: 'хочу перенести запись', 'перенести прием', 'изменить время записи', 'перенести на другое время'.
Поиск типовых вопросов и ответов в базе знаний клиники. Используй когда пользователь задает вопросы о работе клиники, графике работы, записи на прием, оплате, выезде на дом и других типовых вопросах. Например: 'можно ли приехать на прием', 'какой график работы', 'можно ли оплатить картой', 'выезжаете ли на дом'. ВАЖНО: Если пользователь спрашивает про конкретную услугу (стрижка, груминг, вакцинация и т.д.), НЕ используй эту функцию - используй search_service_price для поиска цен.
Поиск точных цен на услуги клиники в базе данных. ИСПОЛЬЗУЙ ЭТУ ФУНКЦИЮ для ВСЕХ вопросов о ценах и стоимости услуг. Используй когда пользователь спрашивает: 'сколько стоит', 'цена на', 'стоимость', 'сколько стоит груминг', 'цена на стрижку кота/собаки', 'сколько стоит вакцинация', 'цена на прием', 'сколько стоит УЗИ', 'стоимость кастрации', 'сколько стоит стерилизация', 'цена на рентген', 'сколько стоит анализ крови', 'стоимость чистки зубов', 'цена на чипирование', 'сколько стоит груминг кота', 'цена на стрижку', 'стоимость стрижки' и любые другие вопросы о ценах. НЕ используй search_web для вопросов о ценах - у нас есть точная база данных с ценами.
Поиск информации в интернете. Используй когда пользователь задает вопросы о здоровье питомца, симптомах, заболеваниях, лечении, уходе за животными или нужна актуальная информация из интернета. Например: 'что делать если у собаки глисты', 'симптомы чумки у кошек', 'как лечить понос у щенка', 'признаки болезни у питомца', 'информация о заболевании'.
Показать записи на прием. Используй когда пользователь хочет посмотреть свои записи, узнать какие приемы у него запланированы, посмотреть расписание. Например: 'какие приемы у меня', 'мои записи', 'покажи мои приемы', 'какие приемы есть у меня'.
Parameter format requirements undocumented. 'preferred_date', 'preferred_time' in create_appointment lack ISO 8601 guidance; 'contact_phone' lacks pattern/length constraints; 'doctor_last_name' in get_appointment_slots lacks enumeration or lookup guidance.
No error handling or recovery guidance documented. No indication of which errors are retryable, user-fixable, or fatal. LLMs cannot intelligently recover from tool failures.
Descriptions entirely in Russian. Primary audience (English-speaking LLM agents) cannot parse usage guidance, examples, or disambiguation. Machine translation will hallucinate meanings and misguide tool selection.
Ambiguous tool names create selection overhead. 'move_appointment' unclear (reschedule vs reassign?); 'get_appointment_slots' vs 'get_doctor_available_slots', LLM must reason about distinction. Verb_noun naming would clarify.
Idempotency and multi-step confirmation missing for destructive operations. 'cancel_appointment' and 'move_appointment' (WRITE risk) lack dry-run or confirmation patterns to prevent accidental execution.
Missing pagination/limit guidance. 'search_web', 'search_knowledge_base' return potentially unbounded result sets with no documented limit or pagination mechanism. Can exhaust context window.
'get_clinic_working_hours' accepts zero parameters but description states output includes 'current_date' and 'расписание на ближайшую неделю'. Parameter documentation missing for time zone, date range filtering.