Skip to main content
Glama
shayrylmae

Weather MCP Server

by shayrylmae
README.md
# Weather MCP Server

A Model Context Protocol (MCP) server that provides real-time and historical weather data using the Open-Meteo API. This server enables AI assistants and applications to access comprehensive weather information through a standardized interface.

## Features

This MCP server provides 5 powerful weather tools:

### 1. **get_current_weather**
Get real-time current weather conditions for any city worldwide.
- Temperature (actual and feels-like)
- Humidity
- Precipitation
- Weather description
- Wind speed and direction

### 2. **get_weather_forecast**
Retrieve weather forecasts for up to 16 days ahead.
- Daily max/min temperatures
- Precipitation predictions
- Weather conditions
- Wind speeds
- Perfect for trip planning and event scheduling

### 3. **get_weather_alerts**
Check for weather warnings and alerts based on current conditions.
- Extreme temperature warnings
- High wind alerts
- Heavy precipitation notices
- Thunderstorm warnings
- Real-time condition-based alerts

### 4. **get_growing_conditions**
Access agricultural and gardening data.
- Growing Degree Days (GDD) calculation
- Solar radiation levels
- Soil temperature and moisture
- Humidity metrics
- Customizable base temperature for different crops

### 5. **get_historical_weather**
Retrieve historical weather data for specific months.
- Monthly statistics over multiple years (up to 10 years back)
- Average, max, and min temperatures
- Total precipitation
- Average wind speed
- Climate trend analysis

## Installation

### Prerequisites
- Node.js 16 or higher
- npm or yarn

### Setup

1. Clone the repository:
```bash
git clone <repository-url>
cd weather-mcp-server
```

2. Install dependencies:
```bash
npm install
```

3. Build the project:
```bash
npm run build
```

## Usage

### Deployment Options

This server supports multiple transport modes:

#### 1. **SSE Transport** (Recommended for HTTP) ⭐

Server-Sent Events transport provides a persistent, stateful connection over HTTP.

```bash
npm run dev:sse    # Development (port 3003)
npm run start:sse  # Production (port 3003)
```

**Benefits:**
- ✅ Persistent connection maintains state across tool calls
- ✅ Native MCP protocol support over HTTP
- ✅ Better efficiency for streaming AI interactions
- ✅ Standards-compliant SSE implementation

**Test it:**
```bash
curl http://localhost:3003/health
curl http://localhost:3003/
```

#### 2. **HTTP Proxy** (Simple REST API)

Request-response HTTP wrapper for quick testing and REST API usage.

```bash
npm run proxy      # Runs on port 3002
```

**Test it:**
```bash
npm test
curl "http://localhost:3002/weather/current?city=Manila&country=PH"
```

#### 3. **Stdio Transport** (Original)

Standard MCP over stdio for Claude Desktop and MCP Inspector.

```bash
npm run dev        # Development
npm start          # Production
```

See **[INTEGRATION.md](./INTEGRATION.md)** for integrating with your Next.js app.

> 📖 **For detailed information about improvements and architecture**, see **[IMPROVEMENTS.md](./IMPROVEMENTS.md)**

### Running the MCP Server Directly

**Development mode** (with hot reload):
```bash
npm run dev
```

**Production mode**:
```bash
npm start
```

### Configuration with Claude Desktop

Add this server to your Claude Desktop configuration file:

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "weather": {
      "command": "node",
      "args": ["/absolute/path/to/weather-mcp-server/dist/index.js"]
    }
  }
}
```

Or use the development version:
```json
{
  "mcpServers": {
    "weather": {
      "command": "npx",
      "args": ["-y", "tsx", "/absolute/path/to/weather-mcp-server/src/index.ts"]
    }
  }
}
```

### Configuration with Other MCP Clients

This server uses the standard MCP protocol over stdio, so it can be integrated with any MCP-compatible client. Refer to your client's documentation for specific configuration instructions.

## Development

### Project Structure

```
weather-mcp-server/
├── src/
│   ├── index.ts                   # Main MCP server (stdio transport)
│   ├── sse-server.ts             # SSE transport server with routing (modified)
│   ├── sse-server-fixed.ts       # SSE server variant (untracked)
│   └── sse-server-with-routing.ts # SSE server variant (untracked)
├── dist/
│   ├── index.js                   # Compiled stdio server
│   └── sse-server.js             # Compiled SSE server
├── http-proxy.js                  # HTTP proxy wrapper (11KB)
├── test-integration.js            # Integration test suite
├── test-sse.html                  # SSE transport test page
├── package.json                   # Dependencies and scripts
├── tsconfig.json                  # TypeScript configuration
├── CLAUDE.md                      # Claude Code instructions
├── INTEGRATION.md                 # Integration guide for Next.js
├── IMPROVEMENTS.md                # Detailed improvements documentation
├── CHANGELOG.md                   # Version history and changes
└── README.md                      # This file
```

### Available Scripts

- `npm run build` - Compile TypeScript to JavaScript
- `npm run dev` - Run stdio transport in development mode
- `npm run dev:sse` - Run SSE transport in development mode (port 3003) ⭐
- `npm start` - Run the compiled stdio transport
- `npm run start:sse` - Run the compiled SSE transport (port 3003) ⭐
- `npm run proxy` - Build and start HTTP proxy server (port 3002)
- `npm test` - Run integration tests (requires proxy to be running)
- `npm run test:inspector` - Test with MCP Inspector (interactive UI)
- `npm run test:manual` - Run manual tests

### Testing

**Option 1: Integration Tests** (Recommended)

Start the HTTP proxy and run automated tests:
```bash
# Terminal 1: Start the proxy
npm run proxy

