Skip to main content
Glama

Compare resorts

compare_resorts
Read-onlyIdempotent

Side-by-side latest snow, today's Snow Score (0–100 with a rating; get_score explains it), season status and cam counts for 2–6 resorts. Every slug must resolve; an unknown one returns suggestions.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "slugs": "<slugs>"
    },
    "name": "compare_resorts"
  }
}

Input Schema

NameRequiredDescriptionDefault
slugsYes2–6 resort slugs.

Output Schema

NameRequiredDescriptionDefault
countYes
resortsYes
generatedAtYesISO-8601 UTC instant the result was generated.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / resorts / items / properties / score / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "components": {
      -        "additionalProperties": {
      -          "anyOf": [
      -            {
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "date": {
      -        "description": "YYYY-MM-DD the score is for.",
      -        "type": "string"
      -      },
      -      "rating": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "great",
      -              "good",
      -              "fair",
      -              "poor"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scoredBy": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Scorer version, e.g. `score-v1`."
      -      }
      -    },
      -    "required": [
      -      "date",
      -      "score",
      -      "rating",
      -      "components",
      -      "scoredBy"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "components": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "depthVsNormal": {
      +            "additionalProperties": false,
      +            "description": "30: snowpack against the station's 1991–2020 median (SWE); without a normal, base depth on a fixed scale capped at 27.",
      +            "properties": {
      +              "basis": {
      +                "description": "One line saying what the points rest on, quotable as is.",
      +                "type": "string"
      +              },
      +              "max": {
      +                "description": "The component's weight; the five maximums add to 100.",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "points": {
      +                "description": "Points earned, one decimal.",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "source": {
      +                "enum": [
      +                  "snotel",
      +                  "model",
      +                  "operator",
      +                  "profile",
      +                  "derived",
      +                  "none"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "points",
      +              "max",
      +              "basis",
      +              "source"
      +            ],
      +            "type": "object"
      +          },
      +          "forecast7d": {
      +            "additionalProperties": false,
      +            "description": "20: the blended next-7-day forecast total (20 in is full marks).",
      +            "properties": {
      +              "basis": {
      +                "description": "One line saying what the points rest on, quotable as is.",
      +                "type": "string"
      +              },
      +              "max": {
      +                "description": "The component's weight; the five maximums add to 100.",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "points": {
      +                "description": "Points earned, one decimal.",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "source": {
      +                "enum": [
      +                  "snotel",
      +                  "model",
      +                  "operator",
      +                  "profile",
      +                  "derived",
      +                  "none"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "points",
      +              "max",
      +              "basis",
      +              "source"
      +            ],
      +            "type": "object"
      +          },
      +          "operatingStatus": {
      +            "additionalProperties": false,
      +            "description": "10: OPEN full, PRE_SEASON and CLOSED_TODAY half, OFF_SEASON and UNKNOWN none.",
      +            "properties": {
      +              "basis": {
      +                "description": "One line saying what the points rest on, quotable as is.",
      +                "type": "string"
      +              },
      +              "max": {
      +                "description": "The component's weight; the five maximums add to 100.",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "points": {
      +                "description": "Points earned, one decimal.",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "source": {
      +                "enum": [
      +                  "snotel",
      +                  "model",
      +                  "operator",
      +                  "profile",
      +                  "derived",
      +                  "none"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "points",
      +              "max",
      +              "basis",
      +              "source"
      +            ],
      +            "type": "object"
      +          },
      +          "recentSnow7d": {
      +            "additionalProperties": false,
      +            "description": "25: measured or modelled new snow over the last 7 days (24 in is full marks).",
      +            "properties": {
      +              "basis": {
      +                "description": "One line saying what the points rest on, quotable as is.",
      +                "type": "string"
      +              },
      +              "max": {
      +                "description": "The component's weight; the five maximums add to 100.",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "points": {
      +                "description": "Points earned, one decimal.",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "source": {
      +                "enum": [
      +                  "snotel",
      +                  "model",
      +                  "operator",
      +                  "profile",
      +                  "derived",
      +                  "none"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "points",
      +              "max",
      +              "basis",
      +              "source"
      +            ],
      +            "type": "object"
      +          },
      +          "snowQuality": {
      +            "additionalProperties": false,
      +            "description": "15: days since the last snow day × the 3-day high temperature × the engine's surface tags.",
      +            "properties": {
      +              "basis": {
      +                "description": "One line saying what the points rest on, quotable as is.",
      +                "type": "string"
      +              },
      +              "max": {
      +                "description": "The component's weight; the five maximums add to 100.",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "points": {
      +                "description": "Points earned, one decimal.",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "source": {
      +                "enum": [
      +                  "snotel",
      +                  "model",
      +                  "operator",
      +                  "profile",
      +                  "derived",
      +                  "none"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "points",
      +              "max",
      +              "basis",
      +              "source"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "depthVsNormal",
      +          "recentSnow7d",
      +          "forecast7d",
      +          "snowQuality",
      +          "operatingStatus"
      +        ],
      +        "type": "object"
      +      },
      +      "date": {
      +        "description": "YYYY-MM-DD the score is for (Mountain-time day of the scoring run).",
      +        "type": "string"
      +      },
      +      "rating": {
      +        "description": "The score's four-tier label: great ≥ 75, good ≥ 55, fair ≥ 35, else poor.",
      +        "enum": [
      +          "great",
      +          "good",
      +          "fair",
      +          "poor"
      +        ],
      +        "type": "string"
      +      },
      +      "score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scoredBy": {
      +        "const": "algorithmic",
      +        "description": "Always `algorithmic`: a fixed function of measured and modelled inputs, never an editorial call.",
      +        "type": "string"
      +      },
      +      "tagline": {
      +        "description": "Dated sentence to quote: the score, its rating and the components strongest first.",
      +        "type": "string"
      +      },
      +      "version": {
      +        "description": "Formula version, e.g. `score-v1`; a change re-scores the history.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date",
      +      "score",
      +      "rating",
      +      "tagline",
      +      "components",
      +      "scoredBy",
      +      "version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / resorts / items / properties / score / description
      Previous value: -"Today's 0–100 score, once the scorer is live."New value: +"Today's 0–100 Snow Score with components (P7). Null when the scorer has not written a row at most 3 days old; absent only when the score table is not served."
  2. Changed7 schema fields changed
    • addedOutput schema / properties / resorts / items / properties / forecast / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "issuedAt": {
      +        "description": "Newest model issue instant among the runs blended.",
      +        "type": "string"
      +      },
      +      "modelCount": {
      +        "description": "Models contributing to the first day.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "models": {
      +        "description": "Every model id that contributed to any day.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "next48hCm": {
      +        "type": "number"
      +      },
      +      "next48hIn": {
      +        "type": "number"
      +      },
      +      "peak": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "cm": {
      +                "type": "number"
      +              },
      +              "date": {
      +                "description": "The day with the most blended snowfall.",
      +                "type": "string"
      +              },
      +              "in": {
      +                "type": "number"
      +              },
      +              "windowDays": {
      +                "description": "Consecutive days around the peak with at least 1 cm (the storm window).",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "date",
      +              "in",
      +              "cm",
      +              "windowDays"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Null when no day has any blended snow."
      +      },
      +      "point": {
      +        "description": "The elevation the summary is for: summit when the resort has a summit point, else base.",
      +        "enum": [
      +          "summit",
      +          "base"
      +        ],
      +        "type": "string"
      +      },
      +      "total14dCm": {
      +        "type": "number"
      +      },
      +      "total14dIn": {
      +        "type": "number"
      +      },
      +      "total7dCm": {
      +        "type": "number"
      +      },
      +      "total7dIn": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "point",
      +      "issuedAt",
      +      "modelCount",
      +      "models",
      +      "next48hIn",
      +      "next48hCm",
      +      "total7dIn",
      +      "total7dCm",
      +      "total14dIn",
      +      "total14dCm",
      +      "peak"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / resorts / items / properties / forecast / description
      Previous value: -"Latest run per model and point, once stored forecasts are live."New value: +"Headline numbers from the blended 14-day forecast (summit point when one exists). Null when no run is current; absent on list and compare rows. The full daily blend and every model run are at `/resorts/{slug}/forecast`."
    • removedOutput schema / properties / resorts / items / properties / forecast / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "days": {
      -      "items": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "date": {
      -            "description": "YYYY-MM-DD, local to the resort.",
      -            "type": "string"
      -          },
      -          "precipProb": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "0–100."
      -          },
      -          "snowfallCm": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "snowfallHi": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "snowfallLo": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "Low end of the spread across models / members; null for a single model."
      -          },
      -          "tempMax": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "°C as the models report it."
      -          },
      -          "tempMin": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "weatherCode": {
      -            "anyOf": [
      -              {
      -                "maximum": 9007199254740991,
      -                "minimum": -9007199254740991,
      -                "type": "integer"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "WMO weather interpretation code."
      -          },
      -          "windGust": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "km/h."
      -          }
      -        },
      -        "required": [
      -          "date",
      -          "snowfallCm",
      -          "snowfallLo",
      -          "snowfallHi",
      -          "tempMax",
      -          "tempMin",
      -          "precipProb",
      -          "windGust",
      -          "weatherCode"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "horizonDays": {
      -      "maximum": 9007199254740991,
      -      "minimum": -9007199254740991,
      -      "type": "integer"
      -    },
      -    "id": {
      -      "type": "string"
      -    },
      -    "issuedAt": {
      -      "type": "string"
      -    },
      -    "model": {
      -      "description": "Model id as the provider names it, or `blend` for PeakCam's skill-weighted blend.",
      -      "type": "string"
      -    },
      -    "point": {
      -      "enum": [
      -        "summit",
      -        "base"
      -      ],
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "id",
      -    "point",
      -    "model",
      -    "issuedAt",
      -    "horizonDays",
      -    "days"
      -  ],
      -  "type": "object"
      -}
    • removedOutput schema / properties / resorts / items / properties / forecast / type
      Removed value: -"array"
    • changedOutput schema / properties / resorts / items / properties / forecastScores / description
      Previous value: -"Per-model verification at this resort, once computed."New value: +"Per-model verification at this resort over 90 days, ranked; empty until the scorer has measured days. Detail at `/resorts/{slug}/forecast-accuracy`."
    • addedOutput schema / properties / resorts / items / properties / forecastScores / items / properties / rank
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "1 = lowest day-1 MAE among the models scored at this resort (the blend is ranked too). Null before the first scoring run."
      +}
    • changedOutput schema / properties / resorts / items / properties / forecastScores / items / required
      Previous value: -[
      -  "model",
      -  "periodDays",
      -  "day1Mae",
      -  "day3Mae",
      -  "day7Mae",
      -  "samples",
      -  "biasRatio",
      -  "computedAt"
      -]New value: +[
      +  "model",
      +  "periodDays",
      +  "day1Mae",
      +  "day3Mae",
      +  "day7Mae",
      +  "samples",
      +  "biasRatio",
      +  "computedAt",
      +  "rank"
      +]
  3. Changed12 schema fields changed
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / ageMinutes
      Added value: +{
      +  "description": "Minutes between `observedAt` and `generatedAt`. Daily sources read 1,440 or more; hourly sources under 120 when live.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / attribution
      Added value: +{
      +  "description": "The credit line the provider's terms ask for.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / distanceKm
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Great-circle distance from the resort's coordinates."
      +}
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / elevationFt
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Station elevation. Every value below describes this elevation."
      +}
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / newSnowIn / description
      Previous value: -"New snow since the previous observation, inches."New value: +"New snow over the provider's own period (24 h for daily sources), inches. Null for hourly sources, which do not measure it."
    • changedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / observedAt / description
      Previous value: -"ISO-8601 instant of the observation."New value: +"ISO-8601 instant of the observation; a daily value is stamped at the end of its UTC day."
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / role
      Added value: +{
      +  "description": "summit / mid / base by the station's elevation against the resort's vertical.",
      +  "enum": [
      +    "summit",
      +    "mid",
      +    "base",
      +    "approach"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / source
      Added value: +{
      +  "enum": [
      +    "snotel",
      +    "ghcn",
      +    "nws",
      +    "bc_asws",
      +    "eccc"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / sourceId
      Added value: +{
      +  "description": "The provider's own station id, e.g. `AMB`, `1308:UT:SNTL`, `USC00420072`.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / resorts / items / properties / measuredNow / items / properties / stationId / description
      Added value: +"PeakCam station id; joins `stations[]`."
    • changedOutput schema / properties / resorts / items / properties / measuredNow / items / required
      Previous value: -[
      -  "stationId",
      -  "observedAt",
      -  "snowDepthIn",
      -  "sweIn",
      -  "newSnowIn",
      -  "tempF",
      -  "windMph"
      -]New value: +[
      +  "stationId",
      +  "role",
      +  "source",
      +  "sourceId",
      +  "name",
      +  "elevationFt",
      +  "distanceKm",
      +  "observedAt",
      +  "ageMinutes",
      +  "snowDepthIn",
      +  "sweIn",
      +  "newSnowIn",
      +  "tempF",
      +  "windMph",
      +  "attribution"
      +]
  4. Changed9 schema fields changed
    • addedOutput schema / properties / resorts / items / properties / forecast
      Added value: +{
      +  "description": "Latest run per model and point, once stored forecasts are live.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "days": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "date": {
      +              "description": "YYYY-MM-DD, local to the resort.",
      +              "type": "string"
      +            },
      +            "precipProb": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "0–100."
      +            },
      +            "snowfallCm": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "snowfallHi": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "snowfallLo": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "Low end of the spread across models / members; null for a single model."
      +            },
      +            "tempMax": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "°C as the models report it."
      +            },
      +            "tempMin": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "weatherCode": {
      +              "anyOf": [
      +                {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "WMO weather interpretation code."
      +            },
      +            "windGust": {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "km/h."
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "snowfallCm",
      +            "snowfallLo",
      +            "snowfallHi",
      +            "tempMax",
      +            "tempMin",
      +            "precipProb",
      +            "windGust",
      +            "weatherCode"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "horizonDays": {
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "type": "string"
      +      },
      +      "issuedAt": {
      +        "type": "string"
      +      },
      +      "model": {
      +        "description": "Model id as the provider names it, or `blend` for PeakCam's skill-weighted blend.",
      +        "type": "string"
      +      },
      +      "point": {
      +        "enum": [
      +          "summit",
      +          "base"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "point",
      +      "model",
      +      "issuedAt",
      +      "horizonDays",
      +      "days"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / resorts / items / properties / forecastScores
      Added value: +{
      +  "description": "Per-model verification at this resort, once computed.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "biasRatio": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Sum(forecast) / sum(observed); above 1 means the model over-forecasts snow."
      +      },
      +      "computedAt": {
      +        "type": "string"
      +      },
      +      "day1Mae": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Mean absolute error of the day-1 snowfall forecast, cm."
      +      },
      +      "day3Mae": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "day7Mae": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "model": {
      +        "type": "string"
      +      },
      +      "periodDays": {
      +        "description": "Trailing verification window, days.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "samples": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "model",
      +      "periodDays",
      +      "day1Mae",
      +      "day3Mae",
      +      "day7Mae",
      +      "samples",
      +      "biasRatio",
      +      "computedAt"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / resorts / items / properties / location / properties / summitElevationFt
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / resorts / items / properties / location / required
      Previous value: -[
      -  "state",
      -  "region",
      -  "country",
      -  "lat",
      -  "lon",
      -  "baseElevationFt"
      -]New value: +[
      +  "state",
      +  "region",
      +  "country",
      +  "lat",
      +  "lon",
      +  "baseElevationFt",
      +  "summitElevationFt"
      +]
    • addedOutput schema / properties / resorts / items / properties / measuredNow
      Added value: +{
      +  "description": "Latest observation per station, once the station layer is live.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "newSnowIn": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "New snow since the previous observation, inches."
      +      },
      +      "observedAt": {
      +        "description": "ISO-8601 instant of the observation.",
      +        "type": "string"
      +      },
      +      "snowDepthIn": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "stationId": {
      +        "type": "string"
      +      },
      +      "sweIn": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "tempF": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "windMph": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "stationId",
      +      "observedAt",
      +      "snowDepthIn",
      +      "sweIn",
      +      "newSnowIn",
      +      "tempF",
      +      "windMph"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / resorts / items / properties / profile
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "aliases": {
      +      "description": "Other names the resort is known by, e.g. `A-Basin`.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "annualSnowfallIn": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Operator-stated average annual snowfall, inches."
      +    },
      +    "description": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "descriptionSource": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "operator",
      +            "generated",
      +            "editor"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "`operator`: the resort's own copy. `generated`: a model-written draft, labelled as such on the page. `editor`: hand-written by PeakCam."
      +    },
      +    "liftsTotal": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "longestRunMi": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "passes": {
      +      "description": "Multi-resort passes the resort is on.",
      +      "items": {
      +        "enum": [
      +          "ikon",
      +          "epic",
      +          "mountain-collective",
      +          "indy",
      +          "power"
      +        ],
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "runsTotal": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "skiableAcres": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "trailMapUrl": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The operator's trail map (linked, never copied)."
      +    },
      +    "verticalFt": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "wikidataId": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "required": [
      +    "runsTotal",
      +    "liftsTotal",
      +    "skiableAcres",
      +    "verticalFt",
      +    "annualSnowfallIn",
      +    "longestRunMi",
      +    "description",
      +    "descriptionSource",
      +    "trailMapUrl",
      +    "wikidataId",
      +    "aliases",
      +    "passes"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / resorts / items / properties / score
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "components": {
      +          "additionalProperties": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "date": {
      +          "description": "YYYY-MM-DD the score is for.",
      +          "type": "string"
      +        },
      +        "rating": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "great",
      +                "good",
      +                "fair",
      +                "poor"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "score": {
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "scoredBy": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Scorer version, e.g. `score-v1`."
      +        }
      +      },
      +      "required": [
      +        "date",
      +        "score",
      +        "rating",
      +        "components",
      +        "scoredBy"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Today's 0–100 score, once the scorer is live."
      +}
    • addedOutput schema / properties / resorts / items / properties / stations
      Added value: +{
      +  "description": "Observation stations serving the resort, once the station layer is live.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "distanceKm": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Great-circle distance from the resort's coordinates."
      +      },
      +      "elevationFt": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "id": {
      +        "description": "PeakCam station id (UUID).",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "enum": [
      +          "snotel",
      +          "scan",
      +          "nws_obs",
      +          "metar",
      +          "ghcn",
      +          "bc_asws",
      +          "eccc",
      +          "road_cam"
      +        ],
      +        "type": "string"
      +      },
      +      "lat": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "lon": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "rank": {
      +        "description": "1 = the preferred station for its role.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "role": {
      +        "description": "Where the station sits relative to the resort.",
      +        "enum": [
      +          "summit",
      +          "mid",
      +          "base",
      +          "approach"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Provider, e.g. `nrcs`, `nws`, `eccc`, `udot`.",
      +        "type": "string"
      +      },
      +      "sourceId": {
      +        "description": "The provider's own identifier (SNOTEL triplet, ICAO code, GHCN id).",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "source",
      +      "sourceId",
      +      "name",
      +      "kind",
      +      "role",
      +      "lat",
      +      "lon",
      +      "elevationFt",
      +      "distanceKm",
      +      "rank"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / resorts / items / required
      Previous value: -[
      -  "slug",
      -  "name",
      -  "canonicalUrl",
      -  "apiUrl",
      -  "location",
      -  "snow",
      -  "season",
      -  "websiteUrl",
      -  "attribution",
      -  "license",
      -  "updatedAt",
      -  "camCount",
      -  "liveCamCount"
      -]New value: +[
      +  "slug",
      +  "name",
      +  "canonicalUrl",
      +  "apiUrl",
      +  "location",
      +  "profile",
      +  "snow",
      +  "season",
      +  "websiteUrl",
      +  "attribution",
      +  "license",
      +  "updatedAt",
      +  "camCount",
      +  "liveCamCount"
      +]
  5. First observed

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent and non-destructive semantics, and an output schema exists. The description adds genuinely new behavior: unknown slugs cause failure but return suggestions, which tells the agent how to recover from bad input.

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, no filler; the field list and the input/resolution rule are both front-loaded and each clause carries distinct information.

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

Completeness5/5

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

With annotations covering safety, a full output schema covering return values, and a 100%-covered input schema, the description only needs to add field scope and input-resolution behavior — both present. Nothing required to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds validation semantics beyond the schema — 'every slug must resolve' and the suggestion-returning fallback on unknown slugs — which shapes how the agent should supply and vet the slugs.

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 (compare), resource (resorts), a precise scope (2–6), and enumerates the compared fields: latest snow, Snow Score, season status, cam counts. The cardinality and cross-resort nature cleanly separate it from single-resort siblings like get_resort_conditions.

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 implied by the '2–6 resorts / side-by-side' framing, and it points to get_score for Score explanation plus search_resorts (via schema) for slug sourcing. It never explicitly says when to prefer this over get_resort_conditions or get_resort_profile for a single resort.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.