Skip to main content
Glama

Server Details

US backcountry permit and campground rules, dates and recorded openings. Read-only, no sign-in.

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
Uptime
100.0% over 22 days
Last Tested
Transport
Streamable HTTP ยท MCP 2025-11-25
URL

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct action and resource: search vs. detail vs. availability vs. booking link. The two resource families (permits and campgrounds) have parallel, clearly separated tools, so an agent can reliably select the right one.

Naming Consistency5/5

All names follow a consistent snake_case verb_noun pattern with a small, predictable verb set: search, get, check. There are no mixed conventions or vague names.

Tool Count5/5

Six tools is well-scoped for a read-only permit/campground lookup service: two search tools, two detail tools, one availability checker, and one booking link tool. Each earns its place without redundancy.

Completeness3/5

The core workflow (search -> details -> availability -> booking link) is covered symmetrically for permits and campgrounds. However, the surface lacks any tool to create or manage the alerts that several descriptions explicitly mention, leaving a notable dead end for a key feature of the PermitSnag service.

Available Tools

6 tools
check_availabilityCheck recorded openings for a permit or campgroundA
Read-onlyIdempotent
Inspect

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.

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

NameRequiredDescription
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.

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.

get_campground_detailsUS campground detailsA
Read-onlyIdempotent
Inspect

Get the details of one US campground: its booking system, how far ahead sites go on sale, site count and types, stay limits, season and closures. Use it after search_campgrounds, or when the person names a specific campground. Says whether PermitSnag can send an alert when a site opens, and whether our checks count individual sites or only the campground as a whole.

NameRequiredDescriptionDefault
campgroundYesThe campground id from search_campgrounds.

Output Schema

NameRequiredDescription
idNo
nameNo
alertNo
depthNosite_level: our checks count individual sites. campground_level: the booking system reports the campground as a whole.
foundNoPresent, and false, only when nothing matched.
stateNo
seasonNoThe agency's season or closure state, with agency words in quoted fields.
pageUrlNo
providerNo
amenitiesNo
checkedAtNo
siteTypesNo
bookingUrlNo
priceRangeNo
totalSitesNo
descriptionNo
releaseRuleNoWhen sites go on sale, from the listing itself.
bookingSystemNo
maxStayNightsNo
reservationWindowDaysNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds domain facts (whether PermitSnag can alert on openings, whether checks are per-site or per-campground) but these are output/capability claims rather than behavioral traits of the call itself; it says nothing about failure modes for an unknown campground id. Adequate but not rich beyond the annotations.

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?

Three tight sentences, front-loaded with the purpose before usage and capability notes. No filler, no restatement of the tool name, and every clause carries information an agent can act on.

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 read-only annotations and an output schema covering return values, the description only needs to explain purpose and when to call it, which it does well. The remaining gap is edge-case handling for an invalid or unmatched campground identifier, which the description never addresses.

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 exactly one parameter and schema description coverage is 100%, with the schema already stating 'The campground id from search_campgrounds.' The description implies an already-identified campground but adds no further syntax, format, or identification guidance 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 ('Get the details of one US campground') and enumerates the concrete details returned (booking system, sale window, site count/types, stay limits, season/closures). This distinguishes it cleanly from search_campgrounds and check_availability without needing to open 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 explicit triggering conditions: 'Use it after search_campgrounds, or when the person names a specific campground.' This names a sibling tool and the workflow position. It stops short of stating when NOT to use it (e.g., to check live openings, use check_availability), so it is clear but not fully routing.

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

get_permit_detailsUS backcountry permit rules and datesA
Read-onlyIdempotent
Inspect

Get the rules for one US backcountry or wilderness permit: how it is issued (reservation, lottery or in person), its season, lottery and release dates, closures, group size limit, and the official agency page. Use it after search_permits, or when the person names a specific permit. Every date comes from an agency source; a date we cannot source is left out. Says whether PermitSnag can send an alert when the permit opens.

NameRequiredDescriptionDefault
permitYesThe permit id or slug from search_permits, or its permitsnag.com page URL.

Output Schema

