{
  "openapi": "3.0.1",
  "info": {
    "title": "Real Estate MCP API - Q. M. I. - Sociedade de Mediação Imobiliária Lda",
    "version": "1.1",
    "description": "Contexto MCP Imobiliário para pesquisa de imóveis e submissão de pedidos de contacto. - Q. M. I. - Sociedade de Mediação Imobiliária Lda",
    "termsOfService": "https://www.qmi.pt/termos-e-condicoes",
    "contact": {
      "name": "Q. M. I. - Sociedade de Mediação Imobiliária Lda",
      "url": "https://www.qmi.pt/",
      "email": "qmi@qmi.pt"
    },
    "x-company-info": {
      "name": "Q. M. I. - Sociedade de Mediação Imobiliária Lda",
      "ami": "1344 ",
      "address": ""
    }
  },
  "servers": [
    {
      "url": "https://www.qmi.pt/",
      "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, 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 (Auto-estrada, Casa de banho de serviço, Centro da Cidade, Edifício, Elevador, Escola, Espaços Verdes, Farmácia, Garagem, Hipermercado, Polícia, Sala de estar, Transportes Públicos)"
          },
          {
            "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"
                }
              }
            }
          }
        }
      }
    }
  }
}