You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.0 KiB
76 lines
2.0 KiB
import {
|
|
McpServer,
|
|
ResourceTemplate,
|
|
} from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
import {
|
|
makeNWSRequest,
|
|
formatAlert,
|
|
NWS_API_BASE,
|
|
USER_AGENT,
|
|
} from "./util.js";
|
|
import { z } from "zod";
|
|
|
|
const server = new McpServer({
|
|
name: "天气工具包",
|
|
version: "0.0.1",
|
|
});
|
|
|
|
server.tool("获取天气", { state: z.string() }, async ({ state }) => {
|
|
const url = `https://cn.apihz.cn/api/tianqi/tqyb.php?id=88888888&key=88888888&sheng=四川&place=绵阳`;
|
|
const data = await fetch(url).then(res => res.json());
|
|
|
|
if (!data) {
|
|
return "无法获取天气";
|
|
}
|
|
|
|
return data;
|
|
});
|
|
|
|
// server.tool({
|
|
// name: "get-forecast",
|
|
// description: "获取位置的天气预报",
|
|
// parameters: {
|
|
// latitude: {
|
|
// type: "number",
|
|
// description: "位置的纬度",
|
|
// },
|
|
// longitude: {
|
|
// type: "number",
|
|
// description: "位置的经度",
|
|
// },
|
|
// },
|
|
// async execute({ latitude, longitude }) {
|
|
// // 首先获取预报网格端点
|
|
// const pointsUrl = `${NWS_API_BASE}/points/${latitude},${longitude}`;
|
|
// const pointsData = await makeNWSRequest(pointsUrl);
|
|
|
|
// if (!pointsData) {
|
|
// return "无法为此位置获取预报数据。";
|
|
// }
|
|
|
|
// // 从点响应中获取预报URL
|
|
// const forecastUrl = pointsData.properties.forecast;
|
|
// const forecastData = await makeNWSRequest(forecastUrl);
|
|
|
|
// if (!forecastData) {
|
|
// return "无法获取详细预报。";
|
|
// }
|
|
|
|
// // 将时段格式化为可读预报
|
|
// const periods = forecastData.properties.periods;
|
|
// const forecasts = periods.slice(0, 5).map(
|
|
// (period) => `
|
|
// ${period.name}:
|
|
// Temperature: ${period.temperature}°${period.temperatureUnit}
|
|
// Wind: ${period.windSpeed} ${period.windDirection}
|
|
// Forecast: ${period.detailedForecast}
|
|
// `
|
|
// );
|
|
|
|
// return forecasts.join("\n---\n");
|
|
// },
|
|
// });
|
|
|
|
const transport = new StdioServerTransport();
|
|
await server.connect(transport);
|
|
|