# io.github.cyanheads/national-parks-mcp-server (remote · national-parks.caseyjhand.com)

Plan US National Park Service trips — parks, alerts, campgrounds, things to do, events.

- Trust score: 68/100 (medium)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `national-parks.caseyjhand.com`: 68/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/national-parks.md), [page](https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/national-parks)
- npm · `@cyanheads/national-parks-mcp-server`: 35/100, [markdown](https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/cyanheads-national-parks-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/cyanheads-national-parks-mcp-server)

## Channel facts

- Endpoint: `https://national-parks.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.5`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 6 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 62/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2090 tokens (~348/item across 6 items; 6 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http cyanheads-national-parks-mcp-server https://national-parks.caseyjhand.com/mcp
```

### Codex

```toml
[mcp_servers.cyanheads-national-parks-mcp-server]
url = "https://national-parks.caseyjhand.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-national-parks-mcp-server": {
      "type": "remote",
      "url": "https://national-parks.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-national-parks-mcp-server --url https://national-parks.caseyjhand.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-national-parks-mcp-server:
    url: "https://national-parks.caseyjhand.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "cyanheads-national-parks-mcp-server": {
      "type": "http",
      "url": "https://national-parks.caseyjhand.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 66, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-29 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 63, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 62)

First indexed and scored.

## MCP tools (6)

### `nps_find_parks` (~456 tokens)

national-parks-mcp-server: find parks

Resolve a place name, US state, or free-text query to National Park Service parks — the required first step before the detail tools. Returns each park's parkCode (the key nps_get_park, nps_get_alerts, nps_find_campgrounds, nps_get_activities, and nps_find_events all use) plus a compact trip-planning summary (designation, states, description, coordinates, headline activities, entrance fee, NPS page). Coverage is US NPS sites only — national parks, monuments, historic sites, seashores — not state parks and not Forest Service or BLM land.

Input parameters:

- `activity` (string): Filter to parks offering an activity, matched against each park's activities list (e.g. "hiking", "camping", "stargazing"). Case-insensitive substring match applied locally (the API has no activity p…
- `limit` (integer): Maximum parks to return (1–50). The full set is ~470 sites; narrow with query/stateCode rather than paging through everything.
- `query` (string): Free-text search across park names and descriptions (e.g. "yosemite", "civil war", "redwood"). Results are re-ranked locally so an exact parkCode or name match leads: NPS returns matches in alphabeti…
- `start` (integer): Zero-based offset for pagination within the matched set. Use with limit to page through results.
- `stateCode` (string): Two-letter US state/territory code, or comma-separated list (e.g. "CA", "WY,MT,ID"). Filters to parks located in those states. Combine with query to narrow.

Output parameters:

- `appliedFilters` (string): Echo of the filters as the server applied them (query / stateCode / activity), so the agent can see what was searched.
- `cap` (number): The limit applied to this response (populated when results were truncated).
- `notice` (string): Guidance when no parks matched — suggests broadening the query, checking the state code, or dropping the activity filter.
- `parks` (array): Matching parks, each carrying the parkCode needed to chain into the detail tools.
- `shown` (number): Number of parks returned in this response (populated when the result set was capped by limit).
- `totalCount` (number): Total parks matching the query/state filter before the limit was applied.

### `nps_get_park` (~202 tokens)

national-parks-mcp-server: get park detail

Full trip-planning detail for one or more parks by parkCode: description, activities and topics, entrance fees and passes, operating hours by area/season, contacts, directions, a free-text weather overview, representative images, and the NPS page for everything else. Get codes from nps_find_parks. Up to ten codes are fetched in a single request. Use the fields parameter to trim the payload when you only need certain sections.

Input parameters:

- `fields` (array): Optional detail sections to include beyond the always-present core (name, designation, states, description, coordinates, weather, url). Omit for all sections. Narrow to reduce payload when you only n…
- `parkCode` (array, required): One to ten park codes (each a 4-letter lowercase code like "yose", "grca", "zion"). Get codes from nps_find_parks. Multiple codes are fetched in a single request.

Output parameters:

- `missingCodes` (array): Requested park codes the API returned no record for — likely invalid/misspelled codes. Populated only when some codes did not resolve.
- `notice` (string): Guidance when one or more codes did not resolve, or when none did.
- `parks` (array): Requested parks with trip-planning detail.
- `requestedCount` (number): Number of park codes requested.
- `returnedCount` (number): Number of parks the API returned.

### `nps_get_alerts` (~441 tokens)

national-parks-mcp-server: get alerts

Current alerts for a park or a whole state — closures, hazards, caution notices, and information — with category and recency surfaced first so "is anything closed at Glacier right now?" is answered at a glance. Get park codes from nps_find_parks, or pass a stateCode for a statewide "what's closed" sweep. Returns most-recent-first; an empty result with totalCount 0 means the park reports nothing closed or hazardous — good news, not an error. An empty page with a non-zero totalCount only means start ran past the end, so read the notice rather than the empty list. Closures and road conditions change daily — re-check before departure.

Input parameters:

- `category` (string): Filter to one alert category. "Danger" and "Park Closure" are the high-priority ones for trip safety. Applied locally (the API has no category param) across every alert matching parkCode/stateCode/qu…
- `limit` (integer): Maximum alerts to return (1–50), most-recent first.
- `parkCode` (string): Park code, or comma-separated list (e.g. "glac", "yose,zion") — 4-letter lowercase codes. Get codes from nps_find_parks. Provide parkCode or stateCode; with neither, returns recent alerts service-wid…
- `query` (string): Free-text search within alert titles/descriptions (e.g. "road", "wildfire", "trail").
- `start` (integer): Zero-based offset for pagination within the matched set. Use with limit to page through results — when totalCount exceeds what was returned, re-request with start advanced by limit.
- `stateCode` (string): Two-letter state code, or comma-separated list (e.g. "MT", "WY,MT,ID"). Returns alerts for all NPS sites in those states — use for a statewide sweep rather than one park.

Output parameters:

- `alerts` (array): Current alerts, sorted most-recent first. An empty array with totalCount 0 means no active alerts — good news, not an error; with a non-zero totalCount it means start paged past the end of the matche…
- `appliedFilters` (string): Echo of parkCode/stateCode/category/query as applied.
- `cap` (number): Limit applied (populated when results were truncated).
- `categoryBreakdown` (string): Count of returned alerts per category (e.g. "Park Closure: 3, Caution: 1, Information: 2") — gauge severity without scanning every alert.
- `notice` (string): Message when the page is empty — states which case it is: good news (totalCount 0, the park reports nothing closed/hazardous right now) or a paging artifact (start ran past the end of a non-empty mat…
- `shown` (number): Alerts returned in this response (populated when capped by limit).
- `totalCount` (number): Total alerts matching the filter before the limit was applied.

### `nps_find_campgrounds` (~244 tokens)

national-parks-mcp-server: find campgrounds

Campgrounds at a park or across a state: amenities (potable water, showers, RV dump station, toilets, trash collection, RV access), reservable vs. first-come-first-served site counts, reservation guidance and booking URL, accessibility, and fees — answering "where can I camp at Zion, and can I get an RV hookup?" Get park codes from nps_find_parks. Some parks list lodging or backcountry permits instead of NPS-managed campgrounds; an empty result is not an error.

Input parameters:

- `limit` (integer): Maximum campgrounds to return (1–50).
- `parkCode` (string): Park code, or comma-separated list (e.g. "zion") — 4-letter lowercase codes. Get codes from nps_find_parks. Provide parkCode or stateCode.
- `query` (string): Free-text search across campground names/descriptions (e.g. "river", "group", "rv").
- `start` (integer): Zero-based pagination offset.
- `stateCode` (string): Two-letter state code, or comma-separated list. Returns campgrounds across all NPS sites in those states.

Output parameters:

- `appliedFilters` (string): Echo of parkCode/stateCode/query as applied.
- `campgrounds` (array): Campgrounds at the requested park(s)/state(s).
- `cap` (number): Limit applied (populated when results were truncated).
- `notice` (string): Guidance when no campgrounds matched.
- `shown` (number): Campgrounds returned in this response (populated when capped by limit).
- `totalCount` (number): Total campgrounds matching the filter before the limit was applied.

### `nps_get_activities` (~253 tokens)

national-parks-mcp-server: get activities

Curated things to do and points of interest at a park — title, description, time commitment, location, accessibility, and fee/pet/reservation flags — answering "what should I do at Acadia?" Covers the NPS editorially-curated activity list (distinct from a park's raw activity tags in nps_get_park). Accepts a single 4-letter park code or a single two-letter state code, and at least one is required. Not every park has a curated list; an empty result is not an error.

Input parameters:

- `limit` (integer): Maximum activities to return (1–50).
- `parkCode` (string): A single 4-letter lowercase park code (e.g. "acad"). Get it from nps_find_parks. Accepts one park code, not a list. Provide parkCode or stateCode.
- `query` (string): Free-text search across activity titles/descriptions (e.g. "sunrise", "hike", "tour").
- `start` (integer): Zero-based pagination offset.
- `stateCode` (string): A single two-letter state code (e.g. "ME"). Returns curated activities across NPS sites in that state.

Output parameters:

- `activities` (array): Curated activities and points of interest for the requested park/state.
- `appliedFilters` (string): Echo of parkCode/stateCode/query as applied.
- `cap` (number): Limit applied (populated when results were truncated).
- `notice` (string): Guidance when no curated activities matched.
- `shown` (number): Activities returned in this response (populated when capped by limit).
- `totalCount` (number): Total activities matching the filter before the limit was applied.

### `nps_find_events` (~346 tokens)

national-parks-mcp-server: find events

Scheduled events at a park within a date range — ranger programs, festivals, tours, interpretive events — answering "what's happening at Yellowstone this weekend?" with title, dates and times, location, category, fee, and registration links. Get park codes from nps_find_parks. Paginates by page number, not offset. The events feed is sparser and less consistent than alerts or campgrounds; many parks list few or no events, and an empty result is not an error.

Input parameters:

- `dateEnd` (string): End of the date window (YYYY-MM-DD). Use with dateStart.
- `dateStart` (string): Start of the date window (YYYY-MM-DD). Combine with dateEnd to bound the search (e.g. a weekend). Omit for upcoming events from today.
- `pageNumber` (integer): 1-based page number. Increment to page through results beyond the first page.
- `pageSize` (integer): Maximum events to return per page (1–50). Paginates by page number, not offset — use with pageNumber to walk through results.
- `parkCode` (string): Park code, or comma-separated list (e.g. "yell") — 4-letter lowercase codes. Get codes from nps_find_parks. Provide parkCode or stateCode.
- `query` (string): Free-text search across event titles/descriptions (e.g. "ranger", "astronomy", "guided").
- `stateCode` (string): Two-letter state code, or comma-separated list (e.g. "WY", "WY,MT,ID"). Returns events across NPS sites in those states.

Output parameters:

- `appliedFilters` (string): Echo of parkCode/stateCode/date window/query as applied.
- `cap` (number): Page size applied (populated when results were truncated).
- `events` (array): Events matching the park/state and date window.
- `notice` (string): Guidance when no events matched, or a warning when the upstream envelope reported errors.
- `shown` (number): Events returned on this page (populated when the page was capped by pageSize).
- `totalCount` (number): Total events matching the filter before the page limit.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/national-parks#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 67
- 2026-08-01: 67
- 2026-07-31: 66
- 2026-07-30: 65
- 2026-07-29: 64
- 2026-07-28: 63
- 2026-07-27: 63
- 2026-07-26: 62

## Links

- Remote endpoint: https://national-parks.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/national-parks-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/national-parks/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/national-parks/changelog.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-national-parks-mcp-server/national-parks
