Skip to main content
Glama
KyrieTangSheng

National Parks MCP Server

findParks

Search U.S. National Parks by state, name, or activities using the NPS API. Filter results, limit outputs, and paginate for precise park discovery.

Instructions

Search for national parks based on state, name, activities, or other criteria

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
activitiesNoFilter by available activities (e.g., "hiking,camping")
limitNoMaximum number of parks to return (default: 10, max: 50)
qNoSearch term to filter parks by name or description
startNoStart position for results (useful for pagination)
stateCodeNoFilter parks by state code (e.g., "CA" for California, "NY" for New York). Multiple states can be comma-separated (e.g., "CA,OR,WA")

Implementation Reference

  • Main handler function for the 'findParks' tool. Validates input (state codes), enforces limits, queries NPS API using npsApiClient, formats output with formatParkData, and returns structured JSON response.
    export async function findParksHandler(args: z.infer<typeof FindParksSchema>) { // Validate state codes if provided if (args.stateCode) { const providedStates = args.stateCode.split(',').map(s => s.trim().toUpperCase()); const invalidStates = providedStates.filter(state => !STATE_CODES.includes(state)); if (invalidStates.length > 0) { return { content: [{ type: "text", text: JSON.stringify({ error: `Invalid state code(s): ${invalidStates.join(', ')}`, validStateCodes: STATE_CODES }) }] }; } } // Set default limit if not provided or if it exceeds maximum const limit = args.limit ? Math.min(args.limit, 50) : 10; // Format the request parameters const requestParams = { limit, ...args }; const response = await npsApiClient.getParks(requestParams); // Format the response for better readability by the AI const formattedParks = formatParkData(response.data); const result = { total: parseInt(response.total), limit: parseInt(response.limit), start: parseInt(response.start), parks: formattedParks }; return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; }
  • Zod schema defining the input shape and descriptions for the 'findParks' tool parameters.
    export const FindParksSchema = z.object({ stateCode: z.string().optional().describe('Filter parks by state code (e.g., "CA" for California, "NY" for New York). Multiple states can be comma-separated (e.g., "CA,OR,WA")'), q: z.string().optional().describe('Search term to filter parks by name or description'), limit: z.number().optional().describe('Maximum number of parks to return (default: 10, max: 50)'), start: z.number().optional().describe('Start position for results (useful for pagination)'), activities: z.string().optional().describe('Filter by available activities (e.g., "hiking,camping")') });
  • src/server.ts:43-47 (registration)
    Registration of the 'findParks' tool in the ListTools handler, specifying name, description, and input schema.
    { name: "findParks", description: "Search for national parks based on state, name, activities, or other criteria", inputSchema: zodToJsonSchema(FindParksSchema), },
  • src/server.ts:85-88 (registration)
    Dispatch logic in the CallTool handler switch statement that parses arguments with FindParksSchema and invokes findParksHandler.
    case "findParks": { const args = FindParksSchema.parse(request.params.arguments); return await findParksHandler(args); }
  • src/server.ts:18-18 (registration)
    Import statement for the findParksHandler function.
    import { findParksHandler } from './handlers/findParks.js';

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/KyrieTangSheng/mcp-server-nationalparks'

If you have feedback or need assistance with the MCP directory API, please join our Discord server