{
  "openapi": "3.0.1",
  "info": {
    "title": "Real Estate MCP API - Villen Real Estate",
    "version": "1.1",
    "description": "Contexto MCP Imobiliário para pesquisa de imóveis e submissão de pedidos de contacto. - Villen Real Estate",
    "termsOfService": "https://www.villenrealestate.com/termos-e-condicoes",
    "contact": {
      "name": "Villen Real Estate",
      "url": "https://www.villenrealestate.com/",
      "email": "geral@villenrealestate.com"
    },
    "x-company-info": {
      "name": "Villen Real Estate",
      "ami": "19598",
      "address": "Rua Camilo Castelo Branco 336, Loja 1, 4785-293 Trofa"
    }
  },
  "servers": [
    {
      "url": "https://www.villenrealestate.com/",
      "description": "Identificador do servidor MCP"
    }
  ],
  "components": {
    "schemas": {
      "searchToMatchRequest": {
        "type": "object",
        "properties": {
          "businessType": {
            "type": "string",
            "description": "Define ou devolve o identificador do tipo de negócio do imóvel"
          },
          "countryName": {
            "type": "string",
            "description": "Nome do país utilizado como critério de filtragem. Este campo deve permanecer vazio quando o país não for identificado."
          },
          "stateName": {
            "type": "string",
            "description": "Nome da região (distrito) para o imóvel (é obrigatório na pesquisa se não mencionar concelho)."
          },
          "townName": {
            "type": "string",
            "description": "Nome do concelho para o imóvel (é obrigatório na pesquisa se não mencionar distrito)."
          },
          "neighborhoodName": {
            "type": "string",
            "description": "Nome ou ID da freguesia onde se localiza o imóvel."
          },
          "zoneName": {
            "type": "string",
            "description": "Identificador da zona geográfica para filtragem nas pesquisas."
          },
          "masterCategoryIds": {
            "type": "array",
            "description": "IDs de um ou mais grupos principais de categorias de imóvel (ex.: apartamentos, moradias, armazéns, terrenos, hotéis). É obrigatório indicar pelo menos um se não for indicado um tipo específico de imóvel."
          },
          "categoryIds": {
            "type": "array",
            "description": "IDs de uma ou mais categorias específicas de imóveis (ex: apartamento, moradia, armazém, terreno, hotel)."
          },
          "condition": {
            "type": "string",
            "description": "Estado de conservação."
          },
          "minPrice": {
            "type": "integer",
            "description": "Preço mínimo em euros. Preencher quando o utilizador indicar um orçamento mínimo ou limite inferior de preço.",
            "format": "int32"
          },
          "maxPrice": {
            "type": "integer",
            "description": "Preço máximo em euros. Preencher quando o utilizador indicar um orçamento máximo ou limite superior de preço.",
            "format": "int32"
          },
          "minBedrooms": {
            "type": "integer",
            "description": "Número mínimo de quartos para filtrar",
            "format": "int32"
          },
          "maxBedrooms": {
            "type": "integer",
            "description": "Número máximo de quartos para filtrar",
            "format": "int32"
          },
          "bathrooms": {
            "type": "integer",
            "description": "Número mínimo de casas de banho.",
            "format": "int32"
          },
          "listingReference": {
            "type": "string",
            "description": "Referência interna do imóvel usada para identificação."
          },
          "developmentName": {
            "type": "string",
            "description": "Nome do empreendimento."
          },
          "developmentFractions": {
            "type": "boolean",
            "description": "Indica se a pesquisa deve considerar fracções de empreendimentos (por exemplo, apartamentos ou lojas) em vez do empreendimento como um todo. Quando activo, os resultados incluem apenas fracções associadas a um empreendimento."
          },
          "developmentTags": {
            "type": "array",
            "description": "Etiquetas de empreendimentos utilizadas para filtrar a pesquisa."
          },
          "withVideos": {
            "type": "boolean",
            "description": "Procura apenas imóveis com vídeos disponíveis. Aplicar quando o utilizador mencionar expressões como 'com vídeo', 'com vídeos', 'tem vídeo', 'tem vídeos', 'vídeo do imóvel', 'ver vídeo online', etc."
          },
          "withBluePrints": {
            "type": "boolean",
            "description": "Procura apenas imóveis que tenham plantas (blueprints) disponíveis. Aplicar quando o utilizador mencionar 'com planta', 'tem planta', 'plantas da casa', 'mapa do imóvel', 'planta baixa', 'ver planta', etc."
          },
          "withVirtualVisits": {
            "type": "boolean",
            "description": "Procura apenas imóveis com visitas virtuais disponíveis. Aplicar quando o utilizador mencionar 'com visita virtual', 'tem visita virtual', 'tour virtual', 'tour 3D', 'visita 3D', 'tour interativo', 'passeio virtual', 'experiência virtual', 'visualização virtual', 'ver visita virtual online'."
          },
          "with360Photos": {
            "type": "boolean",
            "description": "Procura apenas imóveis com fotos 360º disponíveis. Aplicar quando o utilizador mencionar 'com fotos 360º', 'tem fotos 360º', 'com fotos panorâmicas', 'tem fotos panorâmicas', 'ver fotos 360º online', etc."
          },
          "featuresNames": {
            "type": "array",
            "description": "Características do imóvel, incluindo comodidades, serviços, locais de interesse próximos e tipos de vistas para fornecer uma descrição completa e detalhada da propriedade"
          },
          "page": {
            "type": "integer",
            "description": "Número da página a devolver nos resultados da pesquisa.",
            "format": "int32"
          }
        },
        "description": "Esquema que descreve os parâmetros de entrada para a pesquisa imobiliária."
      },
      "searchResponse": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "description": "Lista de resultados da página atual, baseada no número de registos por página.",
            "items": {
              "$ref": "#/components/schemas/DetailResponse"
            }
          },
          "count": {
            "type": "integer",
            "description": "Número total de resultados que correspondem aos critérios de pesquisa.",
            "format": "int32"
          },
          "page": {
            "type": "integer",
            "description": "Número da página atual de acordo com os critérios de pesquisa.",
            "format": "int32"
          },
          "totalpages": {
            "type": "integer",
            "description": "Número total de páginas correspondentes aos critérios de pesquisa.",
            "format": "int32"
          },
          "statetownnameequals": {
            "type": "boolean",
            "description": "Indica se o nome do distrito é igual ao nome do concelho."
          },
          "developmentname": {
            "type": "string",
            "description": "Nome do empreendimento; este campo só será preenchido se os resultados estiverem associados a um empreendimento específico com este nome."
          }
        },
        "description": "Esquema que descreve os parâmetros de saída da pesquisa imobiliária."
      },
      "detailRequest": {
        "type": "object",
        "properties": {
          "listingId": {
            "type": "integer",
            "description": "ID do imóvel para contacto.",
            "format": "int32"
          },
          "listingReference": {
            "type": "string",
            "description": "Referência interna do imóvel usada para identificação."
          },
          "developmentFractions": {
            "type": "boolean",
            "description": "Indica se a pesquisa deve considerar fracções de empreendimentos (por exemplo, apartamentos ou lojas) em vez do empreendimento como um todo. Quando activo, os resultados incluem apenas fracções associadas a um empreendimento."
          }
        },
        "description": "Esquema que descreve os parâmetros de entrada para o detalhe de imóvel."
      },
      "detailResponse": {
        "type": "object",
        "properties": {
          "listingId": {
            "type": "integer",
            "description": "ID único do anúncio do imóvel.",
            "format": "int32"
          },
          "propertyType": {
            "type": "string",
            "description": "Tipo de imóvel."
          },
          "condition": {
            "type": "string",
            "description": "Estado de conservação do imóvel."
          },
          "listingReference": {
            "type": "string",
            "description": "Referência do imóvel apresentada nos resultados de pesquisa."
          },
          "firstPhoto": {
            "type": "string",
            "description": "URL da miniatura da primeira foto do imóvel."
          },
          "description": {
            "type": "string",
            "description": "Descrição detalhada da propriedade."
          },
          "title": {
            "type": "string",
            "description": "Título do anúncio."
          },
          "price": {
            "type": "string",
            "description": "Preço em euros."
          },
          "imiValue": {
            "type": "string",
            "description": "Valor do IMI a pagar pelo imóvel, calculado com base no VPT e nas regras fiscais aplicáveis."
          },
          "business": {
            "type": "string",
            "description": "Tipo de negócio do imóvel."
          },
          "location": {
            "type": "string",
            "description": "Nome da localização."
          },
          "bedrooms": {
            "type": "integer",
            "description": "Número de quartos da propriedade.",
            "format": "int32"
          },
          "bathrooms": {
            "type": "integer",
            "description": "Número de casas de banho da propriedade.",
            "format": "int32"
          },
          "url": {
            "type": "string",
            "description": "URL público do anúncio."
          },
          "hasVideos": {
            "type": "boolean",
            "description": "Indica se o imóvel possui vídeos disponíveis."
          },
          "hasBluePrints": {
            "type": "boolean",
            "description": "Indica se o imóvel possui plantas ou blueprints disponíveis."
          },
          "has360Photos": {
            "type": "boolean",
            "description": "Indica se o imóvel tem fotos 360° disponíveis."
          },
          "hasVirtualVisits": {
            "type": "boolean",
            "description": "Indica se o imóvel tem visitas virtuais ou tours virtuais disponíveis."
          },
          "features": {
            "description": "Estas chaves representam a descrição das características específicas de um imóvel, incluindo atributos físicos e localizações relevantes como piscina, vista para o mar, proximidade a hospitais, escolas e outras facilidades importantes. Essas informações ajudam a detalhar e qualificar o imóvel para facilitar a busca e apresentação de resultados conforme as preferências do usuário.",
            "$ref": "#/components/schemas/Dictionary`2"
          }
        },
        "description": "Esquema que descreve os parâmetros de saída do detalhe de imóvel."
      },
      "leadRequest": {
        "type": "object",
        "properties": {
          "listingId": {
            "type": "integer",
            "description": "ID do imóvel para contacto.",
            "format": "int32"
          },
          "listingReference": {
            "type": "string",
            "description": "Referência interna do imóvel usada para identificação."
          },
          "name": {
            "type": "string",
            "description": "Nome do utilizador."
          },
          "email": {
            "type": "string",
            "description": "Endereço de email do utilizador (obrigatório se não fornecer telefone)."
          },
          "phone": {
            "type": "string",
            "description": "Número de telefone do utilizador (opcional se fornecer email)."
          },
          "phoneCountryCode": {
            "type": "string",
            "description": "Código do país do telefone incluindo o sinal de mais, por exemplo, \"+351\" para Portugal, \"+34\" para Espanha."
          },
          "message": {
            "type": "string",
            "description": "Mensagem personalizada do utilizador."
          }
        },
        "description": "Esquema que descreve os parâmetros de entrada para o envio de leads imobiliárias."
      },
      "leadResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "Estado do envio do formulário de contacto (ex.: sucesso, erro)."
          },
          "message": {
            "type": "string",
            "description": "Mensagem que descreve o resultado do envio do formulário de contacto."
          },
          "confirmedLead": {
            "type": "boolean",
            "description": ""
          }
        },
        "description": "Esquema que descreve os parâmetros de saída do envio de leads imobiliárias."
      },
      "companyInfoRequest": {
        "type": "object",
        "properties": {
          "companyId": {
            "type": "integer",
            "description": "Identificador da empresa/agência a consultar (opcional, usa o interno da empresa por omissão).",
            "format": "int32"
          }
        },
        "description": "Esquema de entrada para pedido de informação da empresa"
      },
      "companyInfoWithAgenciesResponse": {
        "type": "object",
        "properties": {
          "headquarters": {
            "description": "Informação dos dados de contacto da empresa relativa à sede.",
            "$ref": "#/components/schemas/CompanyInfoResponse"
          },
          "agencies": {
            "type": "array",
            "description": "Informação dos dados de contacto das agências da empresa.",
            "items": {
              "$ref": "#/components/schemas/CompanyInfoResponse"
            }
          }
        },
        "description": "Esquema de saída com os dados de informação da empresa"
      },
      "companyInfoResponse": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome da empresa"
          },
          "phone": {
            "type": "string",
            "description": "Telefone da empresa"
          },
          "mobile": {
            "type": "string",
            "description": "Telemóvel da empresa"
          },
          "email": {
            "type": "string",
            "description": "Email de contacto da empresa"
          },
          "address": {
            "type": "string",
            "description": "Morada da empresa (sem código postal)"
          },
          "district": {
            "type": "string",
            "description": "Distrito onde se localiza a empresa"
          },
          "municipality": {
            "type": "string",
            "description": "Concelho onde se localiza a empresa"
          },
          "parish": {
            "type": "string",
            "description": "Freguesia onde se localiza a empresa"
          },
          "zipCode": {
            "type": "string",
            "description": "Código postal da morada da empresa"
          },
          "businessHours": {
            "type": "string",
            "description": "Horário de funcionamento da empresa"
          },
          "googleMapsUrl": {
            "type": "string",
            "description": "Link direto para a localização da empresa no Google Maps"
          }
        },
        "description": "Esquema de saída com os dados de informação da empresa"
      },
      "rasorInfoRequest": {
        "type": "object",
        "properties": {
          "rasorName": {
            "type": "string",
            "description": "Nome do consultor imobiliário para o qual se pretende obter informação detalhada."
          },
          "stateName": {
            "type": "string",
            "description": "Permite pesquisar consultores por distrito."
          },
          "townName": {
            "type": "string",
            "description": "Permite pesquisar consultores por concelho."
          }
        },
        "description": "Esquema de entrada para solicitar informação detalhada sobre o consultor imobiliário"
      },
      "rasorInfoResponse": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome completo do consultor imobiliário."
          },
          "phone": {
            "type": "string",
            "description": "Número de telefone fixo do consultor imobiliário."
          },
          "mobile": {
            "type": "string",
            "description": "Número de telemóvel do consultor imobiliário."
          },
          "observations": {
            "type": "string",
            "description": "Observações adicionais relacionadas com o consultor."
          },
          "email": {
            "type": "string",
            "description": "Endereço de email do consultor imobiliário."
          },
          "address": {
            "type": "string",
            "description": "Morada completa do consultor imobiliário ou escritório."
          },
          "city": {
            "type": "string",
            "description": "Concelho onde o consultor exerce atividade."
          },
          "parish": {
            "type": "string",
            "description": "Freguesia onde o consultor exerce atividade."
          },
          "spokenLanguages": {
            "type": "array",
            "description": "Lista de idiomas falados pelo consultor."
          },
          "socialProfiles": {
            "type": "array",
            "description": "Lista de links para perfis ou páginas sociais do consultor.",
            "items": {
              "$ref": "#/components/schemas/SocialProfile"
            }
          },
          "avatar": {
            "type": "string",
            "description": "Imagem do avatar associado ao consultor."
          },
          "listingUrl": {
            "type": "string",
            "description": "URL da página que apresenta todos os imóveis atribuídos ou relacionados com o consultor, permitindo o acesso direto à listagem completa dos respetivos imóveis."
          },
          "detailUrl": {
            "type": "string",
            "description": "Página que apresenta a informação completa do agente, incluindo dados de contacto, perfil profissional e imóveis associados."
          }
        },
        "description": "Esquema de saída com informação detalhada sobre o consultor imobiliário"
      },
      "imiRequest": {
        "type": "object",
        "properties": {
          "townName": {
            "type": "string",
            "description": "Nome do concelho onde o imóvel se encontra localizado. Este campo é obrigatório para a identificação geográfica e determinação da taxa de IMI. Exemplo: \"Lisboa\", \"Porto\", \"Sintra\", \"Albufeira\"."
          },
          "taxableValue": {
            "type": "number",
            "description": "Valor Patrimonial Tributário (VPT) do imóvel, conforme registado na Autoridade Tributária. Trata-se do valor fiscal oficial utilizado como base para o cálculo do IMI (Imposto Municipal sobre Imóveis). Deve ser um valor decimal positivo, expresso em euros. Exemplo: \"185000.00\".",
            "format": "decimal"
          },
          "dependentsNumber": {
            "type": "integer",
            "description": "Número de dependentes no agregado familiar do contribuinte para o ano fiscal de referência. Consideram-se dependentes as crianças, ascendentes idosos ou outros dependentes legalmente reconhecidos que possam gerar benefícios de redução ou isenção de IMI. Valores válidos: inteiro ≥ 0. Exemplo: \"2\".",
            "format": "int32"
          },
          "isUrban": {
            "type": "boolean",
            "description": "Indica se o imóvel está classificado como urbano ou rústico. Os imóveis urbanos estão sujeitos a IMI, enquanto os imóveis rústicos podem estar sujeitos a regras de tributação distintas. Exemplo: true/false."
          }
        },
        "description": "Esquema de dados de entrada utilizado para solicitar o cálculo do Imposto Municipal sobre Imóveis (IMI) de um imóvel."
      },
      "imiResponse": {
        "type": "object",
        "properties": {
          "townName": {
            "type": "string",
            "description": "Nome do concelho considerado para o cálculo do IMI"
          },
          "taxableValue": {
            "type": "string",
            "description": "Valor Patrimonial Tributário (VPT) considerado para o cálculo do IMI, expresso em euros"
          },
          "dependentsNumber": {
            "type": "string",
            "description": "Número de dependentes contabilizados para efeitos de benefícios aplicados no cálculo do IMI"
          },
          "isUrban": {
            "type": "string",
            "description": "Indicação se o imóvel é urbano ou rústico, considerado para o cálculo do IMI"
          },
          "imiValue": {
            "type": "string",
            "description": "Valor final do IMI (Imposto Municipal sobre Imóveis) calculado com base nos dados fornecidos."
          },
          "imiTaxValue": {
            "type": "string",
            "description": "Taxa usada para cálculo do valor de IMI."
          },
          "dependentDiscount": {
            "type": "string",
            "description": "Valor de desconto baseado no número de dependentes."
          },
          "dataYear": {
            "type": "integer",
            "description": "Ano de referência das taxas utilizadas no cálculo do IMI.",
            "format": "int32"
          }
        },
        "description": "Esquema de dados de saída que fornece o resultado do cálculo do IMI, incluindo informações detalhadas sobre o valor a pagar."
      },
      "servicesInfoRequest": {
        "type": "object",
        "properties": {
          "companyId": {
            "type": "integer",
            "description": "Identificador da empresa/agência a consultar (opcional, usa o interno da empresa por omissão).",
            "format": "int32"
          }
        },
        "description": "Resumo dos serviços disponíveis, incluindo a sua finalidade e aplicação para os clientes."
      },
      "servicesInfoResponse": {
        "type": "object",
        "properties": {
          "companyId": {
            "type": "integer",
            "description": "Identificador único da empresa associada ao catálogo de serviços.",
            "format": "int32"
          },
          "companyName": {
            "type": "string",
            "description": "Nome da empresa que disponibiliza o catálogo de serviços."
          },
          "categories": {
            "type": "array",
            "description": "Lista de categorias de serviços disponíveis, organizadas por perfil de cliente.",
            "items": {
              "$ref": "#/components/schemas/ServiceCategory"
            }
          }
        },
        "description": "Resumo dos serviços prestados ao cliente, incluindo detalhes, âmbito e aplicação."
      }
    }
  },
  "paths": {
    "/mcp/search": {
      "get": {
        "summary": "Pesquisar anúncios imobiliários usando filtros como localização, preço, tipo e condição.",
        "description": "Pesquisar anúncios imobiliários usando filtros como localização, preço, tipo e condição.",
        "operationId": "mcpSearch",
        "parameters": [
          {
            "name": "BusinessType",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Define ou devolve o identificador do tipo de negócio do imóvel (Arrendamento, Trespasse, Venda). Caso não seja indicado na pesquisa, será utilizado Venda por defeito"
          },
          {
            "name": "CountryName",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Nome do país utilizado como critério de filtragem. Este campo deve permanecer vazio quando o país não for identificado., (é obrigatório)"
          },
          {
            "name": "StateName",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Nome da região (distrito) para o imóvel (é obrigatório na pesquisa se não mencionar concelho)., (é obrigatório)"
          },
          {
            "name": "TownName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nome do concelho para o imóvel (é obrigatório na pesquisa se não mencionar distrito)."
          },
          {
            "name": "NeighborhoodName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nome ou ID da freguesia onde se localiza o imóvel."
          },
          {
            "name": "ZoneName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Identificador da zona geográfica para filtragem nas pesquisas."
          },
          {
            "name": "MasterCategoryIds",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "IDs de um ou mais grupos principais de categorias de imóvel (ex.: apartamentos, moradias, armazéns, terrenos, hotéis). É obrigatório indicar pelo menos um se não for indicado um tipo específico de imóvel."
          },
          {
            "name": "CategoryIds",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "IDs de uma ou mais categorias específicas de imóveis (ex: apartamento, moradia, armazém, terreno, hotel)."
          },
          {
            "name": "Condition",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Estado de conservação. (Com Programa de Incentivos à Reabilitação, Em construção, Em projecto, Não Aplicável, Novo, Para Demolir ou Reconstruir, Para Venda, Por recuperar, Recuperado, Renovado, Reservado, Usado)"
          },
          {
            "name": "MinPrice",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Preço mínimo em euros. Preencher quando o utilizador indicar um orçamento mínimo ou limite inferior de preço."
          },
          {
            "name": "MaxPrice",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Preço máximo em euros. Preencher quando o utilizador indicar um orçamento máximo ou limite superior de preço."
          },
          {
            "name": "MinBedrooms",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Número mínimo de quartos para filtrar"
          },
          {
            "name": "MaxBedrooms",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Número máximo de quartos para filtrar"
          },
          {
            "name": "Bathrooms",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Número mínimo de casas de banho."
          },
          {
            "name": "ListingReference",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Referência interna do imóvel usada para identificação."
          },
          {
            "name": "DevelopmentName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nome do empreendimento."
          },
          {
            "name": "DevelopmentFractions",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Indica se a pesquisa deve considerar fracções de empreendimentos (por exemplo, apartamentos ou lojas) em vez do empreendimento como um todo. Quando activo, os resultados incluem apenas fracções associadas a um empreendimento."
          },
          {
            "name": "DevelopmentTags",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Etiquetas de empreendimentos utilizadas para filtrar a pesquisa. ()"
          },
          {
            "name": "WithVideos",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Procura apenas imóveis com vídeos disponíveis. Aplicar quando o utilizador mencionar expressões como 'com vídeo', 'com vídeos', 'tem vídeo', 'tem vídeos', 'vídeo do imóvel', 'ver vídeo online', etc."
          },
          {
            "name": "WithBluePrints",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Procura apenas imóveis que tenham plantas (blueprints) disponíveis. Aplicar quando o utilizador mencionar 'com planta', 'tem planta', 'plantas da casa', 'mapa do imóvel', 'planta baixa', 'ver planta', etc."
          },
          {
            "name": "WithVirtualVisits",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Procura apenas imóveis com visitas virtuais disponíveis. Aplicar quando o utilizador mencionar 'com visita virtual', 'tem visita virtual', 'tour virtual', 'tour 3D', 'visita 3D', 'tour interativo', 'passeio virtual', 'experiência virtual', 'visualização virtual', 'ver visita virtual online'."
          },
          {
            "name": "With360Photos",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Procura apenas imóveis com fotos 360º disponíveis. Aplicar quando o utilizador mencionar 'com fotos 360º', 'tem fotos 360º', 'com fotos panorâmicas', 'tem fotos panorâmicas', 'ver fotos 360º online', etc."
          },
          {
            "name": "FeaturesNames",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Características do imóvel, incluindo comodidades, serviços, locais de interesse próximos e tipos de vistas para fornecer uma descrição completa e detalhada da propriedade (Aquecimento Central, Ar Condicionado, Aspiração Central, Auto-estrada, Casa de banho de serviço, Centro da Cidade, Cidade, Closet, Copa, Cozinha, Despensa, Edifício, Elevador, Escola, Espaços Verdes, Estacionamento, Exaustor, Farmácia, Fogão, Forno, Frigorífico, Garagem, Gás canalizado, Hipermercado, Isolamento acústico, Lavandaria, Máquina de lavar louça, Microondas, Persianas elétricas, Placa de indução, Polícia, Posto de Combustível, Recuperador de calor, Sala de estar, Suite, Transportes Públicos, Video Porteiro)"
          },
          {
            "name": "Page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Número da página a devolver nos resultados da pesquisa."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/detail": {
      "get": {
        "summary": "Devolve informação detalhada sobre um imóvel.",
        "description": "Devolve informação detalhada sobre um imóvel.",
        "operationId": "mcpDetail",
        "parameters": [
          {
            "name": "ListingId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "ID do imóvel para contacto."
          },
          {
            "name": "ListingReference",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Referência interna do imóvel usada para identificação."
          },
          {
            "name": "DevelopmentFractions",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Indica se a pesquisa deve considerar fracções de empreendimentos (por exemplo, apartamentos ou lojas) em vez do empreendimento como um todo. Quando activo, os resultados incluem apenas fracções associadas a um empreendimento."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DetailResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/lead": {
      "get": {
        "summary": "Submeter um formulário de contacto para um anúncio específico.",
        "description": "Submeter um formulário de contacto para um anúncio específico.",
        "operationId": "mcpLead",
        "parameters": [
          {
            "name": "ListingId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "ID do imóvel para contacto."
          },
          {
            "name": "ListingReference",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Referência interna do imóvel usada para identificação."
          },
          {
            "name": "Name",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Nome do utilizador., (é obrigatório)"
          },
          {
            "name": "Email",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Endereço de email do utilizador (obrigatório se não fornecer telefone)., (é obrigatório)"
          },
          {
            "name": "Phone",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Número de telefone do utilizador (opcional se fornecer email)."
          },
          {
            "name": "PhoneCountryCode",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Código do país do telefone incluindo o sinal de mais, por exemplo, \"+351\" para Portugal, \"+34\" para Espanha."
          },
          {
            "name": "Message",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Mensagem personalizada do utilizador."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/companyinfo": {
      "get": {
        "summary": "Permite obter os dados de contacto da empresa, incluindo o nome da agência, morada, telefone e email. Ideal para apresentar informações institucionais ou permitir que o utilizador entre em contacto com a agência.",
        "description": "Permite obter os dados de contacto da empresa, incluindo o nome da agência, morada, telefone e email. Ideal para apresentar informações institucionais ou permitir que o utilizador entre em contacto com a agência.",
        "operationId": "mcpCompanyInfo",
        "parameters": [
          {
            "name": "CompanyId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Identificador da empresa/agência a consultar (opcional, usa o interno da empresa por omissão)."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanyInfoWithAgenciesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/rasorinfo": {
      "get": {
        "summary": "Permite obter os dados de contacto do consultor imobiliário, incluindo nome, telefone, email e morada. Ideal para apresentar informação de contacto do consultor ou permitir que o utilizador entre em contacto com ele.",
        "description": "Permite obter os dados de contacto do consultor imobiliário, incluindo nome, telefone, email e morada. Ideal para apresentar informação de contacto do consultor ou permitir que o utilizador entre em contacto com ele.",
        "operationId": "mcpRasorInfo",
        "parameters": [
          {
            "name": "RasorName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nome do consultor imobiliário para o qual se pretende obter informação detalhada."
          },
          {
            "name": "StateName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Permite pesquisar consultores por distrito."
          },
          {
            "name": "TownName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Permite pesquisar consultores por concelho."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RasorInfoResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/imicalculator": {
      "get": {
        "summary": "Permite determinar o valor do Imposto Municipal sobre Imóveis (IMI) com base nos dados fornecidos pelo utilizador. Este serviço valida o concelho indicado, identifica o respetivo coeficiente aplicável, processa o Valor Patrimonial Tributário (VPT), número de dependentes e a natureza do imóvel (urbano ou rústico), devolvendo o valor final de IMI a pagar de acordo com as regras fiscais em vigor em Portugal.",
        "description": "Permite determinar o valor do Imposto Municipal sobre Imóveis (IMI) com base nos dados fornecidos pelo utilizador. Este serviço valida o concelho indicado, identifica o respetivo coeficiente aplicável, processa o Valor Patrimonial Tributário (VPT), número de dependentes e a natureza do imóvel (urbano ou rústico), devolvendo o valor final de IMI a pagar de acordo com as regras fiscais em vigor em Portugal.",
        "operationId": "mcpImiCalculator",
        "parameters": [
          {
            "name": "TownName",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nome do concelho onde o imóvel se encontra localizado. Este campo é obrigatório para a identificação geográfica e determinação da taxa de IMI. Exemplo: \"Lisboa\", \"Porto\", \"Sintra\", \"Albufeira\"."
          },
          {
            "name": "TaxableValue",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "format": "decimal"
            },
            "description": "Valor Patrimonial Tributário (VPT) do imóvel, conforme registado na Autoridade Tributária. Trata-se do valor fiscal oficial utilizado como base para o cálculo do IMI (Imposto Municipal sobre Imóveis). Deve ser um valor decimal positivo, expresso em euros. Exemplo: \"185000.00\"."
          },
          {
            "name": "DependentsNumber",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Número de dependentes no agregado familiar do contribuinte para o ano fiscal de referência. Consideram-se dependentes as crianças, ascendentes idosos ou outros dependentes legalmente reconhecidos que possam gerar benefícios de redução ou isenção de IMI. Valores válidos: inteiro ≥ 0. Exemplo: \"2\"."
          },
          {
            "name": "IsUrban",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Indica se o imóvel está classificado como urbano ou rústico. Os imóveis urbanos estão sujeitos a IMI, enquanto os imóveis rústicos podem estar sujeitos a regras de tributação distintas. Exemplo: true/false."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IMIResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/servicesinfo": {
      "get": {
        "summary": "Descrição do endpoint que fornece informações completas sobre os serviços disponíveis para um perfil de cliente.",
        "description": "Descrição do endpoint que fornece informações completas sobre os serviços disponíveis para um perfil de cliente.",
        "operationId": "mcpServicesInfo",
        "parameters": [
          {
            "name": "CompanyId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Identificador da empresa/agência a consultar (opcional, usa o interno da empresa por omissão)."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicesInfoResponse"
                }
              }
            }
          }
        }
      }
    }
  }
}