Skip to main content
Glama

Compare resorts

compare_resorts
Read-onlyIdempotent

Side-by-side latest snow, season status and cam counts for 2–6 resorts. Every slug must resolve; an unknown one returns suggestions.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
slugsYes2–6 resort slugs.

Output Schema

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +]
  2. First observed

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile needs no restating. The description does add one genuine behavioral fact beyond the annotations — an unresolvable slug still returns suggestions rather than failing outright — but says nothing about ordering, partial failures, or the response shape.

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 filler: the first states scope and payload, the second states the failure behavior. Information is front-loaded and 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?

With an output schema present and annotations covering safety, the description only needs to set scope and edge-case behavior, which it does. The remaining gap is routing — it never tells the agent when this beats the single-resort or discovery siblings, which matters in a seven-tool family.

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 coverage is 100% and the schema already documents the slug format, its kebab-case convention, its origin (search_resorts), and the 2–6 bounds. The description only echoes the count constraint, adding no syntax or format detail beyond what the schema provides.

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?

Names a specific verb+resource ('compare_resorts') and specifies the payload (latest snow, season status, cam counts) plus an arity range of 2–6 resorts, which implicitly separates it from single-resort siblings like get_resort_conditions. It never names an alternative explicitly, so sibling differentiation is by inference rather than statement.

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?

The '2–6 resorts' framing implies this is the multi-resort comparison tool, and the slug-resolution note tells the agent what happens on bad input. However, it gives no explicit when-to-use-vs-alternatives guidance (e.g., single resort → get_resort_conditions, or discovery → search_resorts), leaving the agent to infer routing.

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.