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
| Name | Required | Description | Default |
|---|---|---|---|
| activities | No | Filter by available activities (e.g., "hiking,camping") | |
| limit | No | Maximum number of parks to return (default: 10, max: 50) | |
| q | No | Search term to filter parks by name or description | |
| start | No | Start position for results (useful for pagination) | |
| stateCode | No | 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") |
Implementation Reference
- src/handlers/findParks.ts:7-53 (handler)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) }] }; }
- src/schemas.ts:4-10 (schema)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';