A minimal MCP server that exposes US weather data from the National Weather Service API as two tools:
get_forecast– get the forecast for a location (takeslatitudeandlongitude)get_alerts– get active weather alerts for a US state (takes a two-letter state code)
This example accompanies the Build an MCP server tutorial.
- Python 3.10+
- uv
uv run weather.pyuv run creates the virtual environment and installs dependencies on first use.
The server communicates over stdio, so running it directly just waits for a client on stdin. To see it in action, launch it from one of the client examples in this repository, for example:
cd ../mcp-client-python
uv run client.py ../weather-server-python/weather.pyBoth tools declare the same annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true and openWorldHint: true. They tell a host that the tools only read data, and that they read it from an outside service (the NWS API), so a host can, for example, run them without asking the user to confirm each call. Annotations are hints, not guarantees: a host should rely on them only for servers it trusts.
Both tools declare an output schema and return structured_content. get_forecast returns an object; get_alerts returns a top-level JSON array, which protocol revision 2026-07-28 is the first to allow — see Structured Content in the spec.
Alerts is a RootModel[list[Alert]] rather than a plain list[Alert] because the SDK wraps non-object return types as {"result": ...}; a RootModel is taken as the schema exactly as written. See Structured Output in the SDK docs.
Note that an array-rooted schema requires a 2026-07-28 client. This SDK does not project it down for older ones — it raises instead.