# avalanche-org-mcp-server
[](https://www.npmjs.com/package/avalanche-org-mcp-server)
[](https://github.com/haydenwade/avalanche-org-mcp-server/actions/workflows/npm-publish.yml)
[](https://github.com/haydenwade/avalanche-org-mcp-server/actions/workflows/docker-publish.yml)
A minimal [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server that wraps the [Avalanche.org Public API](https://api.avalanche.org/) map-layer endpoints. It lets LLMs look up avalanche danger ratings by location, retrieve raw forecast GeoJSON, and query historic conditions.
## Features
- **Danger lookup by lat/lon** — find the avalanche zone for any point and get its current danger rating
- **Historic danger lookup** — same as above, but for a specific past date
- **Raw map-layer GeoJSON** — full FeatureCollection for all avalanche centers, or scoped to one center
Data sourced from the [Avalanche.org Public API](https://api.avalanche.org/). See the [API docs](https://github.com/NationalAvalancheCenter/Avalanche.org-Public-API-Docs) for details.
## Quick Start
### Claude Desktop (npx — recommended)
Add this to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
```json
{
"mcpServers": {
"avalanche-org": {
"command": "npx",
"args": ["-y", "avalanche-org-mcp-server"]
}
}
}
```
No install required. Claude will download and run it automatically.
### Global npm install
```bash
npm install -g avalanche-org-mcp-server
```
```json
{
"mcpServers": {
"avalanche-org": {
"command": "avalanche-org-mcp-server"
}
}
}
```
### Docker
```bash
docker pull ghcr.io/haydenwade/avalanche-org-mcp-server:latest
```
```json
{
"mcpServers": {
"avalanche-org": {
"command": "docker",
"args": ["run", "--rm", "-i", "ghcr.io/haydenwade/avalanche-org-mcp-server:latest"]
}
}
}
```
### From source
```bash
git clone https://github.com/haydenwade/avalanche-org-mcp-server.git
cd avalanche-org-mcp-server
npm install
npm run build
```
```json
{
"mcpServers": {
"avalanche-org": {
"command": "node",
"args": ["/absolute/path/to/avalanche-org-mcp-server/dist/src/index.js"]
}
}
}
```
## Tools
### `avalanche_danger_rating_by_point`
Get the current avalanche danger rating for a lat/lon point. Returns the zone the point falls in, or the nearest zone if `preferNearest` is true.
| Parameter | Type | Required | Description |
|---|---|---|---|
| `lat` | number | yes | Latitude in decimal degrees |
| `lon` | number | yes | Longitude in decimal degrees |
| `preferNearest` | boolean | no | Fall back to nearest zone if point is outside all polygons (default: `true`) |
| `centerId` | string | no | Scope search to a specific avalanche center (e.g. `"UAC"`, `"CBAC"`) |
**Example input:**
```json
{ "lat": 40.5763, "lon": -111.7522, "preferNearest": true, "centerId": "UAC" }
```
Example output
```json
{
"match": "inside_zone",
"distance_km": 0,
"distance_miles": 0,
"zone": {
"id": "zone-1",
"name": "Salt Lake",
"state": "UT"
},
"center": {
"id": "UAC",
"name": "Utah Avalanche Center",
"timezone": "America/Denver",
"link": "https://utahavalanchecenter.org"
},
"danger": {
"level": 3,
"label": "Considerable",
"color": "#f1a302"
},
"travel_advice": "Dangerous avalanche conditions. Careful snowpack evaluation, cautious route-finding and conservative decision-making essential.",
"forecast_url": "https://utahavalanchecenter.org/forecast/salt-lake",
"validity": {
"start_date": "2026-03-22",
"end_date": "2026-03-23"
},
"warning": null
}
```
---
### `historic_avalanche_danger_rating_by_point`
Same as above, but for a specific historic date. Returns all the same fields plus `day`.
| Parameter | Type | Required | Description |
|---|---|---|---|
| `lat` | number | yes | Latitude in decimal degrees |
| `lon` | number | yes | Longitude in decimal degrees |
| `day` | string | yes | Date in `YYYY-MM-DD` format |
| `preferNearest` | boolean | no | Fall back to nearest zone (default: `true`) |
| `centerId` | string | no | Scope to an avalanche center |
**Example input:**
```json
{ "lat": 40.5763, "lon": -111.7522, "day": "2025-02-24", "preferNearest": true }
```
Example output
```json
{
"match": "inside_zone",
"distance_km": 0,
"distance_miles": 0,
"zone": { "id": "zone-1", "name": "Salt Lake", "state": "UT" },
"center": { "id": "UAC", "name": "Utah Avalanche Center", "..." : "..." },
"danger": { "level": 3, "label": "Considerable", "color": "#f1a302" },
"travel_advice": "Dangerous avalanche conditions. ...",
"forecast_url": "https://utahavalanchecenter.org/forecast/salt-lake",
"validity": { "start_date": "2025-02-24", "end_date": "2025-02-25" },
"warning": null,
"day": "2025-02-24"
}
```
---
### `raw_map_layer`
Returns the raw Avalanche.org map-layer GeoJSON FeatureCollection for **all** avalanche centers.
| Parameter | Type | Required | Description |
|---|---|---|---|
| `day` | string | no | Historic date in `YYYY-MM-DD` format |
Example output
```json
{
"geojson": {
"type": "FeatureCollection",
"features": [ "... full GeoJSON features ..." ]
}
}
```
---
### `raw_map_layer_by_avalanche_center`
Returns the raw map-layer GeoJSON FeatureCollection for a **single** avalanche center.
| Parameter | Type | Required | Description |
|---|---|---|---|
| `centerId` | string | yes | Avalanche center ID (e.g. `"CBAC"`, `"NWAC"`, `"UAC"`) |
| `day` | string | no | Historic date in `YYYY-MM-DD` format |
Example output
```json
{
"geojson": {
"type": "FeatureCollection",
"features": [ "... full GeoJSON features ..." ]
}
}
```
## Development
Requires Node.js >= 18.
```bash
npm install
npm run build
npm test
```
To interactively test tools with the [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector):
```bash
npx @modelcontextprotocol/inspector node dist/src/index.js
```
### Project structure
```
src/
index.ts # Entry point — server setup + stdio transport
tools.ts # Tool registration
constants.ts # API URLs and timeouts
types.ts # GeoJSON type definitions
api/
mapLayer.ts # Map-layer fetch + GeoJSON normalization
lib/
geometry.ts # Point-in-polygon, haversine distance, bounds
dangerLookup.ts # Danger rating lookup logic
validation.ts # Date and coordinate validation
test/
*.test.ts # Tests (node:test)
```
## Contributing
1. Fork the repo
2. Create a feature branch (`git checkout -b my-feature`)
3. Make your changes and add tests
4. Run `npm test` to make sure everything passes
5. Open a pull request
## License
MIT