返回市场
飞行-mcp-服务器

飞行-mcp-服务器

作者:prakashsanker5 星标更新:2025-03-17

项目介绍

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

🌟 概述

这是一个通用的旅行 MCP 服务器,允许您询问复杂的旅行规划问题。尝试以下内容:

  • 我需要明天下午四点前到达谷歌办公室。我最晚需要乘坐哪班飞机?
  • 我想住在离埃菲尔铁塔步行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. 前往Google Cloud并为自己生成一个Google Maps 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>"
      }
    }
  }
}

您需要获取一个Google Maps 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("初始化MCP客户端...");
    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),
      ]);

      // 从两个服务器中发现工具
      console.log("正在发现工具...");
      const [flightsTools, mapsTools] = await Promise.all([
        this.flightsClient.listTools(),
        this.mapsClient.listTools(),
      ]);

      // 合并来自两个服务器的工具
      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(`已发现${this.toolDefinitions.length}个工具`);
      return this;
    } catch (error) {
      console.error("初始化MCP客户端时出错:", error);
      throw error;
    }
  }

  async callTool(toolName: string, parameters: any) {
    const tool = this.toolDefinitions.find((t) => t.name === toolName);
    if (!tool) {
      throw new Error(`未找到工具${toolName}`);
    }

    // 根据工具名称确定要使用的客户端
    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;