findParks
Search U.S. national parks by state, name, activities, or other criteria to find parks matching your interests and location.
Instructions
Search for national parks based on state, name, activities, or other criteria
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| 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") | |
| q | No | Search term to filter parks by name or description | |
| limit | No | Maximum number of parks to return (default: 10, max: 50) | |
| start | No | Start position for results (useful for pagination) | |
| activities | No | Filter by available activities (e.g., "hiking,camping") |
Implementation Reference
- src/handlers/findParks.ts:7-53 (handler)The main handler function for the 'findParks' tool. It validates input, calls the NPS API via npsApiClient, formats the data, and returns a JSON string 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 parameters for the findParks tool, including optional filters like stateCode, search query, limit, etc.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 ListToolsRequestSchema 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/execution registration for 'findParks' in the CallToolRequestSchema switch statement, parsing args and calling the handler.case "findParks": { const args = FindParksSchema.parse(request.params.arguments); return await findParksHandler(args); }