ClaimPilot предоставляет приём и триаж обращений в виде сервера Model Context Protocol (MCP), чтобы внешний ИИ-клиент (Claude Desktop, Claude Code, MCP Inspector или любой инструмент с поддержкой MCP) мог создавать обращения, отслеживать их статус, читать карточку обращения для оценщика и просматривать список обращений — те же операции, что человек выполняет через веб-форму и админ-панель Filament.
Эта страница также опубликована как веб-страница на боевом сайте по адресу https://strahovanie.up-money.ru/docs/mcp (отдаётся
App\Http\Controllers\DocsControllerиз встроенной копииapp/resources/docs/mcp.md).
MCP не зависит от модели. Клиент — это хост-приложение / фреймворк агента, который «говорит» на MCP, а не сама LLM. Агент, построенный на любой модели — включая российские модели, такие как GigaChat или YandexGPT — может подключиться к этому серверу, если его хост/фреймворк реализует MCP. Из готовых MCP-клиентов сегодня известны инструменты вроде Claude Desktop, Claude Code, MCP Inspector и Cursor; у GigaChat/YandexGPT нет встроенного MCP-клиента, но построенный вокруг них агент может выступить в этой роли.
Это сервер, а не агент: ClaimPilot публикует инструменты; клиентом выступает сторонний ИИ-инструмент. Сам ClaimPilot никогда не обращается к LLM от имени клиента. (Конвейер триажа использует LLM внутри — см. pipeline.md — но это выполняется на стороне сервера и полностью протоколируется независимо от того, как было создано обращение.)
MCP самоописателен: клиент узнаёт всё из инструкций сервера, описаний инструментов и схем входных
данных в момент подключения. Структуры ниже точно повторяют код (App\Mcp\*); общий форматтер
App\Mcp\Support\ClaimPresenter гарантирует, что код и документация не расходятся.
Построено на официальном пакете laravel/mcp. Класс сервера:
App\Mcp\Servers\ClaimPilotServer.
| Инструмент | Аннотация | Назначение |
|---|---|---|
submit_claim |
изменяет состояние (не только чтение) | Создаёт обращение и запускает конвейер триажа. |
get_claim_status |
только чтение | Статус и завершённые этапы конвейера по одному обращению. |
get_claim_card |
только чтение | Полная карточка обращения для оценщика. |
list_claims |
только чтение | Список обращений с фильтрами в стиле Filament. |
mark_reply_sent |
разрушающий, идемпотентный | Помечает черновик ответа как отправленный. |
submit_claim (изменяет состояние)Создаёт обращение со status = received, channel = mcp и запускает ту же цепочку
App\Services\ClaimPipeline, что и веб-форма. Возвращает результат сразу с uuid обращения —
обработка асинхронна (см. раздел «Асинхронная модель» ниже). Правила валидации те же, что и в
веб-форме (ClaimIntakeController::textFieldRules()), а не их копия.
Входные данные (все обязательны):
| Параметр | Тип | Примечания |
|---|---|---|
claimant_name |
string | до 255 |
claimant_contact |
string | телефон или email, до 255 |
incident_description |
string | 10–10000 символов, свободный текст (любой язык) |
incident_date |
string | YYYY-MM-DD, сегодня или раньше |
Возвращает { uuid, status, message } — status равен "received"; message указывает
клиенту опрашивать get_claim_status.
Без загрузки файлов. Аргументы MCP-инструментов — это JSON; фотографии и сканы документов бинарны. На этапе 1
submit_claimработает только с текстом. Фото повреждений и сканы полисов по-прежнему загружаются через веб-форму, которая питает этапы компьютерного зрения. Текстовое обращение проходит весь конвейер — этапам фото/документов просто нечего анализировать, а синтез работает только по описанию (часто завершаясь статусомneeds_info). Бинарный приём через MCP — намеренная задача этапа 2.
get_claim_status (только чтение)Вход: uuid (string, обязателен) — публичный идентификатор обращения, возвращённый
submit_claim.
Возвращает:
{
"uuid": "…",
"status": "received|processing|triaged|needs_info|failed",
"stages_completed": ["vision_photos", "vision_documents", "synthesis", "notify"],
"stages_pending": [],
"is_finished": true
}
is_finished равен true, как только status становится triaged, needs_info или failed.
Если status остаётся received, а stages_completed пуст — вероятно, не запущен воркер очереди.
get_claim_card (только чтение)Вход: uuid (string, обязателен).
Возвращает:
{
"uuid": "…",
"status": "triaged",
"claimant_name": "…",
"claimant_contact": "…",
"incident_type": "auto_accident|property_water|property_fire|theft|health|other|null",
"severity": "minor|moderate|major|total_loss|null",
"severity_confidence": 0.82,
"estimated_amount_min": 40000,
"estimated_amount_max": 120000,
"ai_summary": "…",
"client_reply_draft": "…",
"red_flags": [{ "code": "…", "severity": "low|medium|high", "explanation": "…" }],
"missing_documents": ["…"]
}
Суммы указаны в рублях (RUB) и могут быть null (модель оценивает консервативно).
incident_type, severity и суммы равны null, пока не выполнен синтез.
list_claims (только чтение)Все параметры необязательны; фильтры объединяются по И; сначала новые.
| Параметр | Тип | Допустимые значения |
|---|---|---|
status |
string | received, processing, triaged, needs_info, failed |
incident_type |
string | auto_accident, property_water, property_fire, theft, health, other |
severity |
string | minor, moderate, major, total_loss |
limit |
integer | 1–100, по умолчанию 25 |
Возвращает JSON-массив:
[{ "uuid": "…", "claimant_name": "…", "incident_type": "…", "severity": "…",
"status": "…", "red_flag_count": 1, "created_at": "2026-06-18T16:00:00+00:00" }]
mark_reply_sent (разрушающий, идемпотентный)Вход: uuid (string, обязателен).
Устанавливает client_reply_sent_at в текущий момент, если он ещё не задан (как кнопка «отметить
как отправленное» в Filament). Идемпотентно: повторный вызов сохраняет исходную отметку времени.
Возвращает { uuid, client_reply_sent_at } — client_reply_sent_at в формате ISO-8601.
Контекст только для чтения, который клиент может получить без вызова инструмента:
| Имя | URI | MIME | Содержимое |
|---|---|---|---|
claim_card |
claimpilot://claims/{uuid} |
application/json |
Та же структура, что у get_claim_card. |
Ресурс и инструмент get_claim_card используют общий ClaimPresenter::card(), поэтому они не
расходятся. (Журнал аудита ai_calls намеренно не публикуется через MCP — он может содержать
сырые ответы провайдеров; он остаётся доступен только администратору в Filament.)
| Имя | Аргументы | Назначение |
|---|---|---|
review_claim |
uuid (обязателен) |
Промпт-ревью в стиле оценщика: загружает карточку обращения и просит модель оценить непротиворечивость рассказа и доказательств, проверить тревожные сигналы, оценить сумму в рублях и раскритиковать черновик ответа на русском, завершая рекомендацией одобрить / запросить информацию / эскалировать. |
submit_claim возвращает результат, как только создана строка обращения и запущена цепочка — он
не ждёт завершения триажа. Конвейер (фото → документы → синтез → уведомление) выполняется в
очереди. Клиентам следует опрашивать get_claim_status, пока не станет is_finished, после
чего читать get_claim_card.
Должен быть запущен воркер очереди, иначе обращение навсегда останется в статусе
received:php artisan queue:work --tries=1 --timeout=900
Инструменты возвращают понятную, пригодную для действий ошибку (а не общий 500), на которую модель может отреагировать:
No claim found with uuid [X].Mcp::local('claimpilot', …), запуск через php artisan mcp:start claimpilot.
Работает как дочерний процесс клиента на той же машине; аутентификация не нужна. Это
демонстрационная / однопользовательская конфигурация.Mcp::web('/mcp/claimpilot', …) обязательно должен находиться за
аутентификацией. У ClaimPilot один администратор, поэтому пример в routes/ai.php защищён
->middleware('auth:sanctum') и по умолчанию закомментирован. Не публикуйте веб-вариант без
аутентификации — каждый инструмент читает или изменяет реальные данные обращений.cd app
php artisan mcp:inspector claimpilot
Показывает все инструменты/ресурсы/промпты и позволяет вызывать их интерактивно.
Из каталога приложения зарегистрируйте локальный сервер (stdio):
claude mcp add claimpilot -- php /absolute/path/to/app/artisan mcp:start claimpilot
…либо закоммитьте проектный .mcp.json:
{
"mcpServers": {
"claimpilot": {
"command": "php",
"args": ["artisan", "mcp:start", "claimpilot"]
}
}
}
Добавьте в claude_desktop_config.json (используйте абсолютные пути — Desktop не наследует ваш shell):
{
"mcpServers": {
"claimpilot": {
"command": "php",
"args": ["/absolute/path/to/app/artisan", "mcp:start", "claimpilot"]
}
}
}
Воркер очереди всё равно должен быть запущен отдельно, чтобы отправленные обращения продвигались
дальше статуса received.