{
  "specification": "webmcp@early-preview",
  "origin": "https://agentair.ori.lat",
  "site_name": "Agent Air",
  "bridge": "https://agentair.ori.lat/webmcp.js",
  "dispatcher": "https://agentair.ori.lat/api/v1/webmcp/call",
  "declaration": "imperative",
  "tools": [
    {
      "name": "search_flights",
      "description": "Busca voos por número, código de aeroporto ou cidade de destino. Público, sem token.",
      "transport": "imperative",
      "auth": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Cidade, código de aeroporto ou número do voo."
          }
        },
        "required": [
          "query"
        ]
      }
    },
    {
      "name": "get_flight",
      "description": "Lê um voo pelo número ou slug, com todas as tarifas e a bagagem de cada uma.",
      "transport": "imperative",
      "auth": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "flightNumber": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          }
        },
        "oneOf": [
          {
            "required": [
              "flightNumber"
            ]
          },
          {
            "required": [
              "slug"
            ]
          }
        ]
      }
    },
    {
      "name": "quote_fare",
      "description": "Cota as tarifas de um voo sob um orçamento e indica a mais barata que chega no mesmo dia com mala despachada. É a decisão da jornada de aceite.",
      "transport": "imperative",
      "auth": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "flightNumber": {
            "type": "string"
          },
          "budget": {
            "type": "integer",
            "description": "Orçamento total em centavos."
          }
        },
        "required": [
          "flightNumber",
          "budget"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "flightNumber": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "budget": {
            "type": "integer"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "price": {
                  "type": "integer",
                  "description": "Preço em centavos."
                },
                "arrivalTime": {
                  "type": "string",
                  "description": "Horário local de chegada."
                },
                "arrivalDayOffset": {
                  "type": "integer",
                  "description": "0 = mesmo dia, 1 = dia seguinte."
                },
                "baggage": {
                  "type": "string",
                  "enum": [
                    "none",
                    "checked",
                    "checked+seat"
                  ]
                },
                "arrivesSameDay": {
                  "type": "boolean"
                },
                "hasCheckedBag": {
                  "type": "boolean"
                },
                "withinBudget": {
                  "type": "boolean",
                  "nullable": true
                }
              }
            }
          },
          "bestByConstraints": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "code": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "price": {
                "type": "integer",
                "description": "Preço em centavos."
              },
              "arrivalTime": {
                "type": "string",
                "description": "Horário local de chegada."
              },
              "arrivalDayOffset": {
                "type": "integer",
                "description": "0 = mesmo dia, 1 = dia seguinte."
              },
              "baggage": {
                "type": "string",
                "enum": [
                  "none",
                  "checked",
                  "checked+seat"
                ]
              },
              "arrivesSameDay": {
                "type": "boolean"
              },
              "hasCheckedBag": {
                "type": "boolean"
              },
              "withinBudget": {
                "type": "boolean",
                "nullable": true
              }
            }
          }
        }
      }
    },
    {
      "name": "add_to_booking",
      "description": "Adiciona uma tarifa de um voo a uma reserva. Requer token com escopo booking:write.",
      "transport": "imperative",
      "auth": "oauth2",
      "scopes": [
        "booking:write"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "flightNumber": {
            "type": "string"
          },
          "fareCode": {
            "type": "string"
          },
          "passengers": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9,
            "default": 1
          }
        },
        "required": [
          "flightNumber",
          "fareCode"
        ]
      }
    },
    {
      "name": "place_booking",
      "description": "Confirma a reserva e executa a cobrança dentro do limite de um mandato de pagamento. Requer token com escopos booking:write, payment:execute e mandate:create.",
      "transport": "imperative",
      "auth": "oauth2",
      "scopes": [
        "booking:write",
        "payment:execute"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingId": {
            "type": "string"
          },
          "mandateId": {
            "type": "string"
          },
          "passenger": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "document": {
                "type": "string",
                "description": "CPF, somente dígitos."
              }
            }
          },
          "payment": {
            "type": "object",
            "required": [
              "cardNumber",
              "expiry",
              "cvc"
            ],
            "properties": {
              "cardNumber": {
                "type": "string",
                "examples": [
                  "4111111111111111"
                ]
              },
              "expiry": {
                "type": "string",
                "examples": [
                  "12/30"
                ]
              },
              "cvc": {
                "type": "string"
              }
            }
          }
        },
        "required": [
          "bookingId",
          "passenger",
          "payment"
        ]
      }
    }
  ],
  "notes": "WebMCP ainda não tem um documento padrão de descoberta. Este manifesto é a convenção deste probe: descreve, de forma estática e verificável, as mesmas tools que document.modelContext expõe no navegador. Um scanner HTTP lê este arquivo; um verificador in-browser confirma a superfície viva em /webmcp.js."
}