Skip to main content
Glama
haydenwade

avalanche-org-mcp-server

by haydenwade

avalanche-org-mcp-server

npm version Publish npm package Publish container image

A minimal Model Context Protocol (MCP) server that wraps the Avalanche.org Public API 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. See the API docs for details.

Related MCP server: Weather MCP Server

Quick Start

Add this to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "avalanche-org": {
      "command": "npx",
      "args": ["-y", "avalanche-org-mcp-server"]
    }
  }
}

No install required. Claude will download and run it automatically.

Global npm install

npm install -g avalanche-org-mcp-server
{
  "mcpServers": {
    "avalanche-org": {
      "command": "avalanche-org-mcp-server"
    }
  }
}

Docker

docker pull ghcr.io/haydenwade/avalanche-org-mcp-server:latest
{
  "mcpServers": {
    "avalanche-org": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "ghcr.io/haydenwade/avalanche-org-mcp-server:latest"]
    }
  }
}

From source

git clone https://github.com/haydenwade/avalanche-org-mcp-server.git
cd avalanche-org-mcp-server
npm install
npm run build
{
  "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:

{ "lat": 40.5763, "lon": -111.7522, "preferNearest": true, "centerId": "UAC" }
{
  "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:

{ "lat": 40.5763, "lon": -111.7522, "day": "2025-02-24", "preferNearest": true }
{
  "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

{
  "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

{
  "geojson": {
    "type": "FeatureCollection",
    "features": [ "... full GeoJSON features ..." ]
  }
}

Development

Requires Node.js >= 18.

npm install
npm run build
npm test

To interactively test tools with the MCP Inspector:

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

Available Tools

4 tools
avalanche_danger_rating_by_pointA

Get the current avalanche danger rating and forecast metadata for the avalanche zone containing a latitude/longitude point. Can fall back to the nearest zone.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees.
lonYesLongitude in decimal degrees.
centerIdNoOptional avalanche center ID to scope the search (example: UAC).
preferNearestNoIf true (default), return the nearest zone when the point is outside all polygons.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does disclose one meaningful trait - falling back to the nearest zone when the point is outside all polygons - but says nothing about data source, staleness, auth, rate limits, or what happens when no zone is found at all.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no waste. The core purpose is front-loaded, and the fallback caveat is correctly placed second as a qualifier.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a full-coverage geo lookup with no output schema and no annotations, the description tells the agent what it returns (danger rating plus forecast metadata) and how the out-of-polygon case resolves. It omits the no-zone-found outcome and data freshness, but is otherwise sufficient to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so lat, lon, centerId, and preferNearest are already fully documented in the schema, including the default for preferNearest. The description adds no syntax or format detail beyond the schema, which is the correct baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (current avalanche danger rating plus forecast metadata) and pins the spatial scope to the zone containing a lat/lon point. The word 'current' implicitly separates it from the sibling historic_avalanche_danger_rating_by_point, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'current' signals this is the real-time counterpart to the historic tool, and the fallback sentence hints at when nearest-zone behavior applies. There is no explicit when-to-use, when-not-to-use, or named alternative, so the agent must infer routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

historic_avalanche_danger_rating_by_pointA

Get the avalanche danger rating and forecast metadata for the avalanche zone containing a latitude/longitude point on a specific historic day (YYYY-MM-DD). Can fall back to the nearest zone.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayYesHistoric day in YYYY-MM-DD format.
latYesLatitude in decimal degrees.
lonYesLongitude in decimal degrees.
centerIdNoOptional avalanche center ID to scope the search (example: UAC).
preferNearestNoIf true (default), return the nearest zone when the point is outside all polygons.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses the nearest-zone fallback behavior and mentions forecast metadata, but says nothing about what happens when preferNearest is false and no zone matches, about error conditions, or about auth/rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with zero waste; the core purpose and the fallback caveat are both front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter spatial/temporal query with no output schema, the description covers what is returned only generically ('danger rating and forecast metadata') and omits failure behavior when no zone is found. Adequate but with real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented. The description reinforces the lat/lon and YYYY-MM-DD semantics and the fallback role of preferNearest, but adds no format or edge-case detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the avalanche danger rating and forecast metadata'), names the zone-containment logic, and scopes it to 'a specific historic day'. The word 'historic' cleanly distinguishes it from the sibling avalanche_danger_rating_by_point.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'historic day' qualifier gives clear context for when this tool applies versus the current-condition sibling, and the fallback note signals behavior when the point misses all polygons. It stops short of explicitly naming the non-historic alternative or stating when-not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

raw_map_layerA

Return the raw Avalanche.org map-layer GeoJSON FeatureCollection for all avalanche centers. Supports an optional historic day (YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoOptional historic day in YYYY-MM-DD format.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does useful work: it names the exact return type (GeoJSON FeatureCollection) and flags the unprocessed 'raw' nature of the data, which matters given there is no output schema. It omits authentication, rate-limit, and data-freshness context, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core return value front-loaded and the optional parameter qualification second. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter read tool with no output schema, the description supplies the missing return-shape information that the schema and annotations cannot. It lacks only peripheral operational detail, so it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single parameter is already documented. The description restates the same 'optional historic day (YYYY-MM-DD)' information without adding format edge cases, range limits, or defaults, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Return'), the exact resource ('raw Avalanche.org map-layer GeoJSON FeatureCollection'), and the scope ('all avalanche centers'), which distinguishes it from the sibling raw_map_layer_by_avalanche_center that scopes to a single center.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the 'all avalanche centers' scope hints at when to pick this over the by-center sibling, but there is no explicit statement of when to use it, when to avoid it, or how it relates to the danger-rating siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

raw_map_layer_by_avalanche_centerA

Return the raw Avalanche.org map-layer GeoJSON FeatureCollection for a specific avalanche center ID. Supports an optional historic day (YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoOptional historic day in YYYY-MM-DD format.
centerIdYesAvalanche center ID (example: UAC).

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden but only discloses the return shape (raw GeoJSON FeatureCollection) and the optional historic parameter. It omits auth requirements, rate limits, whether historic days beyond a retention window are unavailable, and whether the map layer is a live or archived snapshot.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core purpose front-loaded and the optional parameter called out second. Nothing is repeated and every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so naming the GeoJSON FeatureCollection return is valuable and largely satisfies return-value expectations for a two-parameter read. Slight gaps remain around historic-data availability and error behavior for invalid center IDs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both centerId (example UAC) and day (YYYY-MM-DD) documented in the schema. The description repeats only the day format and the center-ID scoping, adding no syntax or constraint detail beyond what the schema already provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (raw Avalanche.org map-layer GeoJSON FeatureCollection) scoped to a specific avalanche center ID. It implicitly distinguishes itself from the sibling raw_map_layer by requiring a center ID, but never names that sibling or states the difference explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the center-ID scoping and the optional historic day suggest when this tool applies, but there is no explicit when-to-use, when-not-to-use, or named alternative (e.g., raw_map_layer for an unfiltered layer). An agent must infer the routing decision.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.4
    • First observedavalanche_danger_rating_by_point
    • First observedhistoric_avalanche_danger_rating_by_point
    • First observedraw_map_layer
    • First observedraw_map_layer_by_avalanche_center

TDQS

A3.7/5.0

Scored across 4 tools

Disambiguation4/5

The four tools split cleanly along two axes: current vs historic ratings (tools 1 vs 2) and all-centers vs single-center raw layers (tools 3 vs 4). The main potential confusion is between the point-based rating tools and the map-layer tools, since raw_map_layer also accepts a historic day, but their output intent (formatted rating vs raw GeoJSON) differs enough to keep them distinct.

Naming Consistency4/5

All names use consistent snake_case with descriptive suffixes (_by_point, _by_avalanche_center) and clear domain prefixes (avalanche_danger_rating, historic_, raw_map_layer). It is not a strict verb_noun convention, but the modifiers are applied predictably across the set, so an agent can infer related tools.

Tool Count4/5

Four tools is a tight, well-scoped surface for a narrow domain (avalanche danger lookups). Each tool covers a distinct query dimension, though the set sits at the low end and one could argue a couple more (e.g. by-center rating) would round it out.

Completeness3/5

The surface covers current/historic point ratings and raw map layers for all or a single center, but there is no direct way to query a formatted danger rating by avalanche center ID, nor to list available centers/zones. Raw GeoJSON partially compensates, but some lookup paths dead-end.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to access real-time US weather forecasts and alerts through the National Weather Service API.
    2
    5 npm
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    Provides real-time US weather alerts and forecasts by integrating with the National Weather Service API. It enables AI assistants to fetch state-specific alerts and detailed local forecasts using geographic coordinates.
    2
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides avalanche forecasts, danger ratings, and field observations for US avalanche centers, Canadian regions, and Quebec's Chic-Chocs via natural language queries.
    MIT