├── README.md ├── .python-version ├── mcp_seniverse_weather ├── __main__.py ├── __init__.py └── server.py ├── .gitignore └── pyproject.toml /README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.10 2 | -------------------------------------------------------------------------------- /mcp_seniverse_weather/__main__.py: -------------------------------------------------------------------------------- 1 | from mcp_seniverse_weather import main 2 | 3 | main() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Python-generated files 2 | __pycache__/ 3 | *.py[oc] 4 | build/ 5 | dist/ 6 | wheels/ 7 | *.egg-info 8 | 9 | # Virtual environments 10 | .venv 11 | .env 12 | -------------------------------------------------------------------------------- /mcp_seniverse_weather/__init__.py: -------------------------------------------------------------------------------- 1 | """mcp_seniverse_weather package""" 2 | 3 | from .server import mcp 4 | 5 | def main(): 6 | """Entry point for the MCP server""" 7 | mcp.run(transport='stdio') 8 | 9 | if __name__ == "__main__": 10 | main() 11 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["hatchling"] 3 | build-backend = "hatchling.build" 4 | 5 | [project] 6 | name = "mcp-seniverse-weather" 7 | version = "1.0.0" 8 | description = "Weather Forecast MCP Server Powered by Seniverse" 9 | readme = "README.md" 10 | requires-python = ">=3.10" 11 | dependencies = [ 12 | "mcp[cli]>=1.6.0", 13 | "requests>=2.32.3", 14 | ] 15 | 16 | [project.scripts] 17 | mcp-seniverse-weather = "mcp_seniverse_weather:main" 18 | -------------------------------------------------------------------------------- /mcp_seniverse_weather/server.py: -------------------------------------------------------------------------------- 1 | import os 2 | from typing import Any, Dict 3 | import requests 4 | from mcp.server.fastmcp import FastMCP 5 | 6 | mcp = FastMCP("Weather") 7 | 8 | @mcp.tool() 9 | def current_weather(city: str) -> Dict[str, Any]: 10 | """Query the current weather by city name""" 11 | api_key = os.getenv("SENIVERSE_API_KEY") 12 | if not api_key: 13 | raise ValueError("SENIVERSE_API_KEY environment variable is required") 14 | 15 | try: 16 | weather_response = requests.get( 17 | "https://api.seniverse.com/v3/weather/now.json", 18 | params={ 19 | "key": api_key, 20 | "location": city, 21 | "language": "zh-Hans", 22 | "unit": "c" 23 | } 24 | ) 25 | weather_response.raise_for_status() 26 | data = weather_response.json() 27 | results = data["results"] 28 | 29 | if not results: 30 | return {"error": f"Could not find weather data for city: {city}"} 31 | 32 | return results 33 | except requests.exceptions.RequestException as e: 34 | error_message = f"Weather API error: {str(e)}" 35 | if hasattr(e, 'response') and e.response is not None: 36 | try: 37 | error_data = e.response.json() 38 | if 'message' in error_data: 39 | error_message = f"Weather API error: {error_data['message']}" 40 | except ValueError: 41 | pass 42 | return {"error": error_message} --------------------------------------------------------------------------------