PermitSnag
Server Details
US backcountry permit and campground rules, dates and recorded openings. Read-only, no sign-in.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP ยท MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
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.
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.
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.
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 toolscheck_availabilityCheck recorded openings for a permit or campgroundARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| permit | No | The permit id or slug from search_permits. Give this or campground, not both. | |
| endDate | No | Last date, YYYY-MM-DD, inclusive. Defaults to startDate. The range covers at most 62 days, counting both ends. | |
| startDate | Yes | First date, YYYY-MM-DD, read as the place's own local calendar day (for a campground, the night you arrive). | |
| campground | No | The campground id from search_campgrounds. Give this or permit, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | |
| past | No | Present only when every asked date has passed. |
| alert | No | |
| dates | No | |
| depth | No | |
| found | No | Present, and false, only when nothing matched. |
| source | No | |
| subject | No | |
| checkedAt | No | |
| freshness | No | |
| scanRoute | No | How PermitSnag reaches this permit for cancellation openings: direct, through a zone or starting area, through its entry points, or none. |
| partialScope | No | Permits only: true when our checks may cover only some zones or entry points, so no date is called "no opening". |
| staleAfterHours | No | 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). |
| publicDelayMinutes | No | Permits only: dates are described as they stood this many minutes ago. |
TDQS
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.
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.
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.
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.
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.
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_booking_linkBooking link for a permit or campgroundARead-onlyIdempotentInspect
Returns the link to the official booking page for one US backcountry permit or one campground. For some permits the link also carries the first date and the number of people you give, but the booking site may not use them, so the person checks or picks the dates and group size on that page. For a campground, the person picks or checks the dates on the booking page. For some places it returns the agency's own page or the PermitSnag page instead of a booking page. It only returns a link and a sentence about it; it does not book, pay or enter a lottery.
| Name | Required | Description | Default |
|---|---|---|---|
| permit | No | The permit id or slug. Give this or campground, not both. | |
| endDate | No | Optional last date, YYYY-MM-DD. Sent in the link for a few booking sites; the site may ignore it. | |
| partySize | No | Optional number of people. Sent in the link for some permit booking sites; the site may ignore it. | |
| startDate | No | Optional first date, YYYY-MM-DD. Sent in the link for some booking sites; the site may ignore it. | |
| campground | No | The campground id. Give this or permit, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | The page to open. |
| found | No | Present, and false, only when nothing matched. |
| subject | No | |
| datePrefill | No | Whether the asked date reaches the booking page. |
| destination | No | |
| executesNothing | No | This tool only returns a link. |
| providerHomeUrl | No | Permits only: the booking site's front page, when that is all we can name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/idempotent/non-destructive annotations: it warns that passed dates and party size may be ignored by the destination site, and that the returned URL may be an agency page or a PermitSnag page rather than a booking page. It also explicitly rules out booking, payment, and lottery entry. It stops short of stating failure behavior for an invalid permit/campground id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core return value, followed by the caveats that matter. It is a touch repetitive โ the campground date-picking behavior is stated twice in near-identical form โ but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with full schema coverage, annotations, and an output schema, the description covers the essential behavioral quirks an agent needs. Only error/edge handling (unknown id, conflicting permit+campground) is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's notes about startDate, endDate, and partySize being embedded in the link but possibly ignored largely restate what the schema already documents, and the permit/campground mutual exclusivity is also already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Returns the link to the official booking page for one US backcountry permit or one campground.' The scope is unambiguous and the closing sentence bounds what it does ('only returns a link and a sentence about it'), but it never names a sibling tool (e.g. check_availability) to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: by saying 'the person checks or picks the dates and group size on that page,' it implicitly signals this tool is not for date/availability checking. However, there is no explicit 'use X instead when you need Y' routing against check_availability, get_permit_details, or search_permits.
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 detailsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campground | Yes | The campground id from search_campgrounds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| alert | No | |
| depth | No | site_level: our checks count individual sites. campground_level: the booking system reports the campground as a whole. |
| found | No | Present, and false, only when nothing matched. |
| state | No | |
| season | No | The agency's season or closure state, with agency words in quoted fields. |
| pageUrl | No | |
| provider | No | |
| amenities | No | |
| checkedAt | No | |
| siteTypes | No | |
| bookingUrl | No | |
| priceRange | No | |
| totalSites | No | |
| description | No | |
| releaseRule | No | When sites go on sale, from the listing itself. |
| bookingSystem | No | |
| maxStayNights | No | |
| reservationWindowDays | No |
TDQS
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.
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.
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.
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.
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.
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 datesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| permit | Yes | The permit id or slug from search_permits, or its permitsnag.com page URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| park | No | |
| slug | No | |
| alert | No | |
| found | No | Present, and false, only when nothing matched. |
| season | No | The agency's season or closure state, with agency words in quoted fields. |
| pageUrl | No | |
| usState | No | |
| issuance | No | How the permit is issued, in plain words. |
| checkedAt | No | When this answer was composed, ISO 8601. |
| scanRoute | No | How PermitSnag reaches this permit for cancellation openings: direct, through a zone or starting area, through its entry points, or none. |
| agencyDates | No | Upcoming dates from an agency source (lottery opens, closes, results, claims). |
| description | No | |
| officialUrl | No | The agency's own permit page. |
| releaseRules | No | The agency schedule for when dates go on sale. |
| groupSizeLimit | No |
TDQS
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.
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.
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.
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.
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.
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 campgroundsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many results, 1 to 10. Default 5. | |
| query | Yes | A campground name or area, like "Upper Pines" or "Big Sur". | |
| state | No | Optional two-letter US state code to narrow results, like CA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| state | Yes | |
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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 permitsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many results, 1 to 10. Default 5. | |
| query | Yes | A permit, trail, park or area name, like "Mount Whitney" or "Enchantments". | |
| state | No | Optional two-letter US state code to narrow results, like CA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | The search as asked. |
| state | Yes | The two-letter state filter, or null. |
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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 tool update
- Changed
check_availability5 fields changed- changed
Input schema / properties / endDate / descriptionPrevious 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." - changed
Output schema / descriptionPrevious 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." - changed
Output schema / properties / days / items / properties / observedAt / descriptionPrevious 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." - changed
Output schema / properties / days / items / properties / state / descriptionPrevious 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." - changed
Output schema / properties / staleAfterHours / descriptionPrevious 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)."
1 tool update
- Changed
get_booking_link4 fields changed- changed
Input schema / properties / endDate / descriptionPrevious 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." - changed
Input schema / properties / partySize / descriptionPrevious 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." - changed
Input schema / properties / startDate / descriptionPrevious 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." - changed
Output schema / descriptionPrevious 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."
6 tool updates
- Changed
check_availability1 field changed- changed
Output 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" +}
- Changed
get_booking_link1 field changed- changed
Output 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" +}
- Changed
get_campground_details1 field changed- changed
Output 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" +}
- Changed
get_permit_details1 field changed- changed
Output 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" +}
- Changed
search_campgrounds1 field changed- changed
Output 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" +}
- Changed
search_permits1 field changed- changed
Output 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" +}
6 tool updates
- First observed
check_availability - First observed
get_booking_link - First observed
get_campground_details - First observed
get_permit_details - First observed
search_campgrounds - First observed
search_permits
Related MCP Connectors
US outdoor recreation: 37k+ trails, 30k+ campgrounds, parks, weather + wildfire safety. Read-only.
Live US campground availability, wildfire and river conditions, and trails on public land.
Campground search, live availability, weather, safety, and gear for 10,000+ US campgrounds.
Catch campsite, cabin, permit and day-use cancellations at 1,600+ parks in Canada and the US.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables read-only querying of Pacific Crest Trail legs, mile-indexed towns, passes and lakes, and vegan resupply stops with last-checked dates.MIT
- AlicenseBqualityDmaintenanceProvides real-time information about U.S. National Parks through the NPS API, enabling users to search parks, check details, alerts, visitor centers, campgrounds, and upcoming events.6106 npm41MIT
- AlicenseNot gradedqualityDmaintenanceProvides access to the National Park Service API to search for U.S. national parks, view park details, check alerts and closures, find visitor centers, campgrounds, and upcoming events.106 npmMIT
- AlicenseNot gradedqualityDmaintenanceRead-only access to TrailWeights' ultralight gear corpus โ verified weights, creator video reviews, pack templates, and semantic gear search. Auth: none.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.