Skip to main content
Glama

✈️ 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

  1. Go to RapidAPI, and look for the booking.com API. Issue yourself a key

  2. 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 tools
search-flightsC

search for flights

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesThe arrival city
fromYesThe departure city
sortYesThe sort order of the flights, optional
cabinClassYesThe cabin class of the flight, optional
departDateYesThe departure date, required
returnDateYesThe return date, optional

TDQS

C2/5.0
Behavior1/5

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.

Conciseness2/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines1/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
adultsNoNumber of adults (default: 2)
radiusNoSearch radius in km (50-500, default: 100)
latitudeYesLatitude of the location
priceMaxNoMaximum price per night
priceMinNoMinimum price per night
longitudeYesLongitude of the location
arrivalDateYesCheck-in date in YYYY-MM-DD format
childrenAgeNoAges of children, if any
currencyCodeNoCurrency code (default: USD)
roomQuantityNoNumber of rooms (default: 1)
departureDateYesCheck-out date in YYYY-MM-DD format

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 3 tool updatesv1.0.3
    • First observedsearch-flights
    • First observedsearch-hotels-by-coordinates
    • First observedtoday

TDQS

C2.9/5.0

Scored across 3 tools

Disambiguation5/5

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.

Naming Consistency3/5

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.

Tool Count4/5

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.

Completeness2/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables 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.
    6
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    5
    8 npm
    15
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Integrates 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