noaa-tidesandcurrents-mcp

by RyanCardin15
Verified
  • src
import { NoaaService } from './noaa-service.js'; import { ZodSchema } from 'zod'; import { GetWaterLevelsSchema, GetTidePredictionsSchema, GetCurrentsSchema, GetCurrentPredictionsSchema, GetMeteorologicalDataSchema, GetStationsSchema, GetStationDetailsSchema } from './types.js'; // MCP Tool type interface MCPTool<TParams = any, TResult = any> { name: string; description: string; inputSchema: ZodSchema<TParams>; handler: (params: TParams) => Promise<TResult>; } // Class for the MCP server export class McpServer { private tools: MCPTool[]; private noaaService: NoaaService; constructor(noaaService: NoaaService) { this.noaaService = noaaService; this.tools = this.initializeTools(); } // Initialize the tools private initializeTools(): MCPTool[] { // Water Levels tool const getWaterLevels: MCPTool = { name: "get_water_levels", description: "Get water level data for a station", inputSchema: GetWaterLevelsSchema, handler: async (params) => { return this.noaaService.getWaterLevels(params); } }; // Tide Predictions tool const getTidePredictions: MCPTool = { name: "get_tide_predictions", description: "Get tide prediction data", inputSchema: GetTidePredictionsSchema, handler: async (params) => { return this.noaaService.getTidePredictions(params); } }; // Currents tool const getCurrents: MCPTool = { name: "get_currents", description: "Get currents data for a station", inputSchema: GetCurrentsSchema, handler: async (params) => { return this.noaaService.getCurrents(params); } }; // Current Predictions tool const getCurrentPredictions: MCPTool = { name: "get_current_predictions", description: "Get current predictions", inputSchema: GetCurrentPredictionsSchema, handler: async (params) => { return this.noaaService.getCurrentPredictions(params); } }; // Meteorological Data tool const getMeteorologicalData: MCPTool = { name: "get_meteorological_data", description: "Get meteorological data", inputSchema: GetMeteorologicalDataSchema, handler: async (params) => { return this.noaaService.getMeteorologicalData(params); } }; // Stations tool const getStations: MCPTool = { name: "get_stations", description: "Get list of stations", inputSchema: GetStationsSchema, handler: async (params) => { return this.noaaService.getStations(params); } }; // Station Details tool const getStationDetails: MCPTool = { name: "get_station_details", description: "Get detailed information about a station", inputSchema: GetStationDetailsSchema, handler: async (params) => { return this.noaaService.getStationDetails(params); } }; return [ getWaterLevels, getTidePredictions, getCurrents, getCurrentPredictions, getMeteorologicalData, getStations, getStationDetails ]; } // Method to get all tools getTools(): { name: string, description: string }[] { return this.tools.map(tool => ({ name: tool.name, description: tool.description })); } // Method to handle tool execution async executeTool(toolName: string, params: any): Promise<any> { const tool = this.tools.find(t => t.name === toolName); if (!tool) { throw new Error(`Tool '${toolName}' not found`); } // Validate the parameters against the schema const validatedParams = tool.inputSchema.parse(params); // Execute the tool handler return tool.handler(validatedParams); } }