Тема
Ошибки и состояния
Единица отказа — инструмент, а не сервер. Сервер выключается целиком только тогда, когда он физически недоступен.
Ошибки
Ошибка — структурированный объект. Сервер выставляет code, а сторону (side) назначает платформа по таблице ниже; пришедшее от сервера значение side перезаписывается. Тексты для пользователя по паре «код + сторона» в контракт не входят: они на стороне приложения.
Error
Ошибка. Структурированный отказ: код из словаря, сторона, пояснение для разработчика и отчёт о нарушениях.
| Поле | Обязательно | Тип | Что это |
|---|---|---|---|
code | да | ErrorCode | Код ошибки |
message | нет | string | |
report | нет | список Violation | |
side | нет | Side | Сторона |
| Код ошибки | Сторона |
|---|---|
contract_violation | business_mcp |
tool_excluded | business_mcp |
tool_outdated_for_agent | business_mcp |
contract_version_unsupported | norm_platform |
no_data | business_data |
stale | business_data |
unauthorized_scope | norm_rights |
tenant_mismatch | norm_rights |
gateway_error | norm_platform |
transform_error | norm_platform |
invalid_principal | norm_platform |
invalid_input | agent |
not_ready | business_data |
schema_unavailable | business_data |
record_deleted | business_data |
record_rejected | business_data |
temporary | business_data |
rate_limited | business_data |
unknown_user | agent |
unknown_field | agent |
business_error | business_mcp |
Side
Сторона. Кто виноват: MCP бизнеса, данные бизнеса, права NORM, платформа NORM, агент.
Значения: business_mcp, business_data, norm_rights, norm_platform, agent.
Violation
Нарушение. Путь JSON Pointer до места расхождения, ожидание и факт.
| Поле | Обязательно | Тип |
|---|---|---|
actual | да | string |
expected | да | string |
path | да | string |
Доменные состояния
Если инструмент не может выполнить запрос по предметной причине — данных ещё нет, запись отклонена, получатель неизвестен, — он отвечает успешно, но кладёт в data.error доменное состояние. Поля данных с пометкой «при успехе» в таком ответе не обязательны.
DomainError
Доменное состояние. Код из словаря контракта, пояснение для разработчика, признак осмысленности повтора и, для неизвестной цели, список допустимых ярлыков.
| Поле | Обязательно | Тип | Что это |
|---|---|---|---|
code | да | ErrorCode | Код ошибки |
allowed_targets | нет | список string | |
message | нет | string | |
retryable | нет | boolean |
Состояния инструмента
Платформа проверяет каждый инструмент сервера по слепку и присваивает ему состояние. Модель видит только инструменты в состоянии active и degraded.
ToolState
Состояние инструмента. active — работает, degraded — работает с оговоркой, excluded — скрыт от модели, unavailable — сервер недоступен.
Значения: active, degraded, excluded, unavailable.
ReasonCode
Код причины. Почему инструмент не активен. missing_version — информационная: состояние остаётся active.
Значения: input_schema_violation, output_schema_violation, result_too_large, missing_pagination, unknown_catalog_tool, unknown_contract_version, deprecated, server_unreachable, missing_version.
Проверка соответствия
Итог проверки сервера — отчёт о соответствии. Одна и та же форма у платформы, у утилиты проверки norm-contract check и в админке.
ConformanceReport
Отчёт о соответствии. Какой пакет проверял, когда, и что вышло по каждому инструменту сервера.
| Поле | Обязательно | Тип |
|---|---|---|
checked_at | да | string (date-time) |
package_version | да | string |
server_id | да | string |
tools | да | список ToolReport |
server_version | нет | integer |
ToolReport
Состояние инструмента. Имя, разрешённые версии, состояние, причины, сторона и подробности расхождений.
| Поле | Обязательно | Тип | Что это |
|---|---|---|---|
name | да | string | |
reasons | да | список ReasonCode | |
state | да | ToolState | Состояние инструмента |
versions | да | список integer | |
details | нет | список Violation | |
side | нет | Side | Сторона |