Skip to main content
Glama

PeakCam Snow

Server Details

Live snow reports, SNOTEL measurements, webcams and powder rankings for 150 ski resorts.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
jaredschueler07/peakcam
GitHub Stars
0

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: search for slugs, retrieve single-resort conditions, view history, get forecasts, inspect cams, check opening dates, compare multiple resorts, or rank powder. Overlaps between compare_resorts and get_resort_conditions are resolved by the multi-resort vs single-resort distinction.

Naming Consistency5/5

All tool names use consistent snake_case verb_noun patterns (compare_resorts, find_powder, get_forecast, search_resorts, etc.). The convention is predictable throughout the set.

Tool Count5/5

Eight tools are well-scoped for a resort snow-reporting service, with each tool covering a distinct query type. The set is neither bloated nor thin.

Completeness4/5

Core workflows are covered: discovery, current conditions, history, forecast, cams, opening dates, comparison, and powder ranking. Minor gaps include no explicit list-all-resorts tool and no lift/trail status, though search_resorts and conditions largely work around these.

Available Tools

8 tools
compare_resortsCompare resortsA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
slugsYes2–6 resort slugs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
resortsYes
generatedAtYesISO-8601 UTC instant the result was generated.

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.

find_powderFind powderA
Read-onlyIdempotent
Inspect

Rank resorts by new snow in the last 24 or 48 hours, optionally within one state/province and above a minimum. Pass sourceOnly="snotel" to answer "where did it snow most, measured only" with station data alone. Resorts with no report are left out; zero inches is a measurement. Sources: snotel = measured at a USDA NRCS SNOTEL station near the resort (station elevation, not the summit), open_meteo = weather-model estimate for resorts without a station.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows to return, 1–25.
stateNoUS state or Canadian province code (`CO`, `UT`, `BC`), or for the Andes the country name PeakCam lists (`Chile`, `Argentina`). Case-insensitive.
windowNoWhich window ranks first; the other breaks ties.24h
minInchesNoKeep only resorts with at least this many inches in the window.
sourceOnlyNo`snotel` keeps only station-measured reports and drops model estimates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
windowYes
filtersYes
licenseYes
resultsYes
attributionYes
generatedAtYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark it read-only, idempotent, and non-destructive, so the description adds valuable context about data sources (SNOTEL station elevation vs model estimate) and that missing reports are omitted while zero inches counts as a measurement. It doesn't cover rate limits or response format, but output schema exists.

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

Conciseness4/5

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

The description is front-loaded with the core action and then adds useful clarifications in three sentences, but the source definitions at the end are somewhat dense and could be more compact.

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?

Given the presence of an output schema and complete parameter documentation, the description provides all necessary behavioral context: ranking scope, exclusion rule, zero-inch semantics, and source distinctions. Nothing critical is missing for correct invocation.

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%, so the schema fully documents all parameters; the description adds meaning for sourceOnly and minInches but mostly repeats what the schema provides. Baseline 3 is appropriate.

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?

The description states a specific verb and resource ('Rank resorts by new snow') with the scope of the ranking window, and distinguishes itself from siblings like compare_resorts or get_snow_history by focusing on ranking rather than comparison or history.

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?

It clearly explains when to use sourceOnly='snotel' ('where did it snow most, measured only') and that resorts without reports are excluded, but it doesn't explicitly name alternative tools or say when not to use this one.

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

get_forecastResort forecastA
Read-onlyIdempotent
Inspect

Five-day National Weather Service forecast for a US resort (daily high/low, text forecast, precipitation chance, wind) with a rough snow estimate derived from the forecast wording. NWS covers US resorts only; Canadian and Andes resorts return available=false.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesPeakCam resort slug, lowercase kebab-case, e.g. `breckenridge` or `ski-portillo`. Get it from search_resorts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
noteYes
slugYes
periodsYes
providerYes
availableYes
generatedAtYesISO-8601 UTC instant the result was generated.
canonicalUrlYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety and idempotency are covered. The description adds genuinely useful behavior beyond that: the snow figure is explicitly a 'rough estimate derived from the forecast wording' (an accuracy caveat) and the US-only coverage with an available=false sentinel rather than an error.

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 core purpose and output contents lead, and the geographic limitation is placed immediately after so it is read before the call is made.

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?

An output schema exists, so return values need not be explained, and the description covers the key caveats (derived snow estimate, US-only coverage, available=false). The only omission is guidance on sibling selection, which is a minor gap for a single-parameter read tool.

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% and the single slug parameter is fully documented there, including the kebab-case format and the pointer to search_resorts. The description adds nothing about the parameter, which is the expected baseline when the schema already does the work.

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 ('Five-day National Weather Service forecast') plus the exact payload fields (high/low, text forecast, precipitation chance, wind) and an added derived snow estimate. An agent can distinguish this from get_resort_conditions and get_snow_history without opening any schema.

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?

Gives a clear negative condition — NWS covers US resorts only, so Canadian and Andes resorts return available=false — which prevents wasted calls and misinterpretation of empty results. It does not, however, name when to prefer this over siblings like get_resort_conditions or find_powder, so it stops short of full alternative routing.

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

get_opening_datesOpening datesA
Read-onlyIdempotent
Inspect

Season opening and closing dates with status (open / closed / unknown) for every resort, or those in one state/province, soonest opening first. Confirmed dates come from the resort; projected ones are third-party estimates.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows to return, 1–150.
stateNoUS state or Canadian province code (`CO`, `UT`, `BC`), or for the Andes the country name PeakCam lists (`Chile`, `Argentina`). Case-insensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
asOfYesYYYY-MM-DD (US Pacific) the statuses were evaluated for.
countYes
filtersYes
resortsYes
generatedAtYesISO-8601 UTC instant the result was generated.
totalMatchingYesResorts that matched before `limit` was applied.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, and the description adds real context beyond them: data provenance distinguishing resort-confirmed dates from third-party projections, plus the possible values of the status field. It still does not state refresh cadence or how stale projected dates can be.

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, both load-bearing: the first covers scope, status values and ordering; the second covers data provenance. Nothing is repeated and the most important scope information is front-loaded.

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?

An output schema exists, so return shape need not be described. Between the description (scope, ordering, status vocabulary, data provenance) and the fully documented 2-parameter schema, an agent has everything needed to call this correctly.

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% and the schema already documents both parameters in detail, so the baseline is 3. The description adds the behavior of omitting `state` (returns every resort) and the output ordering ('soonest opening first'), neither of which the schema expresses; only `limit` receives no additional explanation.

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+resource (opening/closing dates per resort) plus the returned status values and sort order, which is far more than a restatement of the name. It does not explicitly name or contrast any sibling tool, so an agent infers distinctness from the resource alone rather than being routed.

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 scope clause ('for every resort, or those in one state/province') implies when to pass `state` versus leaving it out, which is genuine usage guidance. There is no when-not-to-use guidance and no mention of alternatives such as get_resort_conditions or get_forecast when the agent actually wants live status rather than season dates.

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

get_resort_camsResort webcamsA
Read-onlyIdempotent
Inspect

The resort's webcams as links: PeakCam page URL, the operator's stream or page URL, a still-image URL when one exists, and health (live / down / unchecked, from PeakCam's probe, not proof of a live broadcast). Frames are never returned inline.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesPeakCam resort slug, lowercase kebab-case, e.g. `breckenridge` or `ski-portillo`. Get it from search_resorts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
camsYes
nameYes
slugYes
licenseYes
updatedAtYes
attributionYes
canonicalUrlYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare this as read-only, idempotent, non-destructive, and closed-world. The description adds useful behavioral context beyond annotations: health comes from PeakCam's probe and is not proof of a live broadcast, and frames are never returned inline.

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?

The description is compact and front-loaded, with every phrase adding useful information about returned link types or health caveats. There is no redundant or filler language.

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?

For a simple read-only lookup with full schema coverage, annotations, and an output schema, the description is complete enough. It additionally clarifies that frames are not inline and that health is probe-based rather than live-broadcast proof.

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?

There is only one parameter and schema description coverage is 100%, so the schema already fully documents the slug argument. The description adds no parameter-level details, which is acceptable given the high schema coverage baseline.

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 the specific resource clearly: the resort's webcams returned as links, with enumerated URL types and health status. It is more specific than a generic webcam fetch, though it does not explicitly distinguish itself from sibling tools like get_resort_conditions or compare_resorts.

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 intended use is implied by the tool name and description, but there is no explicit guidance on when to choose this over sibling tools. No alternatives or exclusions are named.

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

get_resort_conditionsResort conditionsA
Read-onlyIdempotent
Inspect

The latest snow report for one resort with provenance: new snow 24 h / 48 h, base depth, snow water equivalent, percent of normal, 7-day trend, rating, season status, plus a cam summary and the canonical PeakCam URL to cite. Sources: snotel = measured at a USDA NRCS SNOTEL station near the resort (station elevation, not the summit), open_meteo = weather-model estimate for resorts without a station.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesPeakCam resort slug, lowercase kebab-case, e.g. `breckenridge` or `ski-portillo`. Get it from search_resorts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
camsYes
nameYes
slugYes
snowYesNull when the resort has never had a snow report.
scoreNoToday's 0–100 score, once the scorer is live.
apiUrlYes
seasonYes
licenseYesURL of the terms that govern reuse.
profileYes
forecastNoLatest run per model and point, once stored forecasts are live.
locationYes
stationsNoObservation stations serving the resort, once the station layer is live.
updatedAtYesNewest instant among the snow report and cam checks/captures.
websiteUrlYes
attributionYes
measuredNowNoLatest observation per station, once the station layer is live.
canonicalUrlYesThe resort's PeakCam page. Cite this.
forecastScoresNoPer-model verification at this resort, once computed.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, and closed-world, so the safety profile is handled. The description adds genuinely non-obvious behavioral context: the provenance split between `snotel` (measured at a station near the resort, at station elevation rather than the summit) and `open_meteo` (model estimate for resorts without a station), plus the canonical URL to cite. This data-quality caveat is exactly the kind of disclosure annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core purpose, then a compact field inventory, then source semantics. The enumerated field list is longer than strictly necessary given an output schema exists, but every item is informative and there is no filler or hedging.

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?

An output schema exists, so return values need not be explained, yet the description still names the payload fields and adds provenance semantics and a citation URL, which fully covers the complexity of a single-param read tool. Minor gaps remain around freshness/update cadence and invalid-slug behavior, but nothing that would cause a mis-call.

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% and the single `slug` parameter is fully documented in the schema (format, examples, and where to obtain it via search_resorts). The description adds nothing about the parameter, so the baseline 3 for schema-documented params is correct.

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+resource ('The latest snow report for one resort') and enumerates exactly what is returned (new snow 24h/48h, base depth, SWE, percent of normal, trend, rating, cam summary, canonical URL). The phrase 'for one resort' cleanly separates it from compare_resorts and find_powder, so an agent can route without opening a schema.

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 singular 'one resort' and 'latest' suggest this is the point-lookup for current conditions rather than history (get_snow_history) or multi-resort comparison (compare_resorts). No explicit when-to-use/when-not statement or named alternative is given, so the agent must infer the boundary from the sibling names alone.

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

get_snow_historySnow historyA
Read-onlyIdempotent
Inspect

Daily snow depth, snow water equivalent, precipitation accumulation and temperatures for the last 1–30 days at the resort's station (SNOTEL where there is one, Open-Meteo model otherwise), newest first. Use it for "how has the base changed this week" questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoDays back, 1–30.
slugYesPeakCam resort slug, lowercase kebab-case, e.g. `breckenridge` or `ski-portillo`. Get it from search_resorts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysYes
nameYes
rowsYes
slugYes
countYes
sourceYes
stationYes
generatedAtYesISO-8601 UTC instant the result was generated.
canonicalUrlYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world. The description adds important behavioral context: the data source varies by resort (SNOTEL vs model), and results are sorted newest first. It doesn't mention rate limits or authentication, but those are less critical for a read-only tool.

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 wasted words. The key information (metrics, time range, source, ordering) is front-loaded, and the usage tip follows naturally.

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?

The tool has an output schema and rich annotations, so the description needn't explain return values. It covers the data source variability and temporal scope, which are important. It could mention pagination or limits, but the 30-day cap is in the schema. Overall, complete enough for an agent to call it 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 coverage is 100%, so both parameters are fully documented in the schema. The description implies the 'days' window but doesn't add syntax beyond what the schema provides. Baseline 3 is appropriate because the schema carries the parameter documentation.

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?

The description names the exact metrics (snow depth, SWE, precipitation, temperatures), the time window (1–30 days), the data sources (SNOTEL vs Open-Meteo), and the ordering (newest first). This level of specificity makes it distinct from siblings like get_forecast or 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 Guidelines4/5

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

It gives a clear usage example ("how has the base changed this week"), which implies retrospective questions. However, it doesn't explicitly say when to prefer this over get_resort_conditions or get_forecast, leaving alternatives implicit.

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

search_resortsSearch resortsA
Read-onlyIdempotent
Inspect

Find PeakCam resorts by name (or part of one, or a region) and get their slugs with a one-line snow summary each. Call this first when the user names a resort; then use the slug with the other tools. Covers about 150 resorts in the US, Canada, Chile and Argentina.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows to return, 1–20.
queryYesResort name or fragment, e.g. `vail`, `big sky`, `portillo`, `tahoe`. Also matches region names.
stateNoUS state or Canadian province code (`CO`, `UT`, `BC`), or for the Andes the country name PeakCam lists (`Chile`, `Argentina`). Case-insensitive.
countryNoISO 3166-1 alpha-2 country code: `US`, `CA`, `CL` or `AR`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
queryYes
resortsYes
generatedAtYesISO-8601 UTC instant the result was generated.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive and closed-world. The description still adds real context on that closed world: coverage of about 150 resorts across the US, Canada, Chile and Argentina, which bounds what the tool can possibly return.

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: the first states what it returns, the second states when to call it and how to use the output. No filler, and the entry-point guidance is front-loaded.

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?

An output schema exists and the input schema is fully documented, so the description's job is routing and scope, both of which it nails. An agent knows when to call it, what it gets back, and how to proceed.

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%, so the schema already documents query, state, country and limit with examples. The description's mention of partial names and region matching largely restates what the query schema description already provides, so it adds little beyond the baseline.

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 (find resorts by name/fragment/region) plus the concrete payoff: slugs with a one-line snow summary each. The 'call this first' framing clearly separates it from lookup siblings like get_resort_conditions that presumably require a slug.

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?

Explicitly says when to call it ('when the user names a resort') and what to do with the result ('then use the slug with the other tools'), which is genuinely useful routing. It stops short of stating when NOT to use it, e.g. that it is unnecessary when a slug is already known.

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. 3 tool updates
    • Changedcompare_resorts9 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"
        +]
    • Changedget_resort_cams5 fields changed
      • addedOutput schema / properties / cams / items / properties / credit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Attribution line to show with the frame. Null means credit the resort."
        +}
      • addedOutput schema / properties / cams / items / properties / kind
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "summit",
        +        "mid",
        +        "base",
        +        "snow-stake",
        +        "village",
        +        "approach"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "What the cam looks at. Null when not classified."
        +}
      • addedOutput schema / properties / cams / items / properties / sourceTermsUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The operator's terms governing reuse of this feed, when known."
        +}
      • addedOutput schema / properties / cams / items / properties / timelapses
        Added value: +{
        +  "description": "Rendered clips, once PeakCam renders them for this cam.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "frames": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "renderedAt": {
        +        "description": "ISO-8601 instant the clip was rendered.",
        +        "type": "string"
        +      },
        +      "stormDate": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "YYYY-MM-DD of the storm a `storm` clip covers."
        +      },
        +      "url": {
        +        "description": "Public MP4 URL.",
        +        "type": "string"
        +      },
        +      "window": {
        +        "description": "Which clip: `24h` (rolling day), `storm` (one storm, see `stormDate`), or another label.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "window",
        +      "url",
        +      "frames",
        +      "renderedAt",
        +      "stormDate"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / cams / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "elevation",
        -  "live",
        -  "lastCheckedAt",
        -  "stillUrl",
        -  "capturedAt",
        -  "embedType",
        -  "pageUrl",
        -  "sourceUrl"
        -]New value: +[
        +  "id",
        +  "name",
        +  "elevation",
        +  "live",
        +  "lastCheckedAt",
        +  "stillUrl",
        +  "capturedAt",
        +  "embedType",
        +  "pageUrl",
        +  "sourceUrl",
        +  "kind",
        +  "credit",
        +  "sourceTermsUrl"
        +]
    • Changedget_resort_conditions14 fields changed
      • addedOutput schema / properties / cams / items / properties / credit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Attribution line to show with the frame. Null means credit the resort."
        +}
      • addedOutput schema / properties / cams / items / properties / kind
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "summit",
        +        "mid",
        +        "base",
        +        "snow-stake",
        +        "village",
        +        "approach"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "What the cam looks at. Null when not classified."
        +}
      • addedOutput schema / properties / cams / items / properties / sourceTermsUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The operator's terms governing reuse of this feed, when known."
        +}
      • addedOutput schema / properties / cams / items / properties / timelapses
        Added value: +{
        +  "description": "Rendered clips, once PeakCam renders them for this cam.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "frames": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "renderedAt": {
        +        "description": "ISO-8601 instant the clip was rendered.",
        +        "type": "string"
        +      },
        +      "stormDate": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "YYYY-MM-DD of the storm a `storm` clip covers."
        +      },
        +      "url": {
        +        "description": "Public MP4 URL.",
        +        "type": "string"
        +      },
        +      "window": {
        +        "description": "Which clip: `24h` (rolling day), `storm` (one storm, see `stormDate`), or another label.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "window",
        +      "url",
        +      "frames",
        +      "renderedAt",
        +      "stormDate"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / cams / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "elevation",
        -  "live",
        -  "lastCheckedAt",
        -  "stillUrl",
        -  "capturedAt",
        -  "embedType",
        -  "pageUrl",
        -  "sourceUrl"
        -]New value: +[
        +  "id",
        +  "name",
        +  "elevation",
        +  "live",
        +  "lastCheckedAt",
        +  "stillUrl",
        +  "capturedAt",
        +  "embedType",
        +  "pageUrl",
        +  "sourceUrl",
        +  "kind",
        +  "credit",
        +  "sourceTermsUrl"
        +]
      • addedOutput schema / 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 / 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 / location / properties / summitElevationFt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / location / required
        Previous value: -[
        -  "state",
        -  "region",
        -  "country",
        -  "lat",
        -  "lon",
        -  "baseElevationFt"
        -]New value: +[
        +  "state",
        +  "region",
        +  "country",
        +  "lat",
        +  "lon",
        +  "baseElevationFt",
        +  "summitElevationFt"
        +]
      • addedOutput schema / 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 / 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 / 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 / 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 / required
        Previous value: -[
        -  "slug",
        -  "name",
        -  "canonicalUrl",
        -  "apiUrl",
        -  "location",
        -  "snow",
        -  "season",
        -  "cams",
        -  "websiteUrl",
        -  "attribution",
        -  "license",
        -  "updatedAt"
        -]New value: +[
        +  "slug",
        +  "name",
        +  "canonicalUrl",
        +  "apiUrl",
        +  "location",
        +  "profile",
        +  "snow",
        +  "season",
        +  "cams",
        +  "websiteUrl",
        +  "attribution",
        +  "license",
        +  "updatedAt"
        +]
  2. 8 tool updates
    • First observedcompare_resorts
    • First observedfind_powder
    • First observedget_forecast
    • First observedget_opening_dates
    • First observedget_resort_cams
    • First observedget_resort_conditions
    • First observedget_snow_history
    • First observedsearch_resorts

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Live ski & snow data for AI agents: 14-day multi-model forecasts, powder rankings, resort guides, webcams, ski-pass intelligence, and avalanche/road safety across 500+ resorts. Hosted streamable-HTTP — no install, no auth.
    40
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides access to real-time and historical snow conditions, weather data, and snowpack analysis from over 800 SNOTEL stations across the western United States through the USDA Air and Water Database API.
    2
    MIT
  • 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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.