About national-parks-mcp-server
national-parks-mcp-server provides trip-planning information from the US National Park Service for parks, alerts, campgrounds, activities, and events. It is designed for MCP clients planning visits to NPS sites, with park details and current notices available through dedicated tools.
Key features
- 01Find parks by name, state, or query
- 02Retrieve park details, fees, hours, and directions
- 03Check alerts and closures
- 04Search campgrounds and amenities
- 05Browse activities and scheduled events
Use cases
- 01Choose parks for a trip by state or activity
- 02Check closures and hazards before visiting
- 03Compare campground facilities and reservations
- 04Find activities or events during a visit
MCP support
Exposes six tools that let MCP clients query the NPS Data API for trip-planning information. Supports STDIO and Streamable HTTP; a self-hosted instance requires an NPS API key.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://national-parks.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-national-parks https://national-parks.caseyjhand.com/mcp{"mcpServers":{"cyanheads-national-parks":{"type":"http","url":"https://national-parks.caseyjhand.com/mcp"}}}Open in Cursor{"servers":{"cyanheads-national-parks":{"type":"http","url":"https://national-parks.caseyjhand.com/mcp"}}}Open in VS Code{"mcpServers":{"cyanheads-national-parks":{"type":"http","url":"https://national-parks.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-national-parks":{"serverUrl":"https://national-parks.caseyjhand.com/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
6| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Maximum parks to return (1–50). The full set is ~470 sites; narrow with query/stateCode rather than paging through everything. |
| query | string | No | Free-text search across park names and descriptions (e.g. "yosemite", "civil war", "redwood"). Exact parkCode or name matches lead, then other name matches, then parks that only mention the term in their description — ranked across every match before start/limit apply. Omit to browse by state. At least one of query or stateCode is recommended; with neither, returns the first page of all ~470 NPS sites. |
| start | integer | No | Zero-based offset for pagination within the matched set. Use with limit to page through results. |
| activity | string | No | Filter to parks offering an activity, matched against each park's activities list (e.g. "hiking", "camping", "stargazing"). Case-insensitive substring match, combined with query/stateCode and applied before start/limit, so totalCount counts every matching park, not one page. Use nps_get_park to see a park's full activity list. |
| stateCode | string | No | 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. |
Details
From the project README@cyanheads/national-parks-mcp-server
Plan US National Park Service trips — find parks, check alerts and closures, find campgrounds, browse things to do and events via the NPS Data API. STDIO or Streamable HTTP.
Public Hosted Server: https://national-parks.caseyjhand.com/mcp
Overview
Plan a National Park Service trip: find a park, check alerts and closures, and browse campgrounds, activities, and events. Covers national parks, monuments, historic sites, and seashores, not state parks, Forest Service, or BLM land.
Tools
| Tool | Description |
|---|---|
nps_find_parks | Resolve a place name, US state, or free-text query to parks — the required first step. Returns each park's parkCode plus a trip-planning summary. |
nps_get_park | Full detail for up to ten parks in one batched call: description, activities, fees & passes, hours, contacts, directions, weather overview, images. |
nps_get_alerts | Current alerts for a park or state — closures, hazards, caution, information — with category and recency surfaced first. |
nps_find_campgrounds | Campgrounds at a park or state: amenities, reservable vs. first-come site counts, reservation info, accessibility, and fees. |
nps_get_activities | Curated things to do and points of interest: title, duration, location, accessibility, and fee/pet/reservation flags. |
nps_find_events | Scheduled events within a date range: dates/times, location, category, fee, and registration links. |
Capability reference
nps_find_parks tool
- Free-text
query, two-letterstateCode(or a comma-separated list such as"WY,MT,ID"), and an optionalactivityfilter;limit1–50 (default 10) with astartoffset - Each park carries its
parkCodeplus designation, states, description, coordinates, headline activities, lowest entrance fee, and NPS page; exactparkCodeor name matches rank first, andtotalCountcounts every match
nps_get_park tool
- Up to 10
parkCodes per call; the optionalfieldsselector (activities,topics,fees,hours,contacts,directions,images) trims the payload to the sections you need - Always returns name, designation, states, description, coordinates, weather overview, and NPS page; fees and passes by category, hours by area and season, contacts, and up to 5 images (
imagesTruncatedwhen the park has more) - Codes that match no site come back as
missingCodes; the call fails (no_parks_found) only when none resolve
nps_get_alerts tool
- Filter by
parkCode,stateCode, free-textquery, andcategory(Danger,Caution,Information,Park Closure);limit1–50 (default 20) with astartoffset - Most-recent-first, each alert with its category,
lastIndexedDaterecency, and detail;categoryBreakdowncounts the returned alerts by severity - The notice tells an all-clear (no alerts at that location) apart from a filter that matched nothing and a page past the end
nps_find_campgrounds tool
- Filter by
parkCode,stateCode, or free-textquery;limit1–50 (default 15) with astartoffset - Per campground: amenities (potable water, showers, dump station, toilets, trash collection, RV access) as yes, no, or unknown; reservable, first-come, and total site counts; reservation guidance and booking URL; lowest fee, accessibility, coordinates, and NPS page
nps_get_activities tool
- A single
parkCodeor a singlestateCodeis required, plus an optionalquery;limit1–50 (default 15) with astartoffset - Per activity: title, short description, time commitment, location, coordinates, accessibility, season, reservation-required and pets-permitted flags, fee description, and NPS page
nps_find_events tool
- Filter by
parkCode,stateCode, orquerywithin adateStart/dateEndwindow (YYYY-MM-DD); pages bypageNumberandpageSize(1–50, default 15), not by offset - Per event: title, date range,
occurrenceDatesinside the window (isRecurringmarks a series), time slots, location, category, fee, and registration and info URLs - Errors NPS reports alongside results fold into the notice instead of failing the call
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
NPS-specific:
- One service wrapping the NPS Data API (
developer.nps.gov/api/v1,X-Api-Keyauth) across six trip-planning endpoints - Aggressive normalization of NPS's inconsistent payloads — numeric and boolean fields returned as strings, nested values (
campsites.totalSites), array-typed amenity fields, and the distinct/eventsenvelope with lowercased field names — coerced to clean domain types before they reach handlers nps_get_parkbatches up to ten park codes into a single upstream request- Light retry on transient upstream failures (5xx / network); a missing or invalid key fails loud and names
NPS_API_KEY - Coordinates returned by
nps_find_parks/nps_get_parkfeed weather servers (nws-weather,open-meteo) for a forecast
Agent-friendly output:
- Result-set context on every response —
totalCount, truncation (truncated/shown/cap), applied-filter echo, and empty-result notices reach both the structured and text surfaces - Many parks list no campgrounds, curated activities, or events; an empty result comes back with a notice on where else to look, never as an error
- The
parkCode-first workflow is encoded in every tool description;nps_get_parkreturnsmissingCodesso a wrong code self-corrects - Uncertainty preserved, never fabricated — missing coordinates, directions, fees, and amenity values come back
null, not a guess; coordinates are never invented for downstream weather lookups
Getting started
Public Hosted Instance
A public instance is available at https://national-parks.caseyjhand.com/mcp — no installation required. It serves Streamable HTTP; each client takes its own config shape.
For Claude Code:
claude mcp add --transport http national-parks-mcp-server https://national-parks.caseyjhand.com/mcp
For Cline (cline_mcp_settings.json):
{
"mcpServers": {
"national-parks-mcp-server": {
"type": "streamableHttp",
"url": "https://national-parks.caseyjhand.com/mcp"
}
}
}
For Cursor (mcp.json):
{
"mcpServers": {
"national-parks-mcp-server": {
"url": "https://national-parks.caseyjhand.com/mcp"
}
}
}
Claude Desktop adds remote servers under Settings → Connectors.
Self-Hosted / Local
Add the following to your MCP client configuration file. A free NPS Data API key is required — instant signup here.
{
"mcpServers": {
"national-parks-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/national-parks-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"NPS_API_KEY": "your-api-key"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"national-parks-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/national-parks-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"NPS_API_KEY": "your-api-key"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"national-parks-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "NPS_API_KEY=your-api-key",
"ghcr.io/cyanheads/national-parks-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 NPS_API_KEY=... bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4 or higher (or Node.js v24+).
- A free NPS Data API key — instant signup. The server fails to start without it.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/national-parks-mcp-server.git
- Navigate into the directory:
cd national-parks-mcp-server
- Install dependencies:
bun install
- Configure environment:
cp .env.example .env
# edit .env and set NPS_API_KEY
Configuration
All configuration is validated at startup via Zod schemas. Key environment variables:
| Variable | Description | Default |
|---|---|---|
NPS_API_KEY | Required. NPS Data API key, sent as the X-Api-Key header. The server fails to start without it. | — |
NPS_BASE_URL | NPS Data API base URL override (testing / proxy). | https://developer.nps.gov/api/v1 |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for the HTTP server. | 3010 |
MCP_HTTP_ENDPOINT_PATH | Path where the MCP server is mounted. | /mcp |
MCP_SESSION_MODE | Session handling: auto, stateful, or stateless. The schema default auto resolves to stateful; this server sets stateless explicitly. MCP 2026-07-28 is sessionless in either mode. | stateless |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | Log each failed tool call's arguments and result, redacted by key name and capped at LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (default 16384). A secret inside a free-form value is not redacted. | false |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation (spans, metrics, completion logs). | false |
See .env.example for the full list of optional overrides.
Running the server
Local development
-
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t national-parks-mcp-server .
docker run --rm -e NPS_API_KEY=your-key -p 3010:3010 national-parks-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/national-parks-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers the six tools and inits the NPS service. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). |
src/services/nps | NPS Data API service — HTTP client, retry boundary, error-envelope detection, and all upstream normalization. |
tests/ | Unit and integration tests mirroring src/. |
Development guide
See AGENTS.md / CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools in the
createApp()arrays - Wrap the external API: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Data & attribution
Data is retrieved from the NPS Data API operated by the U.S. National Park Service. Content produced by NPS employees in their official capacity is a U.S. Government work in the public domain (17 U.S.C. §§ 101 and 105). No claim to original U.S. Government works.
Not all content returned by the API is government-authored. Some images and materials carry third-party copyright or other restrictions — check individual item rights before reuse.
The NPS Arrowhead symbol is a restricted mark protected under 18 U.S.C. § 701. It must not be reproduced or reused without written permission from the NPS Director.
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
Apache-2.0 — see LICENSE for details.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.