气象桥MCP

春靴 模型上下文协议(MCP)服务器 它将实时天气数据与 OpenWeatherMap AI代理。将其连接到 克劳德桌面版 或 克劳德代码 用简单的英语问天气问题——客服会自动调用正确的工具。
"What's the weather in Tokyo?" → getCurrentWeather("Tokyo") → 18°C, partly cloudy
"3-day forecast for Berlin?" → getForecast("Berlin", 3) → Mon 12°C, Tue 10°C, Wed 14°C______________________________________________________________________
建筑
graph TB
subgraph dev["Developer Environment"]
U(["👤 Developer"])
CL["Claude Desktop\n/ Claude Code"]
MC["MCP Client"]
U -->|natural language| CL
CL MC
end
subgraph server["Weather Bridge MCP — Spring Boot :8080"]
direction TB
SSE["SSE Transport\n/sse"]
SRV["MCP Server\n(auto-configured)"]
TP["WeatherService\n@Tool methods"]
RT["RestTemplate"]
SSE --> SRV --> TP --> RT
end
OWM[("☁️ OpenWeatherMap\nREST API")]
MC -->|"SSE connection"| SSE
RT -->|"HTTPS"| OWM______________________________________________________________________
MCP工具
| 工具 | 说明 | 参数 |
|---|---|---|
getCurrentWeather | 一个城市的现状 | city --例如。 "London" |
getForecast | 多日预报 | city, days (1–5) |
这两个工具都返回了一个人类可读的摘要,人工智能模型使用该摘要来编写其响应。
______________________________________________________________________
快速开始
使用Docker (不需要Java):
git clone https://github.com/mm-camelcase/weather-bridge-mcp.git
cd weather-bridge-mcp
cp .env.example .env # add your OPENWEATHERMAP_API_KEY
docker-compose up连接克劳德桌面 --添加到 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"weather-bridge": {
"type": "sse",
"url": "http://localhost:8080/sse"
}
}
}重新启动Claude Desktop并询问: *“纽约的天气怎么样?”*
看 claude-config/README.md 有关Claude Code(CLI)设置说明。
______________________________________________________________________
入门指南(不含Docker)
先决条件
- Java 21+
- Maven 3.9+
- 自由的 OpenWeatherMap API密钥
配置
cp .env.example .env
# edit .env — set OPENWEATHERMAP_API_KEY=your_key_here
export $(cat .env | xargs)或者直接设置属性:
mvn spring-boot:run -Dopenweathermap.api-key=your_key_here跑
mvn spring-boot:run验证服务器是否已启动:
curl http://localhost:8080/weather/health
# → {"status":"UP","service":"weather-bridge-mcp"}手动工具测试(无需MCP客户端):
curl "http://localhost:8080/weather/current/London"
curl "http://localhost:8080/weather/forecast/Paris?days=3"______________________________________________________________________
运作原理
请求流
sequenceDiagram
actor Dev as 👤 Developer
participant Claude as Claude Desktop
participant Client as MCP Client
participant Server as Weather Bridge MCP
participant API as OpenWeatherMap
Dev->>Claude: "What's the weather in Tokyo?"
Claude->>Client: tool call: getCurrentWeather("Tokyo")
Client->>Server: SSE POST /mcp/message
Server->>API: GET /weather?q=Tokyo&units=metric
API-->>Server: JSON payload
Server-->>Client: formatted weather summary
Client-->>Claude: tool result
Claude-->>Dev: "Tokyo is 18°C, partly cloudy with light winds..."应用程序组件
graph LR
subgraph app["Spring Boot Application"]
direction TB
MAIN["WeatherBridgeMcpApplication\n@SpringBootApplication"]
TCP["ToolCallbackProvider\nMethodToolCallbackProvider"]
WS["WeatherService\n@Tool getCurrentWeather\n@Tool getForecast"]
WC["WeatherController\nREST /weather/**"]
GEH["GlobalExceptionHandler\n@RestControllerAdvice"]
RT["RestTemplate"]
MAIN --> TCP
MAIN --> RT
TCP --> WS
WS --> RT
WC --> WS
end
subgraph infra["Auto-configured by spring-ai-starter-mcp-server-webmvc"]
SSE["SSE Transport\n/sse"]
MCPSRV["MCP Server"]
SSE --> MCPSRV --> TCP
end
RT --> OWM[("☁️ OpenWeatherMap")]数据模型
classDiagram
class WeatherData {
+String name
+List~WeatherCondition~ weather
+MainData main
+Wind wind
+Clouds clouds
+Sys sys
+Integer visibility
}
class MainData {
+double temp
+double feelsLike
+double tempMin
+double tempMax
+int humidity
+int pressure
}
class ForecastData {
+List~ForecastItem~ list
+City city
}
class ForecastItem {
+MainData main
+List~WeatherCondition~ weather
+Wind wind
+String dtTxt
}
WeatherData "1" --> "1" MainData
WeatherData "1" --> "0..*" WeatherCondition
ForecastData "1" --> "1..*" ForecastItem
ForecastItem "1" --> "1" MainData______________________________________________________________________
项目结构
weather-bridge-mcp/
├── src/main/java/com/example/weatherbridgemcp/
│ ├── WeatherBridgeMcpApplication.java # Entry point + bean definitions
│ ├── service/
│ │ └── WeatherService.java # @Tool methods + OpenWeatherMap client
│ ├── model/
│ │ ├── WeatherData.java # Current weather response model
│ │ └── ForecastData.java # Forecast response model
│ ├── controller/
│ │ └── WeatherController.java # REST endpoints for manual testing
│ └── exception/
│ ├── WeatherServiceException.java
│ └── GlobalExceptionHandler.java
├── src/main/resources/
│ ├── application.properties # Server + MCP + API configuration
│ └── application-dev.properties # Debug logging profile
├── src/test/ # Unit tests (MockRestServiceServer)
├── claude-config/ # Claude Desktop / Claude Code setup
├── Dockerfile # Multi-stage build
├── docker-compose.yml
└── .github/workflows/ci.yml # GitHub Actions______________________________________________________________________
发展
# Run tests (no API key needed — uses MockRestServiceServer)
mvn test
# Build a fat JAR
mvn clean package -DskipTests
# Run with debug logging
mvn spring-boot:run -Dspring.profiles.active=dev______________________________________________________________________
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
OPENWEATHERMAP_API_KEY | 是 | API密钥来自 openweathermap.org |
______________________________________________________________________
资源
______________________________________________________________________
许可证
麻省理工学院 ©2025毫米照相机
