A Model Context Protocol (MCP) server that provides seamless access to WeatherFlow Tempest weather station data. This server enables AI assistants and applications to retrieve real-time weather observations, forecasts, and station metadata.
- Real-time Weather Data: Access current conditions from personal weather stations
- Weather Forecasts: Get hourly and daily forecasts with professional meteorological models
- Station Management: Discover and manage multiple weather stations
- Device Information: Detailed metadata about connected weather devices
- Intelligent Caching: Automatic caching with configurable TTL for optimal performance
- Multiple Access Methods: Both tools (interactive queries) and resources (data access)
- Comprehensive Data: Temperature, humidity, pressure, wind, precipitation, solar radiation, UV index, and lightning detection
- Python 3.13 or higher
- WeatherFlow API token (get one at tempestwx.com/settings/tokens)
While each client has its own way of specifying, you'll generally use the following values:
Field | Value |
---|---|
Command | uvx |
Arguments | mcp-server-tempest |
Environment | WEATHERFLOW_API_TOKEN = <YOUR TOKEN> |
If you'd like to use the latest and greatest, the server can be pulled straight from GitHub.
Just add an additional --from
argument:
Field | Value |
---|---|
Command | uvx |
Arguments | --from , git+https://github.com/briandconnelly/mcp-server-tempest , mcp-server-tempest |
Environment | WEATHERFLOW_API_TOKEN = <YOUR TOKEN> |
Variable | Description | Default | Required |
---|---|---|---|
WEATHERFLOW_API_TOKEN |
Your WeatherFlow API token | - | β Yes |
WEATHERFLOW_CACHE_TTL |
Cache timeout in seconds | 300 | No |
WEATHERFLOW_CACHE_SIZE |
Maximum cache entries | 100 | No |
Get a list of all your weather stations and connected devices.
# Get all available stations
stations = await client.call_tool("get_stations")
for station in stations.stations:
print(f"Station: {station.name} (ID: {station.station_id})")
print(f"Location: {station.latitude}, {station.longitude}")
Get current weather conditions for a specific station.
# Get current conditions
obs = await client.call_tool("get_observation", {"station_id": 12345})
current = obs.obs[0]
print(f"Temperature: {current.air_temperature}Β°")
print(f"Humidity: {current.relative_humidity}%")
print(f"Wind: {current.wind_avg} {obs.station_units.units_wind}")
Get weather forecast and current conditions.
# Get forecast
forecast = await client.call_tool("get_forecast", {"station_id": 12345})
# Current conditions
current = forecast.current_conditions
print(f"Current: {current.air_temperature}Β°")
print(f"Conditions: {current.conditions}")
# Today's forecast
today = forecast.forecast.daily[0]
print(f"High/Low: {today.air_temp_high}Β°/{today.air_temp_low}Β°")
print(f"Rain chance: {today.precip_probability}%")
Get detailed information about a specific station.
# Get station details
station = await client.call_tool("get_station_id", {"station_id": 12345})
print(f"Station: {station.name}")
print(f"Elevation: {station.station_meta.elevation}m")
print(f"Devices: {len(station.devices)}")
Clear the data cache (useful for testing).
# Clear cache
await client.call_tool("clear_cache")
The server also provides resources for data access:
weather://tempest/stations
- List all stationsweather://tempest/stations/{station_id}
- Station detailsweather://tempest/observations/{station_id}
- Current observationsweather://tempest/forecast/{station_id}
- Weather forecast
# Get your stations
stations = await client.call_tool("get_stations")
station_id = stations.stations[0].station_id
# Get current conditions
obs = await client.call_tool("get_observation", {"station_id": station_id})
current = obs.obs[0]
print(f"π‘οΈ Temperature: {current.air_temperature}Β°{obs.station_units.units_temp}")
print(f"π§ Humidity: {current.relative_humidity}%")
print(f"π¨ Wind: {current.wind_avg} {obs.station_units.units_wind}")
print(f"π§οΈ Precipitation: {current.precip_accum_local_day} {obs.station_units.units_precip}")
# Get forecast
forecast = await client.call_tool("get_forecast", {"station_id": station_id})
# Today's weather
today = forecast.forecast.daily[0]
print(f"π
Today: {today.conditions}")
print(f"π‘οΈ High: {today.air_temp_high}Β° / Low: {today.air_temp_low}Β°")
print(f"π§οΈ Rain chance: {today.precip_probability}%")
# Next few hours
for hour in forecast.forecast.hourly[:6]:
time = datetime.fromtimestamp(hour.time)
print(f"π {time.strftime('%H:%M')}: {hour.air_temperature}Β° - {hour.conditions}")
# Get station details
station = await client.call_tool("get_station_id", {"station_id": station_id})
print(f"π Station: {station.name}")
print(f"π Location: {station.latitude}Β°, {station.longitude}Β°")
print(f"β°οΈ Elevation: {station.station_meta.elevation}m")
print(f"π Timezone: {station.timezone}")
# Check device status
for device in station.devices:
if device.serial_number:
status = "π’ Online" if device.device_meta else "π΄ Offline"
print(f"π‘ {device.device_type}: {status}")
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- WeatherFlow for providing the Tempest weather station and API
- Model Context Protocol for the MCP specification
- FastMCP for the MCP server framework
- Issues: GitHub Issues
- Documentation: WeatherFlow API Docs
- Community: WeatherFlow Community