{
  "contract_version": "uaubook.mcp.v1",
  "protocol_version": "2026-07-28",
  "transport": "Streamable HTTP",
  "modules": [
    {
      "id": "context",
      "title": "Clínica",
      "scope": "context:read"
    },
    {
      "id": "catalog",
      "title": "Serviços e profissionais",
      "scope": "catalog:read"
    },
    {
      "id": "people",
      "title": "Pessoas",
      "scope": "clients:read"
    },
    {
      "id": "agenda",
      "title": "Agenda",
      "scope": "appointments:read"
    },
    {
      "id": "crm",
      "title": "CRM",
      "scope": "crm:read"
    },
    {
      "id": "automations",
      "title": "Automações",
      "scope": "automations:read"
    },
    {
      "id": "operations",
      "title": "Operações",
      "scope": "operations:read"
    }
  ],
  "tools": [
    {
      "name": "uaubook_context_get",
      "description": "Consulta clínica, fuso, permissões e booking_payment com chave Pix e instruções de sinal configuradas pela clínica. Ausência não autoriza inventar chave. Informar pagamento não registra recebimento.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "context:read",
      "readOnly": true,
      "title": "Consultar a clínica",
      "module": "context",
      "output": "Identificação, nome, fuso, regras de reagendamento, papel da integração e permissões.",
      "example": {}
    },
    {
      "name": "uaubook_services_list",
      "description": "Lista serviços, duração, valores e sinal configurado.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "after": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "catalog:read",
      "readOnly": true,
      "title": "Listar serviços",
      "module": "catalog",
      "output": "Serviços com categoria, duração, descrição, preço, variantes e configuração do sinal; próximo cursor.",
      "example": {
        "limit": 10
      }
    },
    {
      "name": "uaubook_professionals_list",
      "description": "Lista profissionais ativos e seus horários internos configurados. Não confirma disponibilidade de um slot.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "after": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "catalog:read",
      "readOnly": true,
      "title": "Listar profissionais",
      "module": "catalog",
      "output": "Profissionais ativos, especialidades, horários e intervalo configurado; próximo cursor.",
      "example": {
        "limit": 10
      }
    },
    {
      "name": "uaubook_clients_search",
      "description": "Busca pessoas no cadastro da clínica por nome, telefone ou e-mail. Telefone brasileiro é aceito com ou sem o nono dígito e com ou sem +55: a mesma pessoa é encontrada nos dois formatos, e fixo continua fixo. Lista vazia significa apenas nenhuma correspondência; formato impossível responde invalid_arguments. Nome, telefone e e-mail não concedem acesso Auth.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "after": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "field": {
            "type": "string",
            "enum": [
              "name",
              "phone",
              "email"
            ]
          },
          "value": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "clients:read",
      "readOnly": true,
      "title": "Buscar pessoas",
      "module": "people",
      "output": "Pessoas com nome, telefone, e-mail e versão do cadastro; próximo cursor. Não acessa credenciais de login.",
      "example": {
        "field": "name",
        "value": "Stark",
        "limit": 10
      }
    },
    {
      "name": "uaubook_client_get",
      "description": "Consulta dados de contato e versão de uma pessoa pelo ID.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "clients:read",
      "readOnly": true,
      "title": "Consultar uma pessoa",
      "module": "people",
      "output": "Identificação, contato e versão do cadastro de uma pessoa.",
      "example": {
        "id": "11111111-1111-4111-8111-111111111111"
      }
    },
    {
      "name": "uaubook_appointments_list",
      "description": "Lista reservas em intervalo de até 90 dias. Não trata horário vazio como disponibilidade confirmada.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "after": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "from": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "to": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "professional_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "client_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "from",
          "to"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:read",
      "readOnly": true,
      "title": "Listar agendamentos",
      "module": "agenda",
      "output": "Reservas com pessoa, profissional, serviços, horário, status, origem, valores de sinal/recebimento/cashback/crédito e versão financeira; próximo cursor.",
      "example": {
        "from": "2026-09-01",
        "to": "2026-09-30",
        "limit": 10
      }
    },
    {
      "name": "uaubook_appointment_get",
      "description": "Consulta agendamento, serviços, origem e situação financeira com versão.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:read",
      "readOnly": true,
      "title": "Consultar um agendamento",
      "module": "agenda",
      "output": "Dados da reserva, origem e situação financeira. Consulta não registra recebimento.",
      "example": {
        "id": "11111111-1111-4111-8111-111111111111"
      }
    },
    {
      "name": "uaubook_crm_catalog_get",
      "description": "Consulta funis ou etapas de um funil, sem criar configurações padrão.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "resource": {
            "type": "string",
            "enum": [
              "pipelines",
              "stages"
            ]
          },
          "pipeline": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]{1,80}$"
          },
          "after": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]{1,80}$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "crm:read",
      "readOnly": true,
      "title": "Consultar funis e etapas",
      "module": "crm",
      "output": "Funis ativos ou etapas de um funil com nome, ordem e configuração; próximo cursor.",
      "example": {
        "resource": "pipelines",
        "limit": 10
      }
    },
    {
      "name": "uaubook_crm_opportunities_list",
      "description": "Lista negócios e leads da clínica preservando pessoa, funil, etapa e versão.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "after": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "pipeline": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]{1,80}$"
          },
          "client_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "crm:read",
      "readOnly": true,
      "title": "Listar negócios",
      "module": "crm",
      "output": "Negócios com pessoa, funil, etapa, status, responsável, serviços de interesse e versão; próximo cursor.",
      "example": {
        "pipeline": "agendamentos",
        "limit": 10
      }
    },
    {
      "name": "uaubook_crm_opportunity_get",
      "description": "Consulta negócio pelo ID, sem expor tokens privados da captação.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "crm:read",
      "readOnly": true,
      "title": "Consultar um negócio",
      "module": "crm",
      "output": "Dados e versão do negócio, sem tokens privados de captação.",
      "example": {
        "id": "11111111-1111-4111-8111-111111111111"
      }
    },
    {
      "name": "uaubook_crm_automations_list",
      "description": "Consulta automações ativas padrão ou criadas pela equipe, sem executar/ativar/reaplicar regras.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "standard",
              "authored"
            ]
          },
          "pipeline": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]{1,80}$"
          },
          "after": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [
          "kind",
          "pipeline"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "automations:read",
      "readOnly": true,
      "title": "Consultar automações ativas",
      "module": "automations",
      "output": "Regras padrão ou automações criadas pela equipe, parâmetros, versão e vigência. Não ativa nem executa regras.",
      "example": {
        "kind": "standard",
        "pipeline": "agendamentos",
        "limit": 10
      }
    },
    {
      "name": "uaubook_booking_options",
      "description": "Consulta opções de agenda de um período de até 31 dias em uma chamada, com as mesmas regras internas da secretária: especialidades do profissional, duração somando adicionais, expediente, bloqueios e reservas vigentes. Informe service_id ou service_query (nome como a clínica cadastrou); adicionais somente com IDs explícitos. professional_id/professional_query são opcionais: sem preferência, cada opção identifica o profissional. Nome ambíguo devolve candidatos para esclarecer, sem escolher por conta própria. Não exige pessoa, telefone ou e-mail; não reserva, não registra pagamento e não aplica desconto. Preço com variante em aberto responde needs_selection, sem supor a menor faixa. Use next_cursor enquanto complete for false: lista vazia com complete false não significa ausência de horário.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "to": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "service_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "service_query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80
          },
          "professional_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "professional_query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80
          },
          "additional_service_ids": {
            "maxItems": 19,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "cursor": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          }
        },
        "required": [
          "from",
          "to"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:read",
      "readOnly": true,
      "title": "Consultar opções de agenda por período",
      "module": "agenda",
      "output": "Serviço e adicionais reconhecidos, duração total, fuso, valor canônico ou pendência de variante, e opções com data, horário e profissional identificado; continuidade explícita por cursor. Nome ambíguo devolve candidatos. Não reserva nem registra pagamento.",
      "example": {
        "from": "2026-09-20",
        "to": "2026-09-21",
        "service_query": "design de sobrancelha",
        "limit": 20
      }
    },
    {
      "name": "uaubook_booking_commit",
      "description": "Fecha a reserva interna em uma chamada: resolve a pessoa pelo telefone/e-mail (WhatsApp brasileiro com ou sem nono dígito, fixo continua fixo), confere o orçamento e grava com as mesmas regras internas de agenda, origem e financeiro. Reutiliza cadastro existente sem repetir o nome; client_name é obrigatório somente quando ninguém corresponde ao contato. Envie expected_quote exatamente como booking_options devolveu: mudança de preço/duração responde quote_changed sem gravar, e variante de preço em aberto responde quote_requires_selection. deposit_amount é sinal A COBRAR, nunca recebido: não registra pagamento, Pix, desconto ou origem inventada. Telefone e e-mail apontando pessoas diferentes respondem identity_review_required. Use request_id estável e operation_get após resposta perdida.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "service_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "additional_service_ids": {
            "maxItems": 19,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "professional_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "date": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "time": {
            "type": "string",
            "pattern": "^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$"
          },
          "client_contact": {
            "type": "object",
            "properties": {
              "phone": {
                "type": "string",
                "maxLength": 40
              },
              "email": {
                "type": "string",
                "maxLength": 254,
                "format": "email",
                "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
              }
            },
            "additionalProperties": false
          },
          "client_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "client_name": {
            "type": "string",
            "minLength": 2,
            "maxLength": 100
          },
          "expected_quote": {
            "type": "object",
            "properties": {
              "total_price": {
                "type": "number",
                "minimum": 0,
                "maximum": 100000000
              },
              "discount": {
                "type": "number",
                "minimum": 0,
                "maximum": 100000000
              },
              "deposit_amount": {
                "type": "number",
                "minimum": 0,
                "maximum": 100000000
              },
              "duration_minutes": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 1440
              }
            },
            "required": [
              "total_price",
              "discount",
              "deposit_amount",
              "duration_minutes"
            ],
            "additionalProperties": false
          },
          "booking_origin_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2000
              },
              {
                "type": "null"
              }
            ]
          },
          "room_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "context": {
            "type": "object",
            "properties": {
              "conversation_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "message_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "run_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "logical_turn_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "service_id",
          "professional_id",
          "date",
          "time",
          "client_contact",
          "expected_quote",
          "request_id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:create",
      "readOnly": false,
      "title": "Fechar a reserva em uma chamada",
      "module": "agenda",
      "output": "Reserva confirmada com a pessoa reutilizada ou criada, e comprovante durável da operação composta. Confere o orçamento antes de gravar: mudança de preço/duração ou variante em aberto recusa sem gravar. Sinal é valor a cobrar; não registra pagamento nem cria login.",
      "example": {
        "request_id": "11111111-1111-4111-8111-111111111111",
        "service_id": "11111111-1111-4111-8111-111111111111",
        "professional_id": "11111111-1111-4111-8111-111111111111",
        "date": "2026-09-20",
        "time": "10:00",
        "client_contact": {
          "phone": "11987654321"
        },
        "client_name": "Stark Teste",
        "expected_quote": {
          "total_price": 100,
          "discount": 0,
          "deposit_amount": 30,
          "duration_minutes": 60
        }
      }
    },
    {
      "name": "uaubook_availability_get",
      "description": "Consulta horários de um dia usando as regras da secretária interna. time opcional verifica um horário específico. Não reserva; revalidar ao criar.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "professional_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "service_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "additional_service_ids": {
            "maxItems": 19,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "date": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "time": {
            "type": "string",
            "pattern": "^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$"
          },
          "appointment_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "professional_id",
          "service_id",
          "date"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:read",
      "readOnly": true,
      "title": "Consultar horários disponíveis",
      "module": "agenda",
      "output": "Data, fuso, profissional, serviços e horários válidos pelas regras internas da secretária. Não reserva o horário.",
      "example": {
        "professional_id": "11111111-1111-4111-8111-111111111111",
        "service_id": "11111111-1111-4111-8111-111111111111",
        "date": "2026-09-20"
      }
    },
    {
      "name": "uaubook_appointment_create",
      "description": "Cria reserva interna com client_id consultado ou retornado por client_save. Envie client_contact com telefone/e-mail conhecidos para revalidar o vínculo na mesma transação; telefone antigo sem nono dígito é aceito, e vínculo divergente responde identity_review_required em vez de trocar a pessoa. Valores explícitos em reais: total_price final após discount; deposit_amount é sinal a cobrar, não recebido. Não inventar valores/origem. request_id estável identifica a operação; repetir apenas o mesmo payload/contexto. Sem registro de pagamento ou acesso Auth. context vem do backend integrador quando disponível.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "professional_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "service_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "additional_service_ids": {
            "maxItems": 19,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "date": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "time": {
            "type": "string",
            "pattern": "^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$"
          },
          "client_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "client_contact": {
            "type": "object",
            "properties": {
              "phone": {
                "type": "string",
                "maxLength": 40
              },
              "email": {
                "type": "string",
                "maxLength": 254,
                "format": "email",
                "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
              }
            },
            "additionalProperties": false
          },
          "total_price": {
            "type": "number",
            "minimum": 0,
            "maximum": 100000000
          },
          "discount": {
            "type": "number",
            "minimum": 0,
            "maximum": 100000000
          },
          "deposit_amount": {
            "type": "number",
            "minimum": 0,
            "maximum": 100000000
          },
          "booking_origin_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2000
              },
              {
                "type": "null"
              }
            ]
          },
          "room_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "context": {
            "type": "object",
            "properties": {
              "conversation_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "message_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "run_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "logical_turn_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "professional_id",
          "service_id",
          "date",
          "time",
          "client_id",
          "total_price",
          "discount",
          "deposit_amount",
          "request_id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:create",
      "readOnly": false,
      "title": "Criar agendamento",
      "module": "agenda",
      "output": "Reserva confirmada ou rejeição com comprovante durável da operação. Mantém vínculo CRM; não cria pessoa, senha ou recebimento.",
      "example": {
        "request_id": "11111111-1111-4111-8111-111111111111",
        "client_id": "11111111-1111-4111-8111-111111111111",
        "professional_id": "11111111-1111-4111-8111-111111111111",
        "service_id": "11111111-1111-4111-8111-111111111111",
        "date": "2026-09-20",
        "time": "10:00",
        "total_price": 100,
        "discount": 0,
        "deposit_amount": 20
      }
    },
    {
      "name": "uaubook_client_save",
      "description": "Resolve pessoa pelo telefone/e-mail normalizados na clínica ou cria contato quando ausente. Informe nome e telefone ou e-mail conhecidos. Telefone brasileiro é aceito com ou sem o nono dígito e com ou sem +55; fixo continua fixo. Só cria contato quando nenhuma pessoa corresponde: telefone e e-mail apontando pessoas diferentes, apelido em duas pessoas ou nome coincidente respondem identity_review_required, sem duplicar/escolher silenciosamente. Não cria login nem altera contato existente. Use request_id/contexto estáveis e operation_get após resposta perdida.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 2,
            "maxLength": 100
          },
          "phone": {
            "type": "string",
            "maxLength": 40
          },
          "email": {
            "type": "string",
            "maxLength": 254,
            "format": "email",
            "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "context": {
            "type": "object",
            "properties": {
              "conversation_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "message_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "run_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "logical_turn_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "name",
          "request_id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "clients:create",
      "readOnly": false,
      "title": "Cadastrar ou localizar pessoa",
      "module": "people",
      "output": "Pessoa localizada ou criada, com identificação e contato; conflito pede revisão sem duplicar cadastro. Não cria login nem sobrescreve contato existente.",
      "example": {
        "request_id": "11111111-1111-4111-8111-111111111111",
        "name": "Stark Teste",
        "email": "stark@example.test"
      }
    },
    {
      "name": "uaubook_appointment_edit",
      "description": "Edita/reagenda reserva interna existente com expected_version consultada em appointment_get. changes contém somente campos a alterar; mudança de serviços exige total_price, discount e deposit_amount explícitos em reais. Preserva pessoa, origem, pagamentos e créditos. Consulte disponibilidade com appointment_id para excluir a própria reserva. reason é obrigatório para exceção próxima ao atendimento. Sem recebimento ou reembolso. Use request_id/contexto estáveis.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "appointment_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "expected_version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "changes": {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "format": "date",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
              },
              "time": {
                "type": "string",
                "pattern": "^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$"
              },
              "professional_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "service_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "additional_service_ids": {
                "maxItems": 19,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "room_id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "total_price": {
                "type": "number",
                "minimum": 0,
                "maximum": 100000000
              },
              "discount": {
                "type": "number",
                "minimum": 0,
                "maximum": 100000000
              },
              "deposit_amount": {
                "type": "number",
                "minimum": 0,
                "maximum": 100000000
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 2000
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          "reason": {
            "type": "string",
            "minLength": 3,
            "maxLength": 1000
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "context": {
            "type": "object",
            "properties": {
              "conversation_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "message_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "run_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "logical_turn_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "appointment_id",
          "expected_version",
          "changes",
          "request_id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:edit",
      "readOnly": false,
      "title": "Editar ou reagendar",
      "module": "agenda",
      "output": "Reserva atualizada, versão anterior e receipt durável. Preserva origem, pessoa, recebimentos e créditos; conflito exige nova consulta.",
      "example": {
        "request_id": "11111111-1111-4111-8111-111111111111",
        "appointment_id": "11111111-1111-4111-8111-111111111111",
        "expected_version": 1,
        "changes": {
          "date": "2026-09-21",
          "time": "14:00"
        },
        "reason": "Pedido da cliente"
      }
    },
    {
      "name": "uaubook_appointment_cancel",
      "description": "Cancela reserva interna com autorização da cliente/equipe, motivo e expected_version consultada. Sem valor recebido cancela cobranças pendentes; com recebimento encaminha destino financeiro para revisão da equipe, preservando dinheiro registrado. Não efetua reembolso, cobrança extra ou exclusão da pessoa. Use request_id/contexto estáveis e operation_get após resposta perdida.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "appointment_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "expected_version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "reason": {
            "type": "string",
            "minLength": 3,
            "maxLength": 1000
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "context": {
            "type": "object",
            "properties": {
              "conversation_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "message_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "run_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "logical_turn_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "appointment_id",
          "expected_version",
          "reason",
          "request_id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "appointments:cancel",
      "readOnly": false,
      "title": "Cancelar agendamento",
      "module": "agenda",
      "output": "Cancelamento com receipt e situação financeira. Sem recebimento cancela a cobrança; valores recebidos ficam para revisão da equipe, sem reembolso automático.",
      "example": {
        "request_id": "11111111-1111-4111-8111-111111111111",
        "appointment_id": "11111111-1111-4111-8111-111111111111",
        "expected_version": 1,
        "reason": "Pedido da cliente"
      }
    },
    {
      "name": "uaubook_operation_get",
      "description": "Recupera receipt da mesma conexão/request_id sem executar a escrita. Ausência é pending, não comprova rejeição. Preserve a operação original até resultado durável.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "request_id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "scope": "operations:read",
      "readOnly": true,
      "title": "Conferir resultado de uma operação",
      "module": "operations",
      "output": "Resultado original da mesma conexão/request_id, inclusive após perda da resposta. Pending não comprova falha e não autoriza criar outra reserva.",
      "example": {
        "request_id": "11111111-1111-4111-8111-111111111111"
      }
    }
  ]
}