NameRequiredDescription
idNo
nameNo
parkNo
slugNo
alertNo
foundNoPresent, and false, only when nothing matched.
seasonNoThe agency's season or closure state, with agency words in quoted fields.
pageUrlNo
usStateNo
issuanceNoHow the permit is issued, in plain words.
checkedAtNoWhen this answer was composed, ISO 8601.
scanRouteNoHow PermitSnag reaches this permit for cancellation openings: direct, through a zone or starting area, through its entry points, or none.
agencyDatesNoUpcoming dates from an agency source (lottery opens, closes, results, claims).
descriptionNo
officialUrlNoThe agency's own permit page.
releaseRulesNoThe agency schedule for when dates go on sale.
groupSizeLimitNo

TDQS

A4.3/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 description's added value is provenance and caveats: 'Every date comes from an agency source; a date we cannot source is left out' tells the agent that missing dates are intentional, not a failure. It also discloses that the tool reports whether PermitSnag can send an opening alert, which is behavior an agent could not infer from annotations or schema.

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?

Three sentences, front-loaded with what is retrieved, then routing, then data-quality caveats. The middle enumeration of fields is dense but slightly list-like; still, every clause carries information an agent can act on.

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 no explanation here. The description covers routing, data provenance, and the alert-capability signal, which is complete for a single-parameter read tool; nothing essential is missing.

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 single parameter already documents accepted forms (id, slug, permitsnag.com URL). The description only hints that a user-named permit is acceptable, which is marginally additive but largely restates schema capability, so the baseline of 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?

States a specific verb and resource ('Get the rules for one US backcountry or wilderness permit') and then enumerates the exact facets returned: issuance method, season, lottery/release dates, closures, group size, agency page. This is clearly distinguishable from siblings like search_permits or check_availability 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 Guidelines5/5

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

Explicitly states when to call it: 'Use it after search_permits, or when the person names a specific permit.' That names both the sibling it follows and the natural-language trigger condition, leaving no routing ambiguity.

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

search_campgroundsSearch US campgroundsA
Read-onlyIdempotent
Inspect

Find campgrounds in the US by name, area or state, across Recreation.gov and state park booking systems. Use this when someone wants a place to camp or asks about a specific campground. Returns up to 10 campgrounds with their PermitSnag page, their booking system, and whether PermitSnag can send an alert when a site opens. It does not check dates; use check_availability for that.

NameRequiredDescriptionDefault
limitNoHow many results, 1 to 10. Default 5.
queryYesA campground name or area, like "Upper Pines" or "Big Sur".
stateNoOptional two-letter US state code to narrow results, like CA.

Output Schema

NameRequiredDescription
queryYes
stateYes
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and non-destructive behavior, so the safety profile is covered. The description adds meaningful non-annotation context: result cap (up to 10), which booking sources are queried, what each result carries, and that no date checking occurs. It stops short of detailing pagination or ranking behavior.

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?

Four sentences, front-loaded with purpose and scope, then use-case, then return shape, then the explicit exclusion. Every sentence carries distinct information with no filler.

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?

A read-only search tool with full schema coverage and an output schema; the description covers purpose, when-to-use, the sibling handoff, and source coverage. No information an agent needs to select or call it correctly is missing.

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 query, state and limit are already documented in the schema. The description reinforces that search works by name, area or state but adds no format or syntax detail beyond what the schema provides, 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 ('Find campgrounds in the US') plus scope ('across Recreation.gov and state park booking systems'), and names the search dimensions (name, area, state). It is clearly distinguishable from siblings like check_availability and get_campground_details.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('when someone wants a place to camp or asks about a specific campground') and when not to ('It does not check dates; use check_availability for that'), naming the alternative directly. Nothing is left to inference.

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

search_permitsSearch US backcountry and wilderness permitsA
Read-onlyIdempotent
Inspect

Find US backcountry and wilderness permits by name, park, trail or area, for hikes, climbs, river trips and overnight trips in national parks, national forests and state parks. Use this when someone asks how to get a permit or which permit a trip needs. Returns up to 10 permits with their PermitSnag page and whether PermitSnag scans them for cancellation openings. It does not check dates; use check_availability for that, and get_permit_details for the rules of one permit.

