Google Hotels MCP Server
Pesquisa do Google Hotels para uma estadia: tarifas, avaliações, comodidades e o que cada site de reserva cobra, como JSON estruturado.
Documentação
Google Hotels MCP Server
Um servidor de Model Context Protocol (MCP) hospedado que oferece ao Claude, Cursor, Windsurf e qualquer outro cliente MCP uma ferramenta do Google Hotels. Pesquise hotéis e aluguéis de temporada para um destino e um par de datas e, em seguida, abra qualquer propriedade por completo com a tarifa que cada site de reserva está cobrando, avaliações, um detalhamento de avaliações por tópico, comodidades, fotos e coordenadas, tudo como JSON estruturado, sem conta Google e sem cota da Places API.
1.000 créditos grátis todos os meses, sem necessidade de cartão, o que equivale a cerca de 100 pesquisas de hotéis.
https://mcp.hasdata.com/api/mcp?apis=google_travel_hotels
Conteúdo
- O que você precisa
- Início rápido
- Exemplos de prompts
- Ferramentas
- Erros e caminhos de falha
- Preços, plano gratuito e limites
- Seleção de ferramentas
- Como se compara
- FAQ
- Links HasData
- Desenvolvimento
- Contribuição
- Licença
O que você precisa
Um cliente MCP e uma chave de API HasData do painel de controle, gratuita para criar sem cartão, e o plano gratuito cobre cerca de 100 chamadas por mês na tarifa de 10 créditos. Este é um servidor remoto, então o caminho mais simples é uma URL e um cabeçalho x-api-key, sem contêiner para executar e sem projeto Google Cloud em nenhum lugar do fluxo. Um cliente que só fala stdio o acessa por meio de um lançador leve, publicado como @hasdata/google-hotels-mcp no npm e hasdata-google-hotels-mcp no PyPI, mostrado abaixo.
Início rápido
A URL do servidor é a mesma para todos os clientes. Nós o executamos na prática no Claude Code e no Claude Desktop. Os outros blocos seguem o formato documentado de cada cliente para um servidor remoto.
| Campo | Valor |
|---|---|
| URL | https://mcp.hasdata.com/api/mcp?apis=google_travel_hotels |
| Transporte | HTTP, transmissível |
| Cabeçalho de autenticação | x-api-key: HASDATA_API_KEY |
Clientes com suporte a OAuth podem adicionar a mesma URL como um conector e entrar sem colocar uma chave em um arquivo de configuração.
Claude Code
claude mcp add --transport http google-hotels "https://mcp.hasdata.com/api/mcp?apis=google_travel_hotels" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Configurações, depois Conectores, depois Adicionar conector personalizado e cole https://mcp.hasdata.com/api/mcp?apis=google_travel_hotels e entre.
Para o caminho do arquivo de configuração, o Claude Desktop carrega apenas servidores locais (stdio), então ele acessa um servidor remoto por meio de um lançador stdio. O pacote @hasdata/google-hotels-mcp é esse lançador, e ele lê a chave do ambiente. Adicione isto a claude_desktop_config.json:
{
"mcpServers": {
"google-hotels": {
"command": "npx",
"args": ["-y", "@hasdata/google-hotels-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Para Python em vez de Node, troque o lançador pelo pacote PyPI, que uvx executa sem instalação manual:
{
"mcpServers": {
"google-hotels": {
"command": "uvx",
"args": ["hasdata-google-hotels-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json para cada projeto, ou .cursor/mcp.json para um único:
{
"mcpServers": {
"google-hotels": {
"url": "https://mcp.hasdata.com/api/mcp?apis=google_travel_hotels",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json. O Windsurf chama o campo serverUrl, não url:
{
"mcpServers": {
"google-hotels": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=google_travel_hotels",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
.vscode/mcp.json no espaço de trabalho:
{
"servers": {
"google-hotels": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=google_travel_hotels",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Exemplos de prompts
Prompts, não código. Cole um e o agente escolhe a ferramenta por conta própria. Cada um é anotado com as chamadas que faz, porque cada chamada bem-sucedida custa 10 créditos.
Encontre hotéis em Barcelona para as noites de 12 a 15 de novembro, dois adultos, e liste os cinco mais baratos com tarifa por noite, avaliação e classe.
Uma chamada, 10 créditos. Tarifas, avaliações e comodidades vêm todas juntas.
Mesma estadia, quatro estrelas ou mais, somente cancelamento gratuito, ordenado por avaliação.
Uma chamada, 10 créditos. Classe, cancelamento e ordem de classificação são filtros em uma única solicitação.
Pegue o melhor resultado e mostre o que cada site de reserva cobra por ele, e se é um bom preço.
Duas chamadas, 20 créditos. A pesquisa devolve um propertyToken por propriedade, e passá-lo abre essa propriedade com todas as fontes que o Google compara, uma faixa de preço típica e o próprio veredito do Google sobre o negócio.
Aluguéis de temporada em Lisboa naquela semana com pelo menos dois quartos e piscina.
Uma chamada, 10 créditos, com vacationRentals ativado, bedrooms em 2 e a piscina em amenity__.
Nomeie o destino da mesma forma que você o diria em voz alta. Um Barcelona simples é lido em relação a onde o Google acredita que a pesquisa está sendo executada, então um servidor na Califórnia responde com hotéis californianos. Escreva hotels in Barcelona ou defina gl como es, e a cidade fica fixada.
Ferramentas
| Ferramenta | O que retorna |
|---|---|
hasdata_google_travel_hotels_getGoogleHotels | Propriedades com tarifa por noite e total, classe, avaliação, contagens de avaliações e um detalhamento por tópico, comodidades, imagens, coordenadas e transporte próximo, junto com paginação e a árvore de marcas. Dado um propertyToken, retorna aquela propriedade com a tarifa em cada fonte que o Google compara, endereço, telefone e uma faixa de preço típica. 10 créditos por chamada |
Uma ferramenta, somente leitura, cobrindo ambas as metades do site. Sem um propertyToken, ela pesquisa. Com um, ela abre uma única propriedade.
As amostras abaixo são extraídas de chamadas reais, e as tarifas de hotéis mudam diariamente. Leia-as como uma forma.
Uma amostra é o payload, não a resposta inteira. Um resultado de tools/call carrega um bloco de texto, e esse texto é em si JSON contendo url, status, text e json, com os dados extraídos sob json. De uma resposta JSON-RPC bruta, o caminho é result.content[0].text, analisado, depois .json. Um cliente de chat desembrulha isso para você, e código que fala diretamente com o endpoint não.
Pesquisar hotéis e aluguéis de temporada
hasdata_google_travel_hotels_getGoogleHotels
Propriedades para um destino e uma estadia, com tarifas, avaliações, comodidades e imagens.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
q | string | sim | Destino, bairro ou nome do hotel. Formule como hotels in Barcelona em vez de Barcelona, ou fixe o país com gl |
checkInDate | string | sim | YYYY-MM-DD |
checkOutDate | string | sim | YYYY-MM-DD |
adults / children | número | Composição de hóspedes, 1 a 6 adultos e até 5 crianças, 6 hóspedes no total | |
childrenAges | string | Idades separadas por vírgula, uma por criança, como 5,8 | |
sortBy | string | lowestPrice, highestRating ou mostReviewed. Ordem do próprio Google quando ausente | |
minPrice / maxPrice | número | Por noite, na moeda selecionada | |
rating | string | threePointFivePlus, fourPlus ou fourPointFivePlus | |
hotelClass | string | Classes de estrelas a manter, separadas por vírgula, como 4,5 | |
propertyType__ | array | Tipos de propriedade como hotelResort, prefixados com hotel* para hotéis e vacation* para aluguéis | |
amenity__ | array | Comodidades como hotelFreeWifi ou hotelPool, mesma regra de prefixo | |
brands | string | IDs de marcas a manter. A resposta da pesquisa carrega toda a árvore de marcas com seus IDs | |
freeCancellation / specialOffers / ecoCertified | booleano | Restringir a propriedades que carregam esse sinalizador | |
vacationRentals | booleano | Pesquisar aluguéis em vez de hotéis | |
bedrooms / bathrooms | número | Mínimos, somente aluguéis | |
currency / gl / hl | string | Moeda, e o país e o idioma da pesquisa | |
nextPageToken | string | Próxima página, retirada de pagination | |
propertyToken | string | Alterna a chamada de uma pesquisa para uma propriedade completa |
Os resultados chegam sob properties, aproximadamente vinte por página. Cada propriedade carrega name, type, description, link, gpsCoordinates, ratePerNight e totalRate (cada um com a string bruta e um número extracted*), hotelClass com extractedHotelClass, overallRating, reviews, locationRating, um histograma ratings, reviewsBreakdown com menções positivas e negativas por tópico, amenities, images e nearbyPlaces com tempos de caminhada e transporte. searchInformation.totalResults informa quantos o Google tem, pagination carrega nextPageToken, e brands lista a árvore de marcas com os IDs que o filtro brands aceita.
As tarifas são citadas de duas formas.
lowestinclui impostos e taxas,beforeTaxesFeesnão inclui, e uma propriedade pode carregar apenas uma delas. Compare coisas semelhantes antes de classificar.
{
"name": "Casa Gràcia",
"propertyToken": "ChcI0r6-2uyF7rIuGgsvZy8xdmo2bnNxZhAB",
"type": "hotel",
"description": "Cozy quarters in a hip lodging with dining & a lively bar, plus a kitchen, a library & free Wi-Fi.",
"link": "https://room00hostel.com/barcelona/casa-gracia-hostel/",
"gpsCoordinates": { "latitude": 41.3974523, "longitude": 2.1593339 },
"ratePerNight": { "beforeTaxesFees": "US$61", "extractedBeforeTaxesFees": 61 },
"totalRate": { "beforeTaxesFees": "US$182", "extractedBeforeTaxesFees": 182 },
"hotelClass": "4-star hotel",
"extractedHotelClass": 4,
"overallRating": 3.9,
"reviews": 3811,
"locationRating": "4.6",
"amenities": ["Breakfast", "Air conditioning", "Airport shuttle", "Kid-friendly"],
"nearbyPlaces": [
{ "name": "La Pedrera - Casa Milà", "transportations": [{ "type": "Walking", "duration": "5 min" }] }
]
}
Uma propriedade completa
Passe propertyToken de qualquer resultado de pesquisa de volta para a mesma ferramenta, mantendo as datas, e a resposta é aquela propriedade sozinha. Além dos campos de pesquisa, ela adiciona prices, a tarifa em cada fonte que o Google compara, featuredPrices para as patrocinadas, typicalPriceRange para a estadia, deal e dealDescription quando o Google marca o preço como bom, address, phone, directions, amenitiesDetailed agrupados por categoria, excludedAmenities e otherReviews do Tripadvisor e do restante.
{
"prices": [
{
"source": "Booking.com",
"numGuests": 2,
"ratePerNight": { "lowest": "$61", "beforeTaxesFees": "$39", "extractedLowest": 61 }
}
],
"typicalPriceRange": { "lowest": "$51", "highest": "$68", "extractedLowest": 51, "extractedHighest": 68 },
"deal": "34% less than usual",
"dealDescription": "Great Deal",
"address": "Pg. de Gràcia, 116Bis, Gràcia, 08008 Barcelona, Spain",
"phone": "+34 931 74 05 28"
}
Erros e caminhos de falha
Seu cliente quase nunca vê um código de erro HTTP de uma chamada de ferramenta. A camada MCP responde 200 e coloca a falha dentro do resultado, com isError definido como true e o motivo como texto. O agente lê uma mensagem onde você poderia esperar uma linha de status.
Uma chave errada aparece como saída da ferramenta, não como uma conexão falha. tools/list aceita qualquer chave não vazia e retorna a ferramenta, então o cliente completa o handshake e mostra verde. A primeira chamada de ferramenta então volta com isError: true e o texto HasData API error: 401 Unauthorized. Fique atento a essa string, porque nada antes no fluxo relata o problema.
Uma chave ausente é o único erro HTTP real. A autorização é executada antes de qualquer ferramenta, e a própria conexão falha com 401. Os cabeçalhos CORS estão presentes, e um cliente de navegador lê o status e não uma falha de rede opaca.
Uma data ausente é rejeitada antes de se tornar uma pesquisa. Remova checkOutDate e a chamada falha na validação com 422, nomeando o campo.
A falha perigosa é silenciosa e geográfica. Um destino que o Google não consegue localizar, e um nome de cidade simples lido do país errado, ambos retornam 200 com uma página cheia de propriedades em outro lugar completamente. Pesquisamos Qwertyville e obtivemos dezoito hotéis reais perto do datacenter de onde a solicitação partiu. Verifique gpsCoordinates no primeiro resultado, ou passe gl, antes de confiar em uma lista.
Datas que não fazem sentido são silenciosamente corrigidas em vez de recusadas. Um check-out antes do check-in, ou uma estadia em 2020, ainda responde 200 com propriedades, porque o Google normaliza o intervalo em vez de gerar erro. Valide as datas do seu lado se elas vierem de um modelo.
Resultados que carregam dados também carregam um requestMetadata.id que vale citar no suporte.
Preços, plano gratuito e limites
Cada chamada do Google Hotels custa 10 créditos por chamada bem-sucedida. O tamanho da resposta não muda o preço, e abrir uma propriedade custa o mesmo que uma pesquisa.
O plano gratuito é 1.000 créditos todos os meses sem cartão, o que equivale a cerca de 100 pesquisas. Ele renova com o ciclo de faturamento, então um agente de baixo volume funciona no plano gratuito indefinidamente. Planos pagos começam em US$ 59 por mês para 200.000 créditos, o que equivale a 20.000 buscas, ou US$ 2,95 por 1.000 buscas. O preço unitário cai com o volume para US$ 0,83 por 1.000 no maior plano, e a cobrança anual equivale a dez meses da tarifa mensal por doze. Os valores atuais estão na página de preços.
Seu plano também define a concorrência: 1 requisição por vez no nível gratuito, 5 no Startup, 15 no Basic e de 50 a 500 nos níveis Growth. Trate o caso de estouro de forma defensiva em qualquer processo não supervisionado.
Uma requisição que retorna status diferente de 200 não é cobrada. Abrir uma propriedade após uma busca é uma segunda chamada, então inclua isso no orçamento.
Seleção de ferramentas
O parâmetro de consulta apis decide quais ferramentas seu agente enxerga. Menos ferramentas significa menos contexto gasto com definições de ferramentas e menos chances de o modelo escolher a errada.
?apis=google_travel_hotels the one tool in this repo
?apis=google_travel add Google Flights
?apis=google_travel_hotels,airbnb hotels plus Airbnb stays
?apis=google_travel_hotels,booking hotels plus Booking.com
O parâmetro aceita nomes de provedores como google_travel e nomes de APIs individuais como google_travel_hotels. Nomes com erro de digitação são ignorados. Se todos os nomes estiverem errados, a requisição falha com erro 400, e o corpo da resposta lista tanto o que não foi reconhecido quanto todos os valores válidos. Remova o parâmetro e o mesmo endpoint expõe todas as ferramentas do HasData.
Como se compara
O Google nunca abriu uma API pública de Hotéis. O Hotel Center é para proprietários de imóveis enviarem tarifas, e a API Places retorna um registro comercial com fotos e avaliações, mas sem tarifa para um intervalo de datas. As alternativas são APIs de afiliados de sites de reserva individuais, cada uma cobrindo seu próprio inventário e cada uma atrás de aprovação.
| Google Places API | Este servidor | |
|---|---|---|
| Tarifas para uma estadia | Não oferecido | Diária e total, por propriedade |
| O que outros sites cobram | Não oferecido | prices com a fonte e sua tarifa |
| Avaliações | Cinco trechos de avaliação | Contagens, histograma de estrelas e detalhamento por tópico |
| Aluguéis de temporada | Não cobertos | A mesma ferramenta com um sinalizador |
| Configuração | Projeto no Google Cloud, cobrança, cota | Uma chave e uma URL |
| Custo | Por requisição, após o limite gratuito | Pago após o nível gratuito, 10 créditos por chamada |
O que este servidor não faz. Não faz reservas e não processa pagamentos. Ele lê tarifas, disponibilidade para as datas que você consulta e os links que o próprio Google aponta, e devolve a etapa de reserva para você.
FAQ
Existe uma API oficial do Google Hotels?
Não. O Google opera o Hotel Center para hoteleiros publicarem suas próprias tarifas, e a API Places para registros comerciais, e nenhuma delas retorna quanto custa uma estadia. Este servidor lê os resultados públicos e os retorna como JSON estruturado.
O que é um servidor MCP do Google Hotels?
Um servidor que expõe o Google Hotels como uma ferramenta que um cliente de IA pode chamar. O cliente envia uma chamada de ferramenta pelo Model Context Protocol, o servidor busca as propriedades e retorna JSON estruturado, e o modelo trabalha com o resultado. Este expõe uma única ferramenta e roda remotamente.
Por que minha busca retornou hotéis em outro país?
Porque um nome de lugar simples é resolvido com base na própria ideia do Google sobre onde a busca está sendo executada, que é o datacenter de onde a requisição parte. Escreva hotels in Barcelona em vez de Barcelona, ou defina gl para o código do país, e o destino permanece.
Como vejo o que cada site de reserva cobra?
Busque primeiro, depois chame a ferramenta novamente com o propertyToken da propriedade que você quer. A resposta traz prices com uma entrada por fonte, typicalPriceRange para a estadia e o veredito deal do Google quando a tarifa está excepcionalmente baixa.
Posso buscar aluguéis de temporada?
Sim. Ative vacationRentals e a mesma ferramenta busca aluguéis, onde bedrooms e bathrooms se tornam filtros úteis.
Posso usar isso junto com outras APIs do HasData?
Sim. O parâmetro apis aceita uma lista, e ?apis=google_travel adiciona o Google Flights junto com hotéis. Remova o parâmetro e você recebe tudo.
Conformidade e dados pessoais
A HasData acessa apenas dados publicamente disponíveis. Os termos de uma plataforma podem restringir acesso automatizado, e você é responsável pela sua própria conformidade.
Links da HasData
| Página do produto e construtor de requisições | Google Hotels API |
| Documentação do servidor | MCP server docs |
| Todas as ferramentas da HasData em um servidor | HasData/hasdata-mcp |
| Tutoriais para clientes | MCP clients and integrations |
| Todo o resto que extraímos | All HasData APIs |
| Planos e custos de créditos | Plans and credit costs |
| Chaves e uso | HasData dashboard |
| Iniciador Node no npm | @hasdata/google-hotels-mcp |
| Iniciador Python no PyPI | hasdata-google-hotels-mcp |
Desenvolvimento
Este repositório é configuração e documentação para um servidor remoto. Não há etapa de build nem nada para containerizar.
Os testes em test/ verificam o contrato da ferramenta, a parte que pode quebrar sem um commit aqui. Eles verificam que ?apis=google_travel_hotels retorna exatamente uma ferramenta, que ela ainda declara seus parâmetros obrigatórios, que o nome não mudou e que a chave em uso é realmente aceita. Essa última verificação chama a ferramenta de verdade e custa 10 créditos, que é o preço de um canário que pode falhar pelo motivo certo.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test
A mesma suíte roda em CI a cada push e uma vez por semana em agendamento, porque a lista de ferramentas upstream pode mudar sem que ninguém toque neste repositório. Uma falha significa que a lista de ferramentas mudou, a chave parou de funcionar ou o endpoint ficou inacessível, e a mensagem da asserção diz qual.
Contribuindo
Correções na tabela de parâmetros e na amostra de resposta são a contribuição mais útil, porque são as partes que mais se desatualizam. Inclua a chamada que você fez e a resposta que recebeu. Pull requests de forks rodam a suíte sem chave, e as verificações ao vivo são puladas em vez de ficarem vermelhas.
Licença
MIT. Veja LICENSE.