MCP Weather Server
# MCP Data Server ๏ฟฝ
A comprehensive Model Context Protocol (MCP) server that provides various data services, starting with real-time weather data and designed for easy extension to other data sources.
## ๐ Features
- **Modular Architecture**: Easy to extend with new data services
- **Real-time Weather Data**: Get current weather conditions for any city
- **MCP Protocol Compliance**: Fully compatible with the Model Context Protocol
- **TypeScript Support**: Written in TypeScript for better type safety
- **Stdio Transport**: Uses standard input/output for communication
- **Extensible Design**: Ready for news, finance, sports, and other data services
## ๐ Prerequisites
- Node.js (v18 or higher)
- npm or yarn package manager
- TypeScript support
## ๐ ๏ธ Installation
1. Clone the repository:
```bash
git clone https://github.com/ParthibanRajasekaran/mcp-weather.git
cd mcp-weather
```
2. Install dependencies:
```bash
npm install
```
3. Build the project (optional):
```bash
npm run build
```
## ๐ฏ Usage
### Running the Server
#### Development Mode
```bash
npm run dev
```
#### Production Mode
```bash
npm run build
npm start
```
### MCP Configuration
Add the following configuration to your MCP client's configuration file (`.vscode/mcp.json`):
```json
{
"servers": {
"mcp-data-server": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"tsx",
"src/main.ts"
]
}
}
}
```
## ๐ง Available Services
### Weather Service
#### `getWeather`
Get current weather data for a specified city.
**Parameters:**
- `city` (string): The name of the city to get weather for
**Example Usage:**
```typescript
// MCP client call
const weather = await mcpClient.callTool("getWeather", { city: "London" });
```
**Response Format:**
```json
{
"latitude": 51.51147,
"longitude": -0.13078308,
"current": {
"time": "2025-07-08T06:15",
"temperature_2m": 13.9,
"apparent_temperature": 11,
"is_day": 1,
"rain": 0
},
"hourly": {
"time": [...],
"temperature_2m": [...]
}
}
```
### ๐ฎ Future Services (Planned)
- **News Service**: Get latest news from various sources
- **Finance Service**: Stock prices, market data, cryptocurrency
- **Sports Service**: Live scores, team statistics, schedules
- **Social Media Service**: Trending topics, social metrics
- **Maps Service**: Location data, directions, places
## ๐๏ธ Architecture
### Project Structure
```
mcp-weather/
โโโ src/
โ โโโ main.ts # Main server entry point
โ โโโ services/ # Data service implementations
โ โ โโโ weather.ts # Weather service
โ โโโ types/ # TypeScript type definitions
โ โ โโโ weather.ts # Weather-related types
โ โ โโโ service.ts # Base service interfaces
โ โโโ utils/ # Utility functions
โ โโโ registry.ts # Service registry
โโโ .vscode/
โ โโโ mcp.json # MCP client configuration
โโโ package.json # Project dependencies and scripts
โโโ tsconfig.json # TypeScript configuration
โโโ README.md # This file
```
### Transport Layer
The server uses **StdioServerTransport** for communication:
- **Input**: Standard input (stdin)
- **Output**: Standard output (stdout)
- **Protocol**: JSON-RPC over stdio
- **Benefits**: Simple, reliable, and widely supported
### Service Architecture
Each service follows this pattern:
```typescript
// 1. Define types
interface ServiceInput { /* ... */ }
interface ServiceOutput { /* ... */ }
// 2. Create service class
class MyService {
async getData(input: ServiceInput): Promise<string> {
// Implementation
}
}
// 3. Register with MCP server
server.tool("myTool", "Description", schema, handler);
```
## ๐ค AI Assistant Integration
### Claude Desktop (Available Now)
Your MCP server works with Claude Desktop out of the box! See [`docs/AI_INTEGRATION.md`](docs/AI_INTEGRATION.md) for setup instructions.
### GitHub Copilot (Coming Soon)
GitHub Copilot doesn't support MCP yet, but your server is ready! See [`docs/GITHUB_COPILOT_INTEGRATION.md`](docs/GITHUB_COPILOT_INTEGRATION.md) for:
- Current workarounds using VS Code extensions
- What to expect when MCP support is added
- Example integration patterns
### VS Code Extension Example
Check out [`examples/vscode-extension/`](examples/vscode-extension/) for a working example that integrates your MCP server with VS Code today!
## ๐ MCP Inspector Integration
For debugging and development, you can use the MCP Inspector:
1. Install the MCP Inspector:
```bash
npm install -g @modelcontextprotocol/inspector
```
2. Run the inspector:
```bash
npx @modelcontextprotocol/inspector npx tsx src/main.ts
```
3. Open the inspector in your browser at `http://localhost:5173`
## ๐งช Development
### Adding New Services
1. **Create Type Definitions** (`src/types/myservice.ts`):
```typescript
export interface MyServiceInput {
query: string;
}
export const MyServiceSchema = z.object({
query: z.string().describe("Your query parameter")
});
```
2. **Implement Service** (`src/services/myservice.ts`):
```typescript
export class MyService {
async getData(input: MyServiceInput): Promise<string> {
// Your implementation
return "Service response";
}
}
```
3. **Register Tool** (in `src/main.ts`):
```typescript
server.tool(
"myTool",
"Description of my tool",
MyServiceSchema,
async ({ query }: { query: string }) => {
const result = await myService.getData({ query });
return {
content: [{ type: "text", text: result }]
};
}
);
```
### Development Scripts
- `npm run dev` - Run in development mode with hot reload
- `npm run build` - Build the TypeScript project
- `npm start` - Run the built project
- `npm test` - Run all tests
- `npm run test:watch` - Run tests in watch mode
- `npm run test:coverage` - Run tests with coverage report
## ๐ API Details
### Weather Service API
- **Geocoding**: `https://geocoding-api.open-meteo.com/v1/search`
- **Weather**: `https://api.open-meteo.com/v1/forecast`
- **Rate Limit**: Free tier, no authentication required
- **Model**: UKMO Seamless (UK Met Office)
## ๐ค Contributing
We welcome contributions for new data services! Here's how:
1. Fork the repository
2. Create a feature branch: `git checkout -b feature/new-service`
3. Add your service following the architecture above
4. Add tests and documentation
5. Commit your changes: `git commit -m 'Add new service'`
6. Push to the branch: `git push origin feature/new-service`
7. Open a Pull Request
### Service Guidelines
- Each service should be self-contained in its own file
- Use TypeScript for type safety
- Include proper error handling
- Add JSDoc comments for public methods
- Follow the existing code style
## ๐ License
This project is licensed under the ISC License - see the [LICENSE](LICENSE) file for details.
## ๐ Acknowledgments
- [Model Context Protocol](https://github.com/modelcontextprotocol/specification) for the protocol specification
- [Open-Meteo](https://open-meteo.com/) for the free weather API
- [TypeScript](https://www.typescriptlang.org/) for type safety
## ๐ Support
If you encounter any issues or have questions:
1. Check the [Issues](https://github.com/ParthibanRajasekaran/mcp-weather/issues) page
2. Create a new issue with detailed information
3. Contact: rajasekaran.parthiban7@gmail.com
## ๐ Changelog
### v1.0.0
- Initial release with weather service
- Modular architecture for easy extension
- MCP protocol compliance
- TypeScript implementation
- Stdio transport support
---
Made with โค๏ธ by [ParthibanRajasekaran](https://github.com/ParthibanRajasekaran) | Ready for extension to any data service!
const server = new McpServer({
name: "MCP Weather Server",
version: "1.0.0",
description: "A server that provides weather data"
});
```
## ๐ง Tools Available
### `getWeather`
Retrieves current weather conditions and forecasts for a specified city.
**Parameters:**
- `city` (string): The name of the city to get weather data for
**Returns:**
- Current temperature, apparent temperature, and conditions
- Hourly temperature forecast for the next 7 days
- Location coordinates and timezone information
**Example Usage:**
```typescript
// Through MCP client
const weatherData = await mcpClient.callTool("getWeather", { city: "London" });
```
## ๐ Project Structure
```
mcp-weather/
โโโ .vscode/
โ โโโ mcp.json # MCP server configuration
โโโ weather/
โ โโโ main.ts # Main server implementation
โโโ package.json # Dependencies and scripts
โโโ tsconfig.json # TypeScript configuration
โโโ README.md # This file
```
## ๐ MCP Inspector Integration
To use with the MCP Inspector for debugging and development:
1. **Configure MCP Client**: Add the server to your MCP configuration file (`.vscode/mcp.json`):
```json
{
"servers": {
"my-weather-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "tsx", "weather/main.ts"]
}
}
}
```
2. **Launch Inspector**: The server can be inspected using MCP-compatible tools and inspectors.
3. **Debug Mode**: Use the development server for real-time debugging:
```bash
npm run dev
```
## ๐ API Integration
The server integrates with two Open-Meteo APIs:
### Geocoding API
- **Endpoint**: `https://geocoding-api.open-meteo.com/v1/search`
- **Purpose**: Convert city names to coordinates
- **Features**: Multi-language support, fuzzy matching
### Weather API
- **Endpoint**: `https://api.open-meteo.com/v1/forecast`
- **Purpose**: Retrieve weather data using coordinates
- **Model**: UK Met Office Seamless model (`ukmo_seamless`)
- **Data**: Current conditions + hourly forecasts
## ๐ ๏ธ Development
### Available Scripts
```bash
# Development server with hot reload
npm run dev
# Build TypeScript to JavaScript
npm run build
# Start production server
npm start
# Run tests
npm test
```
### Adding New Features
1. **New Tools**: Add tools to the server using the `server.tool()` method
2. **Enhanced Data**: Extend the weather API calls to include more parameters
3. **Error Handling**: Improve error handling for edge cases
## ๐ Usage Examples
### Basic Weather Query
```typescript
// Get weather for London
const result = await getWeather({ city: "London" });
// Current conditions
console.log(`Temperature: ${result.current.temperature_2m}ยฐC`);
console.log(`Feels like: ${result.current.apparent_temperature}ยฐC`);
console.log(`Rain: ${result.current.rain}mm`);
```
### Multi-City Comparison
```typescript
const cities = ["London", "Paris", "New York", "Tokyo"];
const weatherData = await Promise.all(
cities.map(city => getWeather({ city }))
);
```
## ๐ Error Handling
The server includes comprehensive error handling:
- **Invalid Cities**: Returns helpful error messages for non-existent cities
- **API Failures**: Graceful handling of network issues
- **Data Validation**: Input validation using Zod schemas
## ๐ Data Schema
### Current Weather Response
```typescript
interface WeatherResponse {
latitude: number;
longitude: number;
timezone: string;
current: {
time: string;
temperature_2m: number;
apparent_temperature: number;
is_day: number;
rain: number;
};
hourly: {
time: string[];
temperature_2m: number[];
};
}
```
## ๐ค Contributing
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## ๐ License
This project is licensed under the ISC License - see the [LICENSE](LICENSE) file for details.
## ๐ Acknowledgments
- [Open-Meteo](https://open-meteo.com/) for providing free weather data
- [Model Context Protocol](https://modelcontextprotocol.io/) for the MCP specification
- UK Met Office for the weather model data
## ๐ Support
For questions or issues:
- Create an issue on GitHub
- Check the [MCP Documentation](https://modelcontextprotocol.io/docs)
---
Built with โค๏ธ using the Model Context Protocol
TDQS
Scored across 1 tool
With only one tool, there is no possibility of confusion or overlap between tools. The tool's purpose is clearly defined and distinct by default.
A single tool inherently has perfect naming consistency, as there are no other tools to compare it against. The name 'getWeather' follows a clear verb_noun pattern.
A single tool for a weather server is too minimal for the apparent scope. It lacks essential operations like forecasts, historical data, or location search, making it feel incomplete and limiting for agent workflows.
The tool surface is severely incomplete for a weather domain. It only provides current weather, missing forecasts, alerts, multi-location queries, and other standard weather API features, which will cause agent failures in broader tasks.