ClaimPilot — ИИ для урегулирования

← На главную

ClaimPilot — MCP-сервер

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), на которую модель может отреагировать:

Аутентификация

Как подключиться

MCP Inspector (самая быстрая проверка)

cd app
php artisan mcp:inspector claimpilot

Показывает все инструменты/ресурсы/промпты и позволяет вызывать их интерактивно.

Claude Code

Из каталога приложения зарегистрируйте локальный сервер (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

Добавьте в claude_desktop_config.json (используйте абсолютные пути — Desktop не наследует ваш shell):

{
  "mcpServers": {
    "claimpilot": {
      "command": "php",
      "args": ["/absolute/path/to/app/artisan", "mcp:start", "claimpilot"]
    }
  }
}

Воркер очереди всё равно должен быть запущен отдельно, чтобы отправленные обращения продвигались дальше статуса received.