Skip to main content
Glama
ajayamal

Weather MCP Server

by ajayamal
README.md
# Weather MCP Server - Usage Guide

A Model Context Protocol (MCP) server that provides weather information using the National Weather Service API. Supports both local (stdio) and remote (HTTP/SSE) access.

## Features

- **Dual Transport Support**: Run locally via stdio or remotely via HTTP/SSE
- **Weather Alerts**: Get active weather alerts by state
- **Weather Forecasts**: Get detailed forecasts by coordinates (US locations only)
- **Session Management**: Automatic session handling for remote connections

## Installation

```bash
npm install
npm run build
```

## Usage

### Local Mode (Stdio Transport)

For local use with MCP clients like Claude Desktop:

```bash
# Default mode - no environment variable needed
node build/index.js

# Or explicitly set stdio mode
TRANSPORT=stdio node build/index.js
```

**Configuration for Claude Desktop** (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "weather": {
      "command": "node",
      "args": ["/path/to/weather/build/index.js"]
    }
  }
}
```

### Remote Mode (HTTP/SSE Transport)

For remote access via HTTP:

```bash
# Start HTTP server on default port 3000
TRANSPORT=http node build/index.js

# Or specify a custom port
TRANSPORT=http PORT=8080 node build/index.js
```

The server will start on `http://localhost:3000/mcp` (or your specified port).

## Remote Access Examples

### 1. Initialize Session

```bash
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2024-11-05",
      "capabilities": {},
      "clientInfo": {
        "name": "my-client",
        "version": "1.0.0"
      }
    }
  }'
```

**Response**: Returns session ID in `mcp-session-id` header. Save this for subsequent requests.

### 2. Get Weather Forecast

```bash
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "mcp-session-id: YOUR_SESSION_ID" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "get_forecast",
      "arguments": {
        "latitude": 37.7749,
        "longitude": -122.4194
      }
    }
  }'
```

### 3. Get Weather Alerts

```bash
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "mcp-session-id: YOUR_SESSION_ID" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "get_alerts",
      "arguments": {
        "state": "CA"
      }
    }
  }'
```

### 4. Open SSE Stream (Optional)

For receiving server-initiated messages:

```bash
curl -N http://localhost:3000/mcp \
  -H "Accept: text/event-stream" \
  -H "mcp-session-id: YOUR_SESSION_ID"
```

### 5. Terminate Session

```bash
curl -X DELETE http://localhost:3000/mcp \
  -H "mcp-session-id: YOUR_SESSION_ID"
```

## Available Tools

### `get_forecast`

Get weather forecast for a location.

**Parameters:**
- `latitude` (number): Latitude of the location (-90 to 90)
- `longitude` (number): Longitude of the location (-180 to 180)

**Note**: Only US locations are supported by the National Weather Service API.

### `get_alerts`

Get active weather alerts for a US state.

**Parameters:**
- `state` (string): Two-letter state code (e.g., "CA", "NY")

## Environment Variables

| Variable | Description | Default | Example |
|----------|-------------|---------|---------|
| `TRANSPORT` | Transport mode: `stdio` or `http` | `stdio` | `http` |
| `PORT` | HTTP server port (HTTP mode only) | `3000` | `8080` |

## Architecture

### Stdio Mode
- Single server instance
- Communicates via stdin/stdout
- Ideal for local MCP clients

### HTTP Mode
- Express-based HTTP server
- Session-based architecture
- Multiple concurrent sessions supported
- Automatic session cleanup on disconnect
- SSE streaming for real-time updates

## Deployment

### Local Development
```bash
TRANSPORT=http PORT=3000 node build/index.js
```

### Production (with PM2)
```bash
pm2 start build/index.js --name weather-mcp -- TRANSPORT=http PORT=3000
```

### Docker
```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY build ./build
ENV TRANSPORT=http
ENV PORT=3000
EXPOSE 3000
CMD ["node", "build/index.js"]
```

## Troubleshooting

### "Failed to retrieve grid point data"
- Ensure coordinates are within the United States
- NWS API only supports US locations

### "Invalid or missing session ID"
- Initialize a session first using the `initialize` method
- Include the `mcp-session-id` header in all subsequent requests

### Server not starting in HTTP mode
- Check if port is already in use
- Verify `TRANSPORT=http` environment variable is set

## License

ISC