Also ranked on Viberank.dev
TypeScript MCP server that exposes weather tools backed by OpenWeatherMap.
Tools
| Tool | Description |
|---|---|
get_current_weather |
Current conditions by city name or lat/lon, plus umbrella advice and outdoor checks |
get_forecast |
5-day / 3-hour forecast by lat/lon, plus umbrella advice and outdoor checks per period |
Each successful tool response appends:
- Umbrella - whether to take one, based on rain/storm/snow and precipitation chance
- Outdoor - whether it is a good time to be outside, including heat, cold, wind, and humidity checks
Transports
| Mode | Env | Use when |
|---|---|---|
stdio (default) |
TRANSPORT=stdio |
Local Cursor / Claude Desktop |
| Streamable HTTP | TRANSPORT=http |
Deploy (Render, etc.) / remote URL |
Official MCP docs: https://modelcontextprotocol.io/docs/
Deployed on Render’s free tier:
| Landing page | https://weather-mcp-ts.onrender.com/ |
| MCP endpoint | https://weather-mcp-ts.onrender.com/mcp |
| Health check | https://weather-mcp-ts.onrender.com/health |
Add this to Settings → MCP or ~/.cursor/mcp.json:
{
"mcpServers": {
"weather": {
"url": "https://weather-mcp-ts.onrender.com/mcp"
}
}
}No local build or API key in Cursor - the key lives in Render’s env vars.
Render free tier: the service shuts down after ~15 minutes of inactivity. The next request is a cold start and can take up to ~50 seconds before MCP responds. Hit
/healthonce if Cursor tools look stuck waking up.
- Node.js 20+
- pnpm (or npm/yarn)
- An OpenWeatherMap API key (get one here)
pnpm install
cp .env.example .envEdit .env and set your key:
OPEN_WEATHER_MAP_API_KEY=your_key_here
TRANSPORT=stdioBuild the server:
pnpm run buildThis writes the runnable entrypoint to dist/index.js.
Cursor does not start this process from the project root by default for env loading, so pass the env file with an absolute path via Node’s --env-file flag.
- Open Cursor Settings → MCP, or edit
~/.cursor/mcp.json. - Add a
weatherentry undermcpServers:
{
"mcpServers": {
"weather": {
"command": "node",
"args": [
"--env-file",
"/ABSOLUTE/PATH/TO/weather-mcp/.env",
"/ABSOLUTE/PATH/TO/weather-mcp/dist/index.js"
]
}
}
}Replace /ABSOLUTE/PATH/TO/weather-mcp with your real project path (e.g. run pwd from the repo root). Keep TRANSPORT=stdio (or unset) in .env.
{
"mcpServers": {
"weather": {
"command": "node",
"args": [
"/ABSOLUTE/PATH/TO/weather-mcp/dist/index.js"
],
"env": {
"OPEN_WEATHER_MAP_API_KEY": "your_key_here",
"TRANSPORT": "stdio"
}
}
}
}Prefer .env + --env-file so the key stays out of mcp.json.
- Save, then toggle the server off/on in Settings → MCP (or restart Cursor).
- Confirm the server shows as connected and lists
get_current_weatherandget_forecast.
pnpm run buildThen reload the MCP server in Cursor.
HTTP mode serves a landing page at GET /, MCP at POST/GET /mcp (configurable), plus GET /health. Streamable HTTP is configured via the official SDK’s createMcpHandler + toNodeHandler. The build copies src/index.html into dist/.
pnpm run build
TRANSPORT=http PORT=3000 pnpm run start
# or
pnpm run start:httpYou should see something like:
Weather MCP Server running on http://0.0.0.0:3000/mcp (Streamable HTTP)
- Create a Web Service from this repo (root of the project).
- Build:
pnpm install && pnpm run build(ornpmequivalent). - Start:
node dist/index.js(orpnpm run start). - Env vars:
TRANSPORT=httpOPEN_WEATHER_MAP_API_KEY=...PORTis set by Render automatically
- MCP URL:
https://<your-service>.onrender.com/mcp
This deployment:https://weather-mcp-ts.onrender.com/mcp
The HTTP endpoint is unauthenticated. Anyone with the URL can call the tools. Add auth before sharing widely.
With .env set:
node --env-file=.env -e "
import { getApiKey, buildCurrentWeatherUrl, makeOWMRequest, formatCurrentWeather } from './dist/utils.js';
const apiKey = getApiKey();
const data = await makeOWMRequest(buildCurrentWeatherUrl({ apiKey, city: 'Yaounde,CM', units: 'metric' }));
console.log(data ? formatCurrentWeather(data, 'metric') : 'failed');
"Remote health:
curl -s https://weather-mcp-ts.onrender.com/healthweather-mcp/
├── README.md
├── LICENSE
├── package.json
├── tsconfig.json
├── .env.example
└── src/
├── index.html # landing page (copied to dist on build)
├── index.ts # stdio + Streamable HTTP entry
├── server.ts # tool registration
├── types.ts
└── utils.ts
- Never commit
.env(it is gitignored). - Stdio servers must not write to stdout except MCP JSON-RPC; logs go to stderr (
console.error). - Free OpenWeatherMap plans cover current weather and the 5-day / 3-hour forecast used here.
ISC © 2026 RashJrEdmund