# Terminal 2: Run tests
npm test
```

**Option 2: MCP Inspector** (Interactive UI)

```bash
npm run test:inspector
```

This will open a web interface where you can:
- View all available tools
- Test each tool with different inputs
- See responses in real-time
- Debug any issues

### Making Changes

1. Edit `src/index.ts` to modify or add tools
2. Run `npm run build` to compile
3. Test using one of these methods:
   - `npm run proxy` then `npm test` for automated tests
   - `npm run test:inspector` for interactive testing
   - Restart your MCP client (e.g., Claude Desktop)

## API Reference

### Tool: get_current_weather

**Parameters:**
- `city` (required): City name (e.g., "London", "Tokyo")
- `country` (optional): Country code (e.g., "US", "GB", "JP")

**Example:**
```json
{
  "city": "Paris",
  "country": "FR"
}
```

### Tool: get_weather_forecast

**Parameters:**
- `city` (required): City name
- `country` (optional): Country code
- `days` (optional): Number of forecast days (1-16, default: 7)

**Example:**
```json
{
  "city": "New York",
  "country": "US",
  "days": 5
}
```

### Tool: get_weather_alerts

**Parameters:**
- `city` (required): City name
- `country` (optional): Country code

**Example:**
```json
{
  "city": "Miami",
  "country": "US"
}
```

### Tool: get_growing_conditions

**Parameters:**
- `city` (required): City name
- `country` (optional): Country code
- `base_temp` (optional): Base temperature for GDD calculation in °C (default: 10)

**Example:**
```json
{
  "city": "Sacramento",
  "country": "US",
  "base_temp": 10
}
```

### Tool: get_historical_weather

**Parameters:**
- `city` (required): City name
- `month` (required): Month number (1-12, where 1=January, 12=December)
- `country` (optional): Country code
- `years_back` (optional): Number of years back to retrieve (1-10, default: 1)

**Example:**
```json
{
  "city": "London",
  "month": 7,
  "years_back": 5
}
```

## Data Source

This server uses the [Open-Meteo API](https://open-meteo.com/), which provides:
- Free access with no API key required
- High-quality weather data from multiple sources
- Historical weather archives
- Global coverage
- No rate limiting for reasonable use

## Technical Details

- **Protocol**: Model Context Protocol (MCP)
- **Transport Modes**:
  - Stdio (standard MCP)
  - Server-Sent Events (SSE) with message routing
  - HTTP Proxy (REST API wrapper)
- **Language**: TypeScript with Node.js
- **Runtime**: Node.js 16+
- **Dependencies**:
  - `@modelcontextprotocol/sdk` (^1.18.2) - MCP framework
  - `zod` (^3.25.76) - Runtime type validation
- **Dev Dependencies**:
  - `tsx` (^4.20.6) - TypeScript execution
  - `typescript` (^5.9.3) - TypeScript compiler
  - `@types/node` (^24.6.1) - Node.js type definitions
- **APIs Used**:
  - Open-Meteo Forecast API
  - Open-Meteo Geocoding API
  - Open-Meteo Archive API (for historical data)

## Contributing

Contributions are welcome! To contribute:

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Make your changes
4. Test thoroughly with `npm run test:inspector`
5. Commit your changes (`git commit -m 'Add amazing feature'`)
6. Push to the branch (`git push origin feature/amazing-feature`)
7. Open a Pull Request

## License

ISC License

## Support

For issues, questions, or contributions, please open an issue on the repository.

---

Built with the [Model Context Protocol](https://modelcontextprotocol.io/)