集成SerpAPI的MCP飞行服务器
⚠️ 注: 这个项目是在人工智能的帮助下开发的,以帮助我学习和实验 模型上下文协议(MCP).\ 这是一个学习和演示项目,旨在了解如何构建一个符合MCP标准的工具服务器,以与人工智能代理集成,特别是微软的 语义内核 框架。
______________________________________________________________________
什么是MCP?(模型上下文协议)
这 模型上下文协议(MCP) 是一种新兴的开放协议,旨在标准化人工智能模型(或“代理”)如何与外部工具、服务或子流程交互。目标是允许大型语言模型(LLM)和编排器通过交换与专用工具无缝通信 JSON-RPC 2.0 标准输入/输出(stdin/stdout)上的消息。
关键思想:
- JSON-RPC 2.0:MCP使用这种轻量级RPC格式
method,params,id,以及jsonrpc领域。 - 工具发现:代理可以请求服务器支持的工具列表(
mcp/listTools). - 工具调用:代理可以调用工具(
mcp/invokeTool)按名称使用JSON有效载荷。 - 标准化输入/输出:所有通信都是通过stdin/stdout上的JSON消息进行的,不需要HTTP。
- 可扩展性:您可以在遵守此格式的同时添加新的工具或方法。
______________________________________________________________________
为什么MCP对语义内核很重要?
微软的 语义内核 框架使用MCP作为其调用外部“插件”或“工具”的通信契约。当您将自定义工具服务器与语义内核集成时:
- 内核在stdin上向工具服务器进程发送JSON-RPC请求
- 您的服务器解析JSON-RPC方法和参数
- 您的服务器执行请求的操作(例如,航班搜索)
- 您的服务器返回具有结构化结果的JSON-RPC响应
这种标准化允许您用任何语言编写任何工具,只要它遵循MCP规范。内核可以 动态调用工具,对其输入/输出进行推理,并将其链接到人工智能计划或工作流程中。
______________________________________________________________________
语义内核如何期望请求和响应
语义内核发送如下请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "mcp/invokeTool",
"params": {
"toolName": "getFlightInfo",
"arguments": {
"from": "MAN",
"to": "CDG",
"date": "2025-08-20"
}
}
}method:必须是"mcp/invokeTool"调用工具params.toolName:要调用的工具的名称(例如。,"getFlightInfo")params.arguments:具有工具特定输入参数的JSON对象
您的服务器必须以JSON-RPC 2.0响应进行响应,例如:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "tool_result",
"data": "{ "flights": [ ... ] }"
}
],
"isError": false
}
}- 这
data字段是一个带有工具结果的JSON字符串化对象。 - 外部包装严格遵循JSON-RPC 2.0规范。
- 如果发生错误,请返回带有适当代码和消息的错误响应。
______________________________________________________________________
集成SerpAPI的MCP飞行服务器
此服务器是一个Node.js工具服务器,它:
- 实现MCP JSON-RPC方法用于工具发现和调用
- 使用SerpAPI的Google Flights API查找航班
- 规范并返回为AI消费而格式化的航班数据
- 稳健地处理日志记录、错误和输入验证
______________________________________________________________________
特性
- ✅ 完全符合MCP(
initialize,mcp/listTools,mcp/invokeTool) - 🔑 通过客户端安全地注入API密钥
- 🛫 使用SerpAPI进行实时航班搜索
- 📄 返回标准化航班,包括定价、持续时间、航段、碳排放等。
______________________________________________________________________
安装说明
先决条件
- Node.js 18+
- 来自的有效SerpAPI API密钥 https://serpapi.com
- Git(可选,用于克隆仓库)
安装
git clone https://github.com/YOUR_USERNAME/mcp-flight-server.git
cd mcp-flight-server
npm install🔐 API密钥配置
此服务器 需要 这 SERPAPI_KEY 访问的环境变量 SerpAPI谷歌航班引擎然而,确实如此 不 管理身份验证本身——调用服务器的环境或客户端必须提供密钥。
在大多数情况下 MCP客户端 (例如语义内核)负责在启动服务器时设置环境变量。这允许服务器保持 无状态和便携,没有硬编码的秘密。
🧠 示例:从C#语义内核MCP客户端启动 您可以使用Semantic Kernel的McpClientFactory直接从C#启动MCP服务器:
await using IMcpClient flightsMcpClient = await McpClientFactory.CreateAsync(
new StdioClientTransport(new()
{
Name = "Flights",
Command = "node",
Arguments = new[]
{
@"C:\path\to\your\mcp-flight-server-node\server.js"
},
EnvironmentVariables = new Dictionary
{
{ "SERPAPI_KEY", "YOUR_KEY" } // Pass your SerpAPI key securely here
},
// Optional: specify working directory if needed
// WorkingDirectory = @"C:\path\to\your\mcp-flight-server-node"
}));______________________________________________________________________
运行服务器
node index.js服务器在stdin上监听JSON-RPC请求,并在stdout上写入JSON-RPC响应。
______________________________________________________________________
支持的方法和工具
| 方法 | 说明 |
|---|---|
initialize | MCP握手初始化 |
mcp/listTools | 返回支持的工具列表 |
mcp/invokeTool | 执行命名工具 |
工具
获取航班信息
- 描述:使用SerpAPI Google Flights检索航班选项。
- 输入架构:
{
"type": "object",
"properties": {
"from": { "type": "string", "description": "Origin IATA code" },
"to": { "type": "string", "description": "Destination IATA code" },
"date": { "type": "string", "format": "date", "description": "Departure date YYYY-MM-DD" }
},
"required": ["from", "to", "date"]
}______________________________________________________________________
JSON-RPC请求示例
初始化
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize"
}列出工具
{
"jsonrpc": "2.0",
"id": 2,
"method": "mcp/listTools"
}调用航班搜索工具
{
"jsonrpc": "2.0",
"id": 3,
"method": "mcp/invokeTool",
"params": {
"toolName": "getFlightInfo",
"arguments": {
"from": "LHR",
"to": "JFK",
"date": "2025-07-01"
}
}
}______________________________________________________________________
航班搜索响应示例
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "tool_result",
"data": "{"flights": [{ "price_usd": 500, "total_duration_minutes": 420, "carbon_emissions_grams": 90000, "layovers": ["AMS"], "segments": [{ "airline": "KLM", "flight_number": "KL1084", "from": "LHR", "to": "AMS", "departs": "2025-07-01T06:30", "arrives": "2025-07-01T08:30", "duration_minutes": 120, "airplane": "Boeing 737", "travel_class": "Economy" }]}]}"
}
],
"isError": false
}
}______________________________________________________________________
日志记录
所有服务器操作和错误都会用时间戳记录到:
C:\Temp\MCPServerLog.log使用此文件进行调试和审计跟踪。
______________________________________________________________________
测试和调试提示
- 使用命令行将JSON请求传输到服务器:
cat test-request.json | node index.js- 使用以下工具
jq格式化JSON输出。 - 测试错误场景,如缺少参数或格式错误的JSON,以确认稳健的处理。
- 通过检查添加详细日志记录
C:\Temp\MCPServerLog.log.
______________________________________________________________________
未来增强功能(路线图)
- 支持多航段和回程航班
- Docker容器化,易于部署
- 用于重复查询的缓存层
______________________________________________________________________
快乐编程,快乐飞行! 🛫🧠
