travel-mcp-server
Integrates with Google Maps API for location-based services, such as distance calculations and nearby places.
Integrates with Booking.com API via RapidAPI to search for flights and hotels.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@travel-mcp-serverI need a flight to London and a hotel near Big Ben."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
✈️ Multi Context Protocol (MCP) Server
🌟 Overview
This is a generalized travel mcp server that allows you to ask complex travel planning questions. Try the following
I need to be at the Google office tomorrow by 4pm. What is the latest flight I need to take?
I would like to stay at a reasonably priced hotel 15 minutes walk from the Eiffel tower, recommend some options.
Related MCP server: MCP Travel Concierge Server
🔧 Supported Functions
🛫 search-flights
Searches for available flights between two airports via Booking.com's API.
📅 today
Provides the current date to the LLM, ensuring it has up-to-date temporal context.
🏨 search-hotels
Search for available hotels and accommodations.
🔮 Features to Come
🚗 search-car-rentals
Find car rental options at your destination.
⭐ hotel-reviews
Access reviews for hotels and accommodations.
🚕 search-taxis
Find taxi and transfer services at your destination.
📦 Installation
This MCP server can be used with either Claude Desktop or your own client.
Pre-requisites
Go to RapidAPI, and look for the booking.com API. Issue yourself a key
Go to google cloud and issue yourself a Google Maps API key.
Use with Claude Desktop
In order to work with Claude Desktop, use the below claude_desktop_config.json
{
"mcpServers": {
"travel": {
"command": "npx",
"args": ["travel-mcp-server"],
"env": {
"BOOKING_COM_API_KEY": "<YOUR_BOOKING_DOT_COM_API_KEY>"
}
},
"google-maps": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GOOGLE_MAPS_API_KEY",
"mcp/google-maps"
],
"env": {
"GOOGLE_MAPS_API_KEY": "<YOUR_GOOGLE_MAPS_API_KEY>"
}
}
}
}You will need to go get a google maps API key in order to use this.
Programmatic Use
If you want to use this programmatically, here is a code snippet.
class TravelClient {
private flightsClient: Client;
private mapsClient: Client;
private toolDefinitions: any[] = [];
constructor() {
this.flightsClient = new Client(
{ name: "FlightsApp", version: "1.0.0" },
{ capabilities: { tools: {}, resources: {}, prompts: {} } }
);
this.mapsClient = new Client(
{ name: "MapsApp", version: "1.0.0" },
{ capabilities: { tools: {}, resources: {}, prompts: {} } }
);
}
async initialize() {
console.log("Initializing MCP clients...");
try {
const flightsTransport = new StdioClientTransport({
command: "node",
args: ["../../node_modules/travel-mcp-server/build/index.js"],
});
console.log("GOOGLE MAPS API KEY", process.env.GOOGLE_MAPS_API_KEY);
const mapsTransport = new StdioClientTransport({
command: process.execPath,
args: [
"../../node_modules/@modelcontextprotocol/server-google-maps/dist/index.js",
],
env: {
GOOGLE_MAPS_API_KEY: process.env.GOOGLE_MAPS_API_KEY || "",
},
});
await Promise.all([
this.flightsClient.connect(flightsTransport),
this.mapsClient.connect(mapsTransport),
]);
// Discover tools from both servers
console.log("Discovering tools...");
const [flightsTools, mapsTools] = await Promise.all([
this.flightsClient.listTools(),
this.mapsClient.listTools(),
]);
// Combine tools from both servers
this.toolDefinitions = [
...flightsTools.tools.map((tool) => ({
name: tool.name,
description: tool.description || `Tool: ${tool.name}`,
input_schema: tool.inputSchema,
})),
...mapsTools.tools.map((tool) => ({
name: tool.name,
description: tool.description || `Tool: ${tool.name}`,
input_schema: tool.inputSchema,
})),
];
console.log(`Discovered ${this.toolDefinitions.length} tools`);
return this;
} catch (error) {
console.error("Error initializing MCP clients:", error);
throw error;
}
}
async callTool(toolName: string, parameters: any) {
const tool = this.toolDefinitions.find((t) => t.name === toolName);
if (!tool) {
throw new Error(`Tool ${toolName} not found`);
}
// Determine which client to use based on the tool name
const client = toolName.includes("maps")
? this.mapsClient
: this.flightsClient;
const toolRequest = {
name: toolName,
arguments: parameters,
};
const result = await client.callTool(toolRequest);
return result;
}
async getToolDefinitions() {
return this.toolDefinitions;
}
}
export default TravelClient;Available Tools
3 toolssearch-flightsC
search for flights
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The arrival city | |
| from | Yes | The departure city | |
| sort | Yes | The sort order of the flights, optional | |
| cabinClass | Yes | The cabin class of the flight, optional | |
| departDate | Yes | The departure date, required | |
| returnDate | Yes | The return date, optional |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It only states 'search for flights' and gives no information about read-only guarantees, side effects, authorization requirements, rate limits, or the nature of results. This is a significant gap for a tool with six required parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise ('search for flights'), but it is under-specifying rather than efficiently informative. A single vague phrase does not earn its place, and the structure provides no front-loaded useful details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has six required parameters, no annotations, and no output schema, placing a high burden on the description to provide context. The description offers almost no beyond-schema value, leaving the agent uninformed about expected behavior, return format, or usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters have descriptions in the schema itself. The tool description adds no additional parametric meaning beyond the schema, so it meets the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'search for flights' identifies the core action and resource (flights), making its basic purpose clear. However, it lacks any specificity about scope, constraints, or what distinguishes it from potential sibling tools, so it is only minimally adequate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'search-hotels-by-coordinates' or 'today'. There are no mentions of context, prerequisites, or exclusions, so the agent receives no decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-hotels-by-coordinatesC
search for hotels by geographic coordinates
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Number of adults (default: 2) | |
| radius | No | Search radius in km (50-500, default: 100) | |
| latitude | Yes | Latitude of the location | |
| priceMax | No | Maximum price per night | |
| priceMin | No | Minimum price per night | |
| longitude | Yes | Longitude of the location | |
| arrivalDate | Yes | Check-in date in YYYY-MM-DD format | |
| childrenAge | No | Ages of children, if any | |
| currencyCode | No | Currency code (default: USD) | |
| roomQuantity | No | Number of rooms (default: 1) | |
| departureDate | Yes | Check-out date in YYYY-MM-DD format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'search for hotels', which implies a read operation but does not disclose any side effects, permissions, rate limits, or return format. This is minimal and adds little beyond the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. It is front-loaded with the core action and resource. However, it is so terse that it sacrifices informative value for brevity, so not a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, no output schema, and no annotations, the description is very incomplete. It does not explain what the search results contain, how the coordinates are used, or any behavior around the optional filters. The schema covers parameters but not overall tool context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter coverage with descriptions for all 11 parameters, including formats and defaults. The description adds no additional parameter meaning, so it does not enhance beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'search for hotels by geographic coordinates', which clearly identifies the action (search), resource (hotels), and scope (by coordinates). It distinguishes itself from sibling tools like 'search-flights' (hotels vs. flights) and 'today' (different domain). However, it lacks explicit mention of what 'search' returns (availability, prices, etc.), so it's not a full 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It does not explain scenarios or exclusions. The description simply states what it does without any context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
todayA
get today's date
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. It clearly states the operation (retrieving the date) and implies no side effects or mutations. However, it omits details like timezone or format, which could be relevant in some contexts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the verb and resource. Every word earns its place, with no unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, no output schema, and a trivial function, the description is nearly complete. It fully conveys the action, though it leaves out output format details that could be assumed or discovered elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero properties, and the baseline for parameter semantics with 0 params is 4. The description adds no param-specific meaning, but none is needed because there are no parameters to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'get today's date' uses a specific verb and resource, making the tool's purpose unmistakable. It is clearly distinct from sibling tools like 'search-flights' and 'search-hotels-by-coordinates', which address different domains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While there is no explicit when-to-use guidance, the tool's purpose is self-evident and there are no competing date-related tools among siblings. The context signals show zero parameters, implying a trivial utility where no usage exclusions are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.0.3- First observed
search-flights - First observed
search-hotels-by-coordinates - First observed
today
TDQS
Scored across 3 tools
Each tool addresses a distinct purpose: today provides the current date, search-flights looks up flight options, and search-hotels-by-coordinates finds hotels by geographic location. There is no overlap or ambiguity between these tools.
The two search tools follow a verb_noun pattern (search-flights, search-hotels-by-coordinates), but 'today' breaks this convention, being a simple noun with no verb. This mixed naming style is inconsistent, though the search tools themselves are clear.
With 3 tools, the server is at the lower end of what is considered reasonable for its domain. The tools are focused on search functionality, but the count is slightly thin for a travel server, missing other common actions like booking or trip details.
The server covers only flight search and hotel search by coordinates, lacking essential travel operations such as hotel search by city or landmark, flight status, booking, or itinerary management. The 'today' tool is also unrelated to travel, making the overall surface appear incomplete and somewhat disjointed.
Maintenance
Related MCP Connectors
Your personal AI travel concierge — flights, hotels, 116M+ POIs, visas, weather & more
Booking.com, Airbnb, TripAdvisor unified — for AI travel concierges and trip planners.
Give AI assistants access to real-time data. Search the web, compare flights, find hotels, and more.
Personal AI travel agent. Points optimization, live flight/hotel/award search, trip planning.
Related MCP Servers
- AlicenseAqualityFmaintenanceEnables LLMs to perform travel-related tasks by interacting with Google Maps and travel planning services including location search, place details, and travel time calculations.520 npm99MIT
- AlicenseNot gradedqualityFmaintenanceEnables comprehensive travel planning by integrating Google Travel Services and Amadeus GDS for dual flight and hotel searches, plus event discovery, weather forecasting, currency conversion, and location services. Combines consumer-friendly search with professional travel industry data for optimal trip planning.6MIT
- AlicenseAqualityDmaintenanceEnables comprehensive travel planning by providing tools for flight and accommodation searches, real-time currency exchange, and weather forecasting. It also allows users to calculate estimated trip budgets based on destination, duration, and traveler preferences.58 npm15MIT
- AlicenseNot gradedqualityDmaintenanceIntegrates multiple search APIs (Google Search, Maps, Flights, Hotels) through the Model Context Protocol and Agent-to-Agent protocol, enabling AI assistants to perform diverse searches via natural language queries.MIT