Skip to main content
Glama
sthossan

Weather & Prayer Times MCP Server

by sthossan
weather.ts7.46 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import axios from "axios"; function getWeatherDescription(code: number): string { const weatherCodes: { [key: number]: string } = { 0: "Clear sky", 1: "Mainly clear", 2: "Partly cloudy", 3: "Overcast", 45: "Fog", 48: "Depositing rime fog", 51: "Light drizzle", 53: "Moderate drizzle", 55: "Dense drizzle", 61: "Slight rain", 63: "Moderate rain", 65: "Heavy rain", 80: "Slight rain showers", 81: "Moderate rain showers", 82: "Violent rain showers", 95: "Thunderstorm", 96: "Thunderstorm with slight hail", 99: "Thunderstorm with heavy hail" }; return weatherCodes[code] || "Unknown"; } export function registerWeatherTool(server: McpServer): void { server.tool( "get_weather", "Get current weather information for a city", { city: z.string().describe("City name").optional().default("Dhaka"), country: z.string().describe("Country code").optional().default("BD"), }, async ({ city, country }) => { try { // Use a more reliable geocoding API const geoResponse = await axios.get("http://api.openweathermap.org/geo/1.0/direct", { params: { q: `${city},${country}`, limit: 1, appid: "demo" // Using demo key for free tier } }); if (!geoResponse.data || geoResponse.data.length === 0) { // Fallback to Open-Meteo with correct endpoint const fallbackGeoResponse = await axios.get("https://geocoding-api.open-meteo.com/v1/search", { params: { name: city, count: 1 } }); if (!fallbackGeoResponse.data.results || fallbackGeoResponse.data.results.length === 0) { return { content: [ { type: "text", text: `City "${city}" not found. Please check the city name and try again.` } ] }; } const location = fallbackGeoResponse.data.results[0]; const { latitude, longitude, name, country: countryName } = location; // Get weather data from Open-Meteo const weatherResponse = await axios.get("https://api.open-meteo.com/v1/forecast", { params: { latitude, longitude, current_weather: true, timezone: "auto" } }); const currentWeather = weatherResponse.data.current_weather; const weatherInfo = { city: name, country: countryName, temperature: `${currentWeather.temperature}°C`, windspeed: `${currentWeather.windspeed} km/h`, windDirection: `${currentWeather.winddirection}°`, weatherCode: currentWeather.weathercode, isDay: currentWeather.is_day === 1 ? "Day" : "Night", time: new Date(currentWeather.time).toLocaleString() }; return { content: [ { type: "text", text: `Current weather in ${weatherInfo.city}, ${weatherInfo.country}: • Temperature: ${weatherInfo.temperature} • Wind: ${weatherInfo.windspeed} at ${weatherInfo.windDirection} • Conditions: ${getWeatherDescription(weatherInfo.weatherCode)} • Time: ${weatherInfo.time} (${weatherInfo.isDay})` } ] }; } // Use OpenWeatherMap coordinates with Open-Meteo weather API const location = geoResponse.data[0]; const { lat: latitude, lon: longitude, name, country: countryName } = location; // Get weather data from Open-Meteo const weatherResponse = await axios.get("https://api.open-meteo.com/v1/forecast", { params: { latitude, longitude, current_weather: true, timezone: "auto" } }); const currentWeather = weatherResponse.data.current_weather; const weatherInfo = { city: name, country: countryName, temperature: `${currentWeather.temperature}°C`, windspeed: `${currentWeather.windspeed} km/h`, windDirection: `${currentWeather.winddirection}°`, weatherCode: currentWeather.weathercode, isDay: currentWeather.is_day === 1 ? "Day" : "Night", time: new Date(currentWeather.time).toLocaleString() }; return { content: [ { type: "text", text: `Current weather in ${weatherInfo.city}, ${weatherInfo.country}: • Temperature: ${weatherInfo.temperature} • Wind: ${weatherInfo.windspeed} at ${weatherInfo.windDirection} • Conditions: ${getWeatherDescription(weatherInfo.weatherCode)} • Time: ${weatherInfo.time} (${weatherInfo.isDay})` } ] }; } catch (error) { // Simple fallback with static data for common cities const fallbackCities: { [key: string]: string } = { "dhaka": "Dhaka, Bangladesh: 28°C, Partly cloudy, Humid", "new york": "New York, USA: 22°C, Clear sky, Moderate wind", "london": "London, UK: 15°C, Overcast, Light rain", "tokyo": "Tokyo, Japan: 25°C, Sunny, Light breeze", "dubai": "Dubai, UAE: 35°C, Clear sky, Hot" }; const cityLower = city?.toLowerCase() || "dhaka"; const fallbackWeather = fallbackCities[cityLower] || fallbackCities["dhaka"]; return { content: [ { type: "text", text: `Weather API temporarily unavailable. Typical weather for ${city}: ${fallbackWeather}` } ] }; } } ); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sthossan/mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server