旅行规划服务器

一个通用的旅行规划服务器,支持复杂的旅行规划问题,包括航班搜索、酒店推荐等功能。

  • by prakashsanker
  • JavaScript
  • 本地部署
  • 9 星标
  • 更新于
在 GitHub 查看 prakashsanker/flights-mcp-server

使用说明

✈️ 多上下文协议(MCP)服务器

🌟 概述

这是一个通用的旅行mcp服务器,允许您提出复杂的旅行计划问题。尝试以下操作

  • 我明天下午4点前需要到谷歌办公室。我需要乘坐的最新航班是什么?
  • 我想住在一家价格合理的酒店,距离埃菲尔铁塔有15分钟的步行路程,推荐一些选择。

🔧 支持的功能

🛫 search-flights

通过Booking.com的API搜索两个机场之间的可用航班。

📅 today

向LLM提供当前日期,确保其具有最新的时间上下文。

🏨 search-hotels

搜索可用的酒店和住宿。

🔮 即将推出的功能

🚗 search-car-rentals

在您的目的地查找汽车租赁选项。

⭐ hotel-reviews

访问酒店和住宿的评论。

🚕 search-taxis

在您的目的地寻找出租车和接送服务。

📦 安装

此MCP服务器可以与Claude Desktop或您自己的客户端一起使用。

先决条件

  1. 访问RapidAPI,查找booking.com API。给自己一把钥匙
  2. 去谷歌云,给自己一个谷歌地图API密钥。

与Claude Desktop一起使用

要使用Claude Desktop,请使用以下工具 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>"
      }
    }
  }
}

你需要去获取一个谷歌地图API密钥,以便使用这个。

程序化使用

如果你想以编程方式使用它,这里有一个代码片段。

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;