NameRequiredDescriptionDefault
limitNoHow many results, 1 to 10. Default 5.
queryYesA permit, trail, park or area name, like "Mount Whitney" or "Enchantments".
stateNoOptional two-letter US state code to narrow results, like CA.

Output Schema

NameRequiredDescription
queryYesThe search as asked.
stateYesThe two-letter state filter, or null.
resultsYes

TDQS

A4.5/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, so the safety profile is covered. The description adds genuinely useful scope limits ('It does not check dates') and result shape (up to 10 permits with PermitSnag page and cancellation-scan status), though the return detail partially overlaps the output schema.

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?

Three tight sentences: what it searches, when to use it, then what it returns and which siblings cover the adjacent jobs. Front-loaded and free of filler.

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

Completeness5/5

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

With an output schema present it need not explain returns, yet it still summarizes them, and the routing to check_availability and get_permit_details resolves the main ambiguity. 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.

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 and limit with examples and bounds. The description mirrors the query semantics but adds no syntax or format detail beyond it, 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 (Find) and resource (US backcountry and wilderness permits) and enumerates the matching fields (name, park, trail, area) plus trip types. It is clearly distinguishable from siblings like search_campgrounds and get_permit_details.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('someone asks how to get a permit or which permit a trip needs') and names two exclusions with their alternatives: check_availability for dates and get_permit_details for one permit's rules. Nothing is left to inference.

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. 1 tool update
    • Changedcheck_availability5 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. 1 tool update
    • Changedget_booking_link4 fields changed
      • changedInput schema / properties / endDate / description
        Previous value: -"Optional last date, YYYY-MM-DD."New value: +"Optional last date, YYYY-MM-DD. Sent in the link for a few booking sites; the site may ignore it."
      • changedInput schema / properties / partySize / description
        Previous value: -"Optional number of people."New value: +"Optional number of people. Sent in the link for some permit booking sites; the site may ignore it."
      • changedInput schema / properties / startDate / description
        Previous value: -"Optional first date, YYYY-MM-DD."New value: +"Optional first date, YYYY-MM-DD. Sent in the link for some booking sites; the site may ignore it."
      • changedOutput schema / description
        Previous value: -"The official booking page for a permit or campground, or found: false. Nothing is booked."New value: +"A link to the booking page, the agency's page or the PermitSnag page for a permit or campground, or found: false. Nothing is booked."
  3. 6 tool updates
    • Changedcheck_availability1 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"
        +}
    • Changedget_booking_link1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "anyOf": [
        +    {
        +      "required": [
        +        "subject",
        +        "url",
        +        "destination",
        +        "datePrefill",
        +        "executesNothing"
        +      ]
        +    },
        +    {
        +      "required": [
        +        "found"
        +      ]
        +    }
        +  ],
        +  "description": "The official booking page for a permit or campground, or found: false. Nothing is booked.",
        +  "properties": {
        +    "datePrefill": {
        +      "description": "Whether the asked date reaches the booking page.",
        +      "enum": [
        +        "applied",
        +        "ignored",
        +        "unknown"
        +      ]
        +    },
        +    "destination": {
        +      "enum": [
        +        "booking_page",
        +        "official_page",
        +        "permitsnag_page"
        +      ]
        +    },
        +    "executesNothing": {
        +      "const": true,
        +      "description": "This tool only returns a link."
        +    },
        +    "found": {
        +      "const": false,
        +      "description": "Present, and false, only when nothing matched."
        +    },
        +    "providerHomeUrl": {
        +      "description": "Permits only: the booking site's front page, when that is all we can name.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "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"
        +    },
        +    "url": {
        +      "description": "The page to open.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_campground_details1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "anyOf": [
        +    {
        +      "required": [
        +        "id",
        +        "name",
        +        "state",
        +        "bookingSystem",
        +        "provider",
        +        "depth",
        +        "pageUrl",
        +        "bookingUrl",
        +        "totalSites",
        +        "siteTypes",
        +        "amenities",
        +        "maxStayNights",
        +        "reservationWindowDays",
        +        "priceRange",
        +        "releaseRule",
        +        "alert",
        +        "season",
        +        "description",
        +        "checkedAt"
        +      ]
        +    },
        +    {
        +      "required": [
        +        "found"
        +      ]
        +    }
        +  ],
        +  "description": "The details of one US campground, or found: false.",
        +  "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"
        +    },
        +    "amenities": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "maxItems": 8,
        +      "type": "array"
        +    },
        +    "bookingSystem": {
        +      "type": "string"
        +    },
        +    "bookingUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "checkedAt": {
        +      "type": "string"
        +    },
        +    "depth": {
        +      "description": "site_level: our checks count individual sites. campground_level: the booking system reports the campground as a whole.",
        +      "enum": [
        +        "site_level",
        +        "campground_level"
        +      ]
        +    },
        +    "description": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "found": {
        +      "const": false,
        +      "description": "Present, and false, only when nothing matched."
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "maxStayNights": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "pageUrl": {
        +      "type": "string"
        +    },
        +    "priceRange": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "max": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "min": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "min",
        +        "max"
        +      ],
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "provider": {
        +      "type": "string"
        +    },
        +    "releaseRule": {
        +      "additionalProperties": false,
        +      "description": "When sites go on sale, from the listing itself.",
        +      "properties": {
        +        "agencyQuote": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "daysAhead": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "kind": {
        +          "type": "string"
        +        },
        +        "monthsAhead": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "readAt": {
        +          "type": "string"
        +        },
        +        "sourceUrl": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "monthsAhead",
        +        "daysAhead",
        +        "sourceUrl",
        +        "agencyQuote",
        +        "readAt"
        +      ],
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "reservationWindowDays": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "season": {
        +      "additionalProperties": true,
        +      "description": "The agency's season or closure state, with agency words in quoted fields.",
        +      "properties": {
        +        "agency": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "agencyQuote": {
        +          "description": "The agency's own words, capped.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "closedParts": {
        +          "description": "Named parts that are closed while the rest stays open.",
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "agencyQuote": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "name": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "reopensOn": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "since": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "maxItems": 5,
        +          "type": "array"
        +        },
        +        "closesOn": {
        +          "description": "YYYY-MM-DD the agency says the season closes.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "closure": {
        +          "additionalProperties": true,
        +          "description": "A closure of the whole place, when the agency posted one.",
        +          "properties": {
        +            "agency": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "incident": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "readAt": {
        +              "type": "string"
        +            },
        +            "reopensOn": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "since": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "url": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "offer": {
        +          "description": "What the page offers in this season.",
        +          "type": "string"
        +        },
        +        "opensOn": {
        +          "description": "YYYY-MM-DD the agency says the season opens.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "sourceUrl": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "state": {
        +          "description": "The season state code, or null when nothing is published.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "offer",
        +        "state"
        +      ],
        +      "type": "object"
        +    },
        +    "siteTypes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "maxItems": 6,
        +      "type": "array"
        +    },
        +    "state": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "totalSites": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_permit_details1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "anyOf": [
        +    {
        +      "required": [
        +        "id",
        +        "slug",
        +        "name",
        +        "park",
        +        "usState",
        +        "pageUrl",
        +        "officialUrl",
        +        "issuance",
        +        "scanRoute",
        +        "alert",
        +        "season",
        +        "agencyDates",
        +        "releaseRules",
        +        "groupSizeLimit",
        +        "description",
        +        "checkedAt"
        +      ]
        +    },
        +    {
        +      "required": [
        +        "found"
        +      ]
        +    }
        +  ],
        +  "description": "The rules and sourced dates of one US backcountry or wilderness permit, or found: false.",
        +  "properties": {
        +    "agencyDates": {
        +      "description": "Upcoming dates from an agency source (lottery opens, closes, results, claims).",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "agencyQuote": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "date": {
        +            "description": "YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "sourceUrl": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "type",
        +          "date",
        +          "sourceUrl",
        +          "agencyQuote"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 8,
        +      "type": "array"
        +    },
        +    "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": {
        +      "description": "When this answer was composed, ISO 8601.",
        +      "type": "string"
        +    },
        +    "description": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "found": {
        +      "const": false,
        +      "description": "Present, and false, only when nothing matched."
        +    },
        +    "groupSizeLimit": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "issuance": {
        +      "description": "How the permit is issued, in plain words.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "officialUrl": {
        +      "description": "The agency's own permit page.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "pageUrl": {
        +      "type": "string"
        +    },
        +    "park": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "releaseRules": {
        +      "description": "The agency schedule for when dates go on sale.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "agencyQuote": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "kind": {
        +            "type": "string"
        +          },
        +          "sourceUrl": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "kind",
        +          "sourceUrl",
        +          "agencyQuote"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 4,
        +      "type": "array"
        +    },
        +    "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
        +      ]
        +    },
        +    "season": {
        +      "additionalProperties": true,
        +      "description": "The agency's season or closure state, with agency words in quoted fields.",
        +      "properties": {
        +        "agency": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "agencyQuote": {
        +          "description": "The agency's own words, capped.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "closedParts": {
        +          "description": "Named parts that are closed while the rest stays open.",
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "agencyQuote": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "name": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "reopensOn": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "since": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "maxItems": 5,
        +          "type": "array"
        +        },
        +        "closesOn": {
        +          "description": "YYYY-MM-DD the agency says the season closes.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "closure": {
        +          "additionalProperties": true,
        +          "description": "A closure of the whole place, when the agency posted one.",
        +          "properties": {
        +            "agency": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "incident": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "readAt": {
        +              "type": "string"
        +            },
        +            "reopensOn": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "since": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "url": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "offer": {
        +          "description": "What the page offers in this season.",
        +          "type": "string"
        +        },
        +        "opensOn": {
        +          "description": "YYYY-MM-DD the agency says the season opens.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "sourceUrl": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "state": {
        +          "description": "The season state code, or null when nothing is published.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "offer",
        +        "state"
        +      ],
        +      "type": "object"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "usState": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedsearch_campgrounds1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "description": "US campgrounds that match the search.",
        +  "properties": {
        +    "query": {
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "bookingSystem": {
        +            "type": "string"
        +          },
        +          "depth": {
        +            "description": "site_level: our checks count individual sites. campground_level: the booking system reports the campground as a whole.",
        +            "enum": [
        +              "site_level",
        +              "campground_level"
        +            ]
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "pageUrl": {
        +            "type": "string"
        +          },
        +          "scannable": {
        +            "description": "True when PermitSnag checks this campground for openings. Whether an alert is on offer today is in get_campground_details.",
        +            "type": "boolean"
        +          },
        +          "state": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "state",
        +          "bookingSystem",
        +          "depth",
        +          "pageUrl",
        +          "scannable"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 10,
        +      "type": "array"
        +    },
        +    "state": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "query",
        +    "state",
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_permits1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "description": "US backcountry and wilderness permits that match the search.",
        +  "properties": {
        +    "query": {
        +      "description": "The search as asked.",
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "pageUrl": {
        +            "description": "The permit page on permitsnag.com.",
        +            "type": "string"
        +          },
        +          "park": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "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
        +            ]
        +          },
        +          "scannable": {
        +            "description": "True when PermitSnag scans this permit for cancellation openings. Whether an alert is on offer today is in get_permit_details.",
        +            "type": "boolean"
        +          },
        +          "slug": {
        +            "type": "string"
        +          },
        +          "usState": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "slug",
        +          "name",
        +          "park",
        +          "usState",
        +          "pageUrl",
        +          "scanRoute",
        +          "scannable"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 10,
        +      "type": "array"
        +    },
        +    "state": {
        +      "description": "The two-letter state filter, or null.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "query",
        +    "state",
        +    "results"
        +  ],
        +  "type": "object"
        +}
  4. 6 tool updates
    • First observedcheck_availability
    • First observedget_booking_link
    • First observedget_campground_details
    • First observedget_permit_details
    • First observedsearch_campgrounds
    • First observedsearch_permits

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources