import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; import { z } from "zod"; import https from 'https'; // 环境变量中的API密钥 const GAODE_API_KEY = process.env.GAODE_API_KEY? process.env.GAODE_API_KEY: "高德密钥"; // 通用HTTP请求函数 async function makeRequest(url: string): Promise<any> { return new Promise((resolve, reject) => { https.get(url, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { try { resolve(JSON.parse(data)); } catch (e) { reject(e); } }); }).on('error', (err) => { reject(err); }); }); } // 创建MCP服务器 const server = new McpServer({ name: "gaode-weather-mcp", version: "0.0.1" }); // 实现天气查询 server.tool("getWeather", { city: z.string().describe("城市编码"), extensions: z.enum(["base", "all"]).optional().describe("气象类型:base(实况天气)、all(预报天气)") }, async (params) => { if (!GAODE_API_KEY) { throw new Error("高德地图API密钥未设置"); } const { city, extensions = "all" } = params; const url = `https://restapi.amap.com/v3/weather/weatherInfo?key=${GAODE_API_KEY}&city=${encodeURIComponent(city)}&extensions=${extensions}&output=json`; const result = await makeRequest(url); return { content: [{ type: "text", text: JSON.stringify(result) }] }; } );
// 启动服务器 async function main() { const transport = new StdioServerTransport(); //const transport = new SSEServerTransport(); await server.connect(transport); console.log("高德地图MCP服务已启动"); // 保持运行 await new Promise(() => { }); }
main().catch(console.error);
这时在终端执行npm run build,会在src目录下编译生成index.js文件,这个就是MCP服务端代码了。