Skip to main content
Glama

Check recorded openings for a permit or campground

check_availability
Read-onlyIdempotent

Shows what PermitSnag has recorded for one US backcountry permit or one campground over a range of up to 62 days. Answers come from PermitSnag's own stored checks of the booking site, not a live look, and nothing is booked. Each date has one state: observed_opening (an opening seen recently, with when it was last seen), observed_no_match (a recent check that saw no opening, with its time), stale (the newest check is older than staleAfterHours, with its time), unknown (no usable check of that date), unreleased (not on sale yet, by the agency's release rule or the booking site), off_season (outside the agency's published season), closed (closed by the agency) or unsupported (PermitSnag does not check this place). Neither stale nor unknown means sold out. Permit dates are shown as they stood 15 minutes ago. For a permit split into zones or entry points, our checks may cover only some of them, so a date with no opening seen comes back as unknown, never as observed_no_match.

Input Schema

NameRequiredDescriptionDefault
permitNoThe permit id or slug from search_permits. Give this or campground, not both.
endDateNoLast date, YYYY-MM-DD, inclusive. Defaults to startDate. The range covers at most 62 days, counting both ends.
startDateYesFirst date, YYYY-MM-DD, read as the place's own local calendar day (for a campground, the night you arrive).
campgroundNoThe campground id from search_campgrounds. Give this or permit, not both.

Output Schema

NameRequiredDescriptionDefault
daysNo
pastNoPresent only when every asked date has passed.
alertNo
datesNo
depthNo
foundNoPresent, and false, only when nothing matched.
sourceNo
subjectNo
checkedAtNo
freshnessNo
scanRouteNoHow PermitSnag reaches this permit for cancellation openings: direct, through a zone or starting area, through its entry points, or none.
partialScopeNoPermits only: true when our checks may cover only some zones or entry points, so no date is called "no opening".
staleAfterHoursNoHours. A check older than this is never reported as observed; it is reported as stale (or as unknown, when partialScope hides a check that saw no opening).
publicDelayMinutesNoPermits only: dates are described as they stood this many minutes ago.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / endDate / description
      Previous value: -"Last date, YYYY-MM-DD, inclusive. Defaults to startDate. At most 62 days after startDate."New value: +"Last date, YYYY-MM-DD, inclusive. Defaults to startDate. The range covers at most 62 days, counting both ends."
    • changedOutput schema / description
      Previous value: -"PermitSnag's recorded checks of one permit or campground on the asked dates, each with its age. Not a live look at the booking site. Or found: false, or past: true."New value: +"PermitSnag's recorded checks of one permit or campground on the asked dates; an observed or stale date carries the time and age of its check. Not a live look at the booking site. Or found: false, or past: true."
    • changedOutput schema / properties / days / items / properties / observedAt / description
      Previous value: -"When the check behind an observed or stale state was made, ISO 8601."New value: +"The time of the check behind an observed or stale state (for an opening, when it was last seen), ISO 8601. For a permit, never later than publicDelayMinutes ago."
    • changedOutput schema / properties / days / items / properties / state / description
      Previous value: -"What PermitSnag recorded for this date. unknown is never sold out."New value: +"What PermitSnag recorded for this date. Neither stale nor unknown means sold out."
    • changedOutput schema / properties / staleAfterHours / description
      Previous value: -"A check older than this is reported as stale."New value: +"Hours. A check older than this is never reported as observed; it is reported as stale (or as unknown, when partialScope hides a check that saw no opening)."
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "anyOf": [
      +    {
      +      "required": [
      +        "subject",
      +        "depth",
      +        "dates",
      +        "staleAfterHours",
      +        "freshness",
      +        "days",
      +        "alert",
      +        "source",
      +        "checkedAt"
      +      ]
      +    },
      +    {
      +      "required": [
      +        "found"
      +      ]
      +    },
      +    {
      +      "required": [
      +        "past"
      +      ]
      +    }
      +  ],
      +  "description": "PermitSnag's recorded checks of one permit or campground on the asked dates, each with its age. Not a live look at the booking site. Or found: false, or past: true.",
      +  "properties": {
      +    "alert": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "available": {
      +          "description": "True only when PermitSnag can send an alert for this place right now.",
      +          "type": "boolean"
      +        },
      +        "pageUrl": {
      +          "description": "The PermitSnag page where an alert is set up, or where to read what to do instead.",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Why an alert is or is not on offer.",
      +          "enum": [
      +            "eligible",
      +            "lottery_period",
      +            "out_of_season",
      +            "closed",
      +            "no_quota_now",
      +            "lottery_draw_only",
      +            "not_sold_online",
      +            "not_tracked"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "available",
      +        "reason",
      +        "pageUrl"
      +      ],
      +      "type": "object"
      +    },
      +    "checkedAt": {
      +      "type": "string"
      +    },
      +    "dates": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "calendar": {
      +          "const": "local_day"
      +        },
      +        "end": {
      +          "type": "string"
      +        },
      +        "start": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "start",
      +        "end",
      +        "calendar"
      +      ],
      +      "type": "object"
      +    },
      +    "days": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "ageMinutes": {
      +            "description": "Minutes since that check.",
      +            "type": "integer"
      +          },
      +          "date": {
      +            "description": "YYYY-MM-DD, the place's own local calendar day.",
      +            "type": "string"
      +          },
      +          "lastSeenState": {
      +            "description": "For a stale date: what that old check saw.",
      +            "enum": [
      +              "observed_opening",
      +              "observed_no_match"
      +            ]
      +          },
      +          "observedAt": {
      +            "description": "When the check behind an observed or stale state was made, ISO 8601.",
      +            "type": "string"
      +          },
      +          "openSites": {
      +            "description": "Campgrounds at site level only: sites seen open.",
      +            "type": "integer"
      +          },
      +          "releaseKind": {
      +            "enum": [
      +              "lottery",
      +              "reservations",
      +              null
      +            ]
      +          },
      +          "releasesOn": {
      +            "description": "For an unreleased date: the sourced day it goes on sale, when known.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "state": {
      +            "description": "What PermitSnag recorded for this date. unknown is never sold out.",
      +            "enum": [
      +              "observed_opening",
      +              "observed_no_match",
      +              "stale",
      +              "unknown",
      +              "unreleased",
      +              "off_season",
      +              "closed",
      +              "unsupported"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "date",
      +          "state"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 62,
      +      "type": "array"
      +    },
      +    "depth": {
      +      "enum": [
      +        "permit_level",
      +        "site_level",
      +        "campground_level"
      +      ]
      +    },
      +    "found": {
      +      "const": false,
      +      "description": "Present, and false, only when nothing matched."
      +    },
      +    "freshness": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "band": {
      +          "enum": [
      +            "none",
      +            "recent",
      +            "stale"
      +          ]
      +        },
      +        "newestObservedAt": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "oldestObservedAt": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "band",
      +        "newestObservedAt",
      +        "oldestObservedAt"
      +      ],
      +      "type": "object"
      +    },
      +    "partialScope": {
      +      "description": "Permits only: true when our checks may cover only some zones or entry points, so no date is called \"no opening\".",
      +      "type": "boolean"
      +    },
      +    "past": {
      +      "const": true,
      +      "description": "Present only when every asked date has passed."
      +    },
      +    "publicDelayMinutes": {
      +      "description": "Permits only: dates are described as they stood this many minutes ago.",
      +      "type": "number"
      +    },
      +    "scanRoute": {
      +      "description": "How PermitSnag reaches this permit for cancellation openings: direct, through a zone or starting area, through its entry points, or none.",
      +      "enum": [
      +        "direct",
      +        "via_zone",
      +        "via_children",
      +        "none",
      +        null
      +      ]
      +    },
      +    "source": {
      +      "const": "permitsnag_recorded_checks"
      +    },
      +    "staleAfterHours": {
      +      "description": "A check older than this is reported as stale.",
      +      "type": "number"
      +    },
      +    "subject": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "id": {
      +          "type": "string"
      +        },
      +        "kind": {
      +          "enum": [
      +            "permit",
      +            "campground"
      +          ]
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "pageUrl": {
      +          "type": "string"
      +        },
      +        "slug": {
      +          "description": "Permits only.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "id",
      +        "name",
      +        "pageUrl"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial beyond-schema behavior: results are stored, not live; each date has exactly one state with defined semantics; stale/unknown are explicitly not 'sold out'; permit data lags 15 minutes; and partial zone/entry-point coverage degrades to unknown rather than observed_no_match. This is exactly the interpretive context an agent needs.

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-loads the core purpose and scope in the first sentence, then layers state semantics. The long state enumeration is dense but each clause carries distinct interpretive value; the block is a bit unwieldy as a single paragraph but not padded.

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 high-complexity availability tool with a rich return-state model, the description covers everything needed to interpret results correctly, and more. With an output schema present it need not restate return shapes, yet the state definitions are essential disambiguation rather than redundancy.

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

Parameters3/5

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

Schema description coverage is 100%, so the four parameters are already documented, including the one-of permit/campground constraint and the inclusive 62-day range. The description restates the 62-day bound and date framing but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Shows what PermitSnag has recorded for one US backcountry permit or one campground') and pins the scope to a range of up to 62 days. It distinguishes itself from siblings like search_permits/get_permit_details by clarifying these are PermitSnag's own stored checks, not a live look.

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 clear context for what the answer represents (recorded checks, not live) and rules out booking, which frames when the output is trustworthy. However, it never explicitly routes the agent to alternatives (e.g., get_permit_details for static info, search_permits to obtain the id) or states when not to use it.

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.

Resources