national-parks-mcp-server
Server Details
Plan US National Park Service trips — parks, alerts, campgrounds, things to do, events.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/national-parks-mcp-server
- GitHub Stars
- 1
- Server Listing
- National Parks MCP Server
Available Tools
6 toolsnps_find_campgroundsnational-parks-mcp-server: find campgroundsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum campgrounds to return (1–50). | |
| query | No | Free-text search across campground names/descriptions (e.g. "river", "group", "rv"). | |
| start | No | Zero-based pagination offset. | |
| parkCode | No | Park code, or comma-separated list (e.g. "zion") — 4-letter lowercase codes. Get codes from nps_find_parks. Provide parkCode or stateCode. | |
| stateCode | No | Two-letter state code, or comma-separated list. Returns campgrounds across all NPS sites in those states. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Limit applied (populated when results were truncated). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Campgrounds returned in this response (populated when capped by limit). |
| notice | No | Guidance when no campgrounds matched. |
| totalCount | No | Total campgrounds matching the filter before the limit was applied. |
| campgrounds | No | Campgrounds at the requested park(s)/state(s). |
| appliedFilters | No | Echo of parkCode/stateCode/query as applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and openWorld. Description adds caveat about empty results not being an error, which clarifies behavior beyond annotations. No contradictions. Does not discuss rate limits or pagination, but schema covers start/limit.
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?
Two sentences covering purpose, content, and a caveat. Front-loaded with action and output type. No filler, but the example question adds slight verbosity without major cost.
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?
Comprehensive for a query tool: describes return fields, dependency on park codes, edge case of empty results. Output schema exists, so return structure is further specified. Missing explicit pagination behavior but schema provides start/limit fields.
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 parameters are already documented. Description adds example use of query ('river', 'group', 'rv') and reminds to get park codes from another tool, but does not deepen semantic meaning beyond schema. Meets baseline for high coverage.
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?
Clear verb+resource: 'find campgrounds'. States exact fields returned (amenities, site counts, fees) and answers a concrete user question ('where can I camp at Zion, and can I get an RV hookup?'). Distinct from siblings like events or alerts; references nps_find_parks as prerequisite.
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?
Describes context of use (campground search) and explicitly points to nps_find_parks for codes. Warns that some parks return lodging/backcountry permits instead, so empty results expected. Does not name alternative tools to switch to, but the dependency is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nps_find_eventsnational-parks-mcp-server: find eventsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Free-text search across event titles/descriptions (e.g. "ranger", "astronomy", "guided"). | |
| dateEnd | No | End of the date window (YYYY-MM-DD). Use with dateStart. | |
| pageSize | No | Maximum events to return per page (1–50). Paginates by page number, not offset — use with pageNumber to walk through results. | |
| parkCode | No | Park code, or comma-separated list (e.g. "yell") — 4-letter lowercase codes. Get codes from nps_find_parks. Provide parkCode or stateCode. | |
| dateStart | No | 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. | |
| stateCode | No | Two-letter state code, or comma-separated list (e.g. "WY", "WY,MT,ID"). Returns events across NPS sites in those states. | |
| pageNumber | No | 1-based page number. Increment to page through results beyond the first page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Page size applied (populated when results were truncated). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Events returned on this page (populated when the page was capped by pageSize). |
| events | No | Events matching the park/state and date window. |
| notice | No | Guidance when no events matched, or a warning when the upstream envelope reported errors. |
| totalCount | No | Total events matching the filter before the page limit. |
| appliedFilters | No | Echo of parkCode/stateCode/date window/query as applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature is covered. The description adds valuable non-obvious behavior: pagination is by page number (not offset), and the feed is sparse/inconsistent with empty results being normal. This beyond-annotation context helps an agent set expectations and handle responses correctly.
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?
The description is compact yet dense with information, front-loading the purpose and example before technical caveats. Each sentence serves a distinct purpose: what it does, what it returns, cross-reference to park codes, pagination behavior, and data quality warning. No wasted words.
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?
Given an output schema exists, the description need not explain return values. It covers all critical call-time concerns: how to specify parks/states, date range usage, pagination method, empty-result semantics, and cross-tool references. For a tool with 7 optional parameters and a mutual-exclusivity constraint, this is complete for correct invocation.
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% with each parameter documented, so the baseline is 3. The description adds extra meaning beyond the schema: it clarifies the mutual exclusivity of parkCode and stateCode ('Provide parkCode or stateCode') and explains pagination semantics ('paginates by page number, not offset'). This directly aids correct invocation.
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?
The description clearly states it finds scheduled events at a park within a date range, specifying event types (ranger programs, festivals, tours, interpretive events) and the exact answer it provides ('what's happening at Yellowstone this weekend?'). It distinguishes itself from sibling tools like alerts and campgrounds by the data it returns (title, dates, location, category, fee, registration links).
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?
It provides clear context for when to use the tool (e.g., 'what's happening at this park this weekend?') and explicitly instructs to get park codes from nps_find_parks. It also notes the events feed is sparser than alerts or campgrounds, implying alternative tools for those use cases, but does not explicitly say 'use nps_get_alerts for alerts' – leaving the differentiation slightly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nps_find_parksnational-parks-mcp-server: find parksARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum parks to return (1–50). The full set is ~470 sites; narrow with query/stateCode rather than paging through everything. | |
| query | No | 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 alphabetical-by-code order with no relevance ranking, so without this the obvious park can sit behind sites that only mention the term in their description. 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 | No | Zero-based offset for pagination within the matched set. Use with limit to page through results. | |
| activity | No | 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 param) across every site matching query/stateCode, then paginated with start/limit — so totalCount is the true count of matching parks, not a per-page tally. Use nps_get_park to see a park's full activity list. | |
| stateCode | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit applied to this response (populated when results were truncated). |
| error | No | Present when the call failed. Absent on success. |
| parks | No | Matching parks, each carrying the parkCode needed to chain into the detail tools. |
| shown | No | Number of parks returned in this response (populated when the result set was capped by limit). |
| notice | No | Guidance when no parks matched — suggests broadening the query, checking the state code, or dropping the activity filter. |
| totalCount | No | Total parks matching the query/state filter before the limit was applied. |
| appliedFilters | No | Echo of the filters as the server applied them (query / stateCode / activity), so the agent can see what was searched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=true, which are generic. The description adds significant behavioral detail: local re-ranking for exact matches, that NPS returns results in alphabetical-by-code order with no relevance ranking, that the activity filter is a local substring match (the API has no activity param), and that totalCount reflects true matches across all parks. It also clarifies pagination semantics and coverage scope. These are exactly the behaviors an agent needs to interpret results correctly.
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?
The description is packed but efficient. The first sentence establishes purpose and the required-first-step role, then bullet-like details enumerate return contents, then a compact coverage clause. No wasted words; every sentence carries functional information. For an entry-point tool with five optional parameters, this length is justified and well-front-loaded.
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?
Given the tool's complexity (5 optional params, no required, local filtering, re-ranking, ~470 sites) and the presence of an output schema, the description covers all critical usage scenarios: parameter combinations, edge cases (no query/stateCode), pagination behavior, and the relationship to detail tools. Nothing an agent needs to call this 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 coverage is 100%, so each parameter already has a description. The description goes further: it explains the re-ranking nuance for query, the local filtering and totalCount semantics for activity, and the pagination behavior for start/limit. It also warns against paging through all sites with limit and suggests narrowing with query/stateCode. This adds genuine value beyond 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 ('Resolve') with a clear resource ('place name, US state, or free-text query to National Park Service parks') and immediately positions it as 'the required first step before the detail tools.' It lists exactly what is returned (parkCode, trip-planning summary) and explicitly names the sibling tools that depend on it, making differentiation trivial.
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 declares when to use this tool ('first step before the detail tools'), when to omit parameters ('Omit to browse by state'), and what happens with no parameters ('returns the first page of all ~470 NPS sites'). It also states exclusions ('not state parks and not Forest Service or BLM land') and recommends using at least one of query or stateCode. No ambiguity about usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nps_get_activitiesnational-parks-mcp-server: get activitiesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum activities to return (1–50). | |
| query | No | Free-text search across activity titles/descriptions (e.g. "sunrise", "hike", "tour"). | |
| start | No | Zero-based pagination offset. | |
| parkCode | No | 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. | |
| stateCode | No | A single two-letter state code (e.g. "ME"). Returns curated activities across NPS sites in that state. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Limit applied (populated when results were truncated). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Activities returned in this response (populated when capped by limit). |
| notice | No | Guidance when no curated activities matched. |
| activities | No | Curated activities and points of interest for the requested park/state. |
| totalCount | No | Total activities matching the filter before the limit was applied. |
| appliedFilters | No | Echo of parkCode/stateCode/query as applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds value by explicitly stating the open-world behavior ('Not every park has a curated list; an empty result is not an error') and clarifying the curated vs. raw distinction. It does not contradict annotations and provides useful context beyond the structured fields.
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?
The description is dense but every sentence earns its place. It front-loads the core purpose and content, then clarifies the distinction, input constraints, and edge-case behavior. No redundancy or 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?
Given the tool has 5 params and an output schema, the description covers the key aspects: purpose, input requirements, empty-result behavior, and differentiation from a sibling. It does not clarify what happens if both parkCode and stateCode are provided (though schema implies 'or'), nor does it describe the output format in detail, but the output schema covers that. Overall, it's quite complete for an agent to use 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 description coverage is 100%, so baseline is 3. The description adds extra meaning: it emphasizes that parkCode is a single code (not a list), specifies that at least one of parkCode/stateCode is required, and cross-references nps_find_parks for obtaining park codes. These details go beyond the schema's descriptions, justifying a 4.
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?
The description states a specific verb+resource (returns curated activities) with a concrete use case ('what should I do at Acadia?') and lists the content fields. It explicitly differentiates from the sibling nps_get_park by noting the curated list vs. raw activity tags, making it easy for an agent to select the right tool.
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?
It names the alternative (nps_get_park) and the condition that selects it (raw tags vs. curated list), and explicitly states the input requirement ('at least one is required' for parkCode/stateCode). It also sets expectations for empty results ('an empty result is not an error'), giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nps_get_alertsnational-parks-mcp-server: get alertsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum alerts to return (1–50), most-recent first. | |
| query | No | Free-text search within alert titles/descriptions (e.g. "road", "wildfire", "trail"). | |
| start | No | 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. | |
| category | No | 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/query, then paginated with start/limit — so totalCount is the true count of matching alerts, not a per-page tally. Omit to see all categories (the default — closures and hazards should not be missed). | |
| parkCode | No | 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-wide. | |
| stateCode | No | 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 Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Limit applied (populated when results were truncated). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Alerts returned in this response (populated when capped by limit). |
| alerts | No | 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 matches. The notice says which. |
| notice | No | 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 matched set). |
| totalCount | No | Total alerts matching the filter before the limit was applied. |
| appliedFilters | No | Echo of parkCode/stateCode/category/query as applied. |
| categoryBreakdown | No | Count of returned alerts per category (e.g. "Park Closure: 3, Caution: 1, Information: 2") — gauge severity without scanning every alert. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true, openWorldHint=true) already establish the safety profile; the description goes well beyond this. It discloses ordering ('most-recent-first'), the exact semantics of empty results vs. empty pages ('An empty page with a non-zero totalCount only means start ran past the end'), the local-filter behavior of category, and a real-world caveat ('Closures and road conditions change daily — re-check before departure'). No contradiction with annotations — the read-only, open-world hints align perfectly with the described 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?
The main purpose is front-loaded in the first sentence with the key use-case poised as a question. The three sentences each earn their place: purpose+recency priority, usage routing, and output semantics. Dense but not bloated for a 6-parameter tool with non-trivial pagination and filtering semantics. Slightly compresses the category-local-filter detail into the schema, which keeps the main description lean.
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 no obligation to explain return values. The description covers purpose, input routing (park vs. state, service-wide fallback), result interpretation (empty = good news vs. empty page = pagination overrun), recency ordering, and a freshness warning. For a tool with this complexity — 6 params, pagination, local filtering, cross-tool dependency — nothing an agent needs to 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 coverage is 100% (all 6 params described in schema with enums and defaults), so baseline is 3. The description adds real value beyond schema: it ranks category values ('Danger' and 'Park Closure' are the high-priority ones), explains that category filtering is applied locally vs. API-native, explains the meaning of totalCount under local filtering, and provides the nps_find_parks cross-reference for parkCode. This meaningful interpretation pushes it above baseline.
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?
Specific verb ('get alerts') + resource (NPS alerts) + explicit scope ('for a park or a whole state') with the alert types enumerated (closures, hazards, caution notices, information). The sibling set (campgrounds, events, parks, activities) contains no alert tool, so the domain is auto-differentiated, and the description reinforces this by naming the exact resource. No ambiguity in what this tool does.
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?
Provides clear when-to-use context: 'Get park codes from nps_find_parks, or pass a stateCode for a statewide sweep' names the concrete alternative for obtaining input. It also tells the agent how to interpret outcomes ('an empty result with totalCount 0 means... good news, not an error'), which guides decision-making. It doesn't explicitly state when NOT to use this tool versus an alternative, but sibling domains are separated so cleanly by topic that explicit exclusions would be redundant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nps_get_parknational-parks-mcp-server: get park detailARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | 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 need, say, hours and fees. | |
| parkCode | Yes | 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 Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| parks | No | Requested parks with trip-planning detail. |
| notice | No | Guidance when one or more codes did not resolve, or when none did. |
| missingCodes | No | Requested park codes the API returned no record for — likely invalid/misspelled codes. Populated only when some codes did not resolve. |
| returnedCount | No | Number of parks the API returned. |
| requestedCount | No | Number of park codes requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, lowering the burden. The description adds value beyond annotations: single-request batching up to ten codes, the always-present core-field set vs. optional sections, and a pointer to the NPS page for anything not covered. No contradiction with annotations; 'get' aligns with the read-only hint.
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?
A single dense paragraph where every sentence earns its place: content list, code source, batching limit, and payload trimming. It is slightly longer than the leanest ideal but sharply front-loaded with the purpose and scoping guidance, with no filler or redundancy.
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?
Given the output schema documents return values and annotations cover safety, the description supplies the remaining operational context: content scope, batching, code acquisition, payload control, and a fallback pointer to the NPS page. A minor gap is behavior for invalid/unknown codes, but overall the agent has everything needed to call it 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% and both parameters are thoroughly documented: parkCode specifies format, examples, count range and batching; fields lists all enum values and the omit-for-all behavior. The description largely reiterates what the schema already states ('Get codes from nps_find_parks', 'single request'), adding little new semantic meaning beyond the structured definitions.
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?
The description uses a specific verb-resource pair (get park detail by parkCode) and enumerates the full content sections returned (description, activities, topics, fees, hours, contacts, directions, weather, images, NPS page). This fully differentiates it from siblings like nps_get_alerts and nps_get_activities without needing to inspect their schemas.
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?
Provides concrete usage context: how to obtain valid codes (from nps_find_parks), that up to ten codes fetch in one request, and that the fields parameter trims payloads. It does not name explicit when-not-to-use conditions or alternative siblings for cases like current alerts, but the cross-tool routing to nps_find_parks is clear and actionable.
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. Dates show when Glama detected each change.
6 tool updates
- Changed
nps_find_campgrounds6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "campgrounds", + "totalCount", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_park_code`: A parkCode token isn't 4 lowercase letters. `invalid_state_code`: A stateCode token isn't two letters. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_park_code", + "invalid_state_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "campgrounds", - "totalCount", - "appliedFilters" -]
- Changed
nps_find_events6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "events", + "totalCount", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_date`: dateStart/dateEnd not YYYY-MM-DD, not a real calendar date (e.g. 2026-02-31), or dateEnd < dateStart. `invalid_park_code`: A parkCode token isn't 4 lowercase letters. `invalid_state_code`: A stateCode token isn't two letters. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_date", + "invalid_park_code", + "invalid_state_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "events", - "totalCount", - "appliedFilters" -]
- Changed
nps_find_parks6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "parks", + "totalCount", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_state_code`: A stateCode token is not two letters. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_state_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "parks", - "totalCount", - "appliedFilters" -]
- Changed
nps_get_activities6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "activities", + "totalCount", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `missing_filter`: Neither parkCode nor stateCode provided. Other values are possible when a failure originates below the handler.", + "examples": [ + "missing_filter" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "activities", - "totalCount", - "appliedFilters" -]
- Changed
nps_get_alerts6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alerts", + "totalCount", + "categoryBreakdown", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_park_code`: A parkCode token isn't 4 lowercase letters. `invalid_state_code`: A stateCode token isn't two letters. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_park_code", + "invalid_state_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "alerts", - "totalCount", - "categoryBreakdown", - "appliedFilters" -]
- Changed
nps_get_park6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "parks", + "requestedCount", + "returnedCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_parks_found`: The API returned zero records for every requested code. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_parks_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "parks", - "requestedCount", - "returnedCount" -]
4 tool updates
- Changed
nps_find_campgrounds3 fields changed- changed
Input schema / properties / parkCode / descriptionPrevious value: -"Park code, or comma-separated list (e.g. \"zion\"). Get codes from nps_find_parks. Provide parkCode or stateCode."New value: +"Park code, or comma-separated list (e.g. \"zion\") — 4-letter lowercase codes. Get codes from nps_find_parks. Provide parkCode or stateCode." - removed
Input schema / properties / parkCode / patternRemoved value: -"^[a-z]{4}(,[a-z]{4})*$" - removed
Input schema / properties / stateCode / patternRemoved value: -"^[A-Za-z]{2}(,[A-Za-z]{2})*$"
- Changed
nps_find_events9 fields changed- changed
Input schema / properties / parkCode / descriptionPrevious value: -"Park code, or comma-separated list (e.g. \"yell\"). Get codes from nps_find_parks. Provide parkCode or stateCode."New value: +"Park code, or comma-separated list (e.g. \"yell\") — 4-letter lowercase codes. Get codes from nps_find_parks. Provide parkCode or stateCode." - removed
Input schema / properties / parkCode / patternRemoved value: -"^[a-z]{4}(,[a-z]{4})*$" - changed
Input schema / properties / stateCode / descriptionPrevious value: -"Two-letter state code, or comma-separated list. Returns events across NPS sites in those states."New value: +"Two-letter state code, or comma-separated list (e.g. \"WY\", \"WY,MT,ID\"). Returns events across NPS sites in those states." - removed
Input schema / properties / stateCode / patternRemoved value: -"^[A-Za-z]{2}(,[A-Za-z]{2})*$" - changed
Output schema / properties / events / items / properties / dateEnd / descriptionPrevious value: -"Event end date (YYYY-MM-DD), or null."New value: +"Event end date (YYYY-MM-DD), or null. For a recurring event this is the anchor date, not the last occurrence — see occurrenceDates and isRecurring." - changed
Output schema / properties / events / items / properties / dateStart / descriptionPrevious value: -"Event start date (YYYY-MM-DD), or null."New value: +"Event start date (YYYY-MM-DD), or null. For a recurring event this is the series anchor (its original first date), which can predate your requested window — use occurrenceDates for the dates that actually fall in the window." - added
Output schema / properties / events / items / properties / isRecurringAdded value: +{ + "description": "True when this is a recurring series (multiple occurrence dates). Explains why dateStart/dateEnd may show a single frozen anchor date while occurrenceDates carries the real dates.", + "type": "boolean" +} - added
Output schema / properties / events / items / properties / occurrenceDatesAdded value: +{ + "description": "Occurrence dates (YYYY-MM-DD) that fall within the requested dateStart/dateEnd window. When no date window is requested, this lists every remaining occurrence from today through the series end. Empty when the window matches no occurrence. Trust this for \"when does this actually happen?\" — dateStart/dateEnd above are the record's anchor and can be stale for a long-running recurring series.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / events / items / requiredPrevious value: -[ - "id", - "title", - "parkCode", - "description", - "location", - "dateStart", - "dateEnd", - "times", - "category", - "isFree", - "feeInfo", - "registrationUrl", - "infoUrl" -]New value: +[ + "id", + "title", + "parkCode", + "description", + "location", + "dateStart", + "dateEnd", + "occurrenceDates", + "isRecurring", + "times", + "category", + "isFree", + "feeInfo", + "registrationUrl", + "infoUrl" +]
- Changed
nps_find_parks1 field changed- removed
Input schema / properties / stateCode / patternRemoved value: -"^[A-Za-z]{2}(,[A-Za-z]{2})*$"
- Changed
nps_get_alerts3 fields changed- changed
Input schema / properties / parkCode / descriptionPrevious value: -"Park code, or comma-separated list (e.g. \"glac\", \"yose,zion\"). Get codes from nps_find_parks. Provide parkCode or stateCode; with neither, returns recent alerts service-wide."New value: +"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-wide." - removed
Input schema / properties / parkCode / patternRemoved value: -"^[a-z]{4}(,[a-z]{4})*$" - removed
Input schema / properties / stateCode / patternRemoved value: -"^[A-Za-z]{2}(,[A-Za-z]{2})*$"
3 tool updates
- Changed
nps_find_parks2 fields changed- changed
Input schema / properties / activity / descriptionPrevious value: -"Filter to parks offering an activity, matched against each park's activities list (e.g. \"hiking\", \"camping\", \"stargazing\"). Case-insensitive substring match applied locally after fetch — it narrows the returned page, it does not search all ~470 sites by activity. Use nps_get_park to see a park's full activity list."New value: +"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 param) across every site matching query/stateCode, then paginated with start/limit — so totalCount is the true count of matching parks, not a per-page tally. Use nps_get_park to see a park's full activity list." - changed
Input schema / properties / query / descriptionPrevious value: -"Free-text search across park names and descriptions (e.g. \"yosemite\", \"civil war\", \"redwood\"). 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."New value: +"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 alphabetical-by-code order with no relevance ranking, so without this the obvious park can sit behind sites that only mention the term in their description. 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."
- Changed
nps_get_alerts4 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter to one alert category. \"Danger\" and \"Park Closure\" are the high-priority ones for trip safety. Omit to see all categories (the default — closures and hazards should not be missed)."New value: +"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/query, then paginated with start/limit — so totalCount is the true count of matching alerts, not a per-page tally. Omit to see all categories (the default — closures and hazards should not be missed)." - added
Input schema / properties / startAdded value: +{ + "default": 0, + "description": "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.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / alerts / descriptionPrevious value: -"Current alerts, sorted most-recent first. An empty array means no active alerts — good news, not an error."New value: +"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 matches. The notice says which." - changed
Output schema / properties / notice / descriptionPrevious value: -"Message when there are no active alerts — explicitly states this is good news (the park reports nothing closed/hazardous right now)."New value: +"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 matched set)."
- Changed
nps_get_park2 fields changed- changed
Output schema / properties / parks / items / properties / images / descriptionPrevious value: -"Representative park images (included unless fields excludes \"images\"). Capped at 5. May be empty."New value: +"Representative park images (included unless fields excludes \"images\"). Capped at 5; imagesTruncated flags when the park has more. May be empty." - added
Output schema / properties / parks / items / properties / imagesTruncatedAdded value: +{ + "description": "True when the park has more images upstream than the 5 returned here — open the park url for the full set. Present only when the images section is included.", + "type": "boolean" +}
6 tool updates
- First observed
nps_find_campgrounds - First observed
nps_find_events - First observed
nps_find_parks - First observed
nps_get_activities - First observed
nps_get_alerts - First observed
nps_get_park
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Campground discovery, availability, planning, and booking handoffs across US public lands.
NPS MCP — US National Park Service (free key, generous limits)
US outdoor recreation: 37k+ trails, 30k+ campgrounds, parks, weather + wildfire safety. Read-only.
Recreation.gov MCP — wraps the Recreation Information Database (RIDB) API v1
Related MCP Servers
- 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.895MIT
- AlicenseBqualityFmaintenanceProvides 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.689541MIT
- AlicenseNot gradedqualityDmaintenanceProvides access to the National Park Service API, enabling natural language queries about parks, alerts, campgrounds, events, and more.MIT
- AlicenseNot gradedqualityDmaintenanceProvides LLM context on U.S. national parks by integrating National Park Service, Recreation.gov, and weather APIs, enabling queries about park info, trails, alerts, events, weather forecasts, and more via tool calls.3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool targets a distinct domain resource: parks, park details, alerts, events, activities, and campgrounds. There is no overlap in purpose; an agent can unambiguously select the right tool for a query.
All tools follow a consistent `nps_` prefix with a verb-noun pattern (`find_*` or `get_*`). The only minor variation is singular/plural nouns, but this is predictable and does not hinder understanding.
Six tools is well-scoped for a national parks API, each covering a core aspect of trip planning (lookup, detail, alerts, events, activities, campgrounds). No tool feels redundant or unnecessary.
The surface covers primary trip-planning needs: finding parks, getting detailed info, checking alerts, seeing events, exploring activities, and finding campgrounds. Minor gaps like webcams or permits are non-essential, but the set is nearly complete.