这是一个通用的旅行 MCP 服务器,允许您询问复杂的旅行规划问题。尝试以下内容:
search-flights通过Booking.com的API搜索两个机场之间的可用航班。
today向LLM提供当前日期,确保它具有最新的时间上下文。
search-hotels搜索可用的酒店和住宿。
search-car-rentals查找目的地的租车选项。
hotel-reviews访问酒店和住宿的评论。
search-taxis查找目的地的出租车和接送服务。
此MCP服务器可以与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;