UNPKG

campertunity-mcp-server

Version:

MCP Server for Campertunity - A Model Context Protocol server for interacting with camping and outdoor recreation data

100 lines (99 loc) 4.25 kB
import { z } from 'zod'; export var Tag; (function (Tag) { // SiteType Tag["tent"] = "tent"; Tag["rv"] = "rv"; Tag["lodging"] = "lodging"; Tag["glamping"] = "glamping"; Tag["cabin"] = "cabin"; // AccessType Tag["driveIn"] = "driveIn"; Tag["walkIn"] = "walkIn"; Tag["equestrian"] = "equestrian"; Tag["boat"] = "boat"; // Activities Tag["biking"] = "biking"; Tag["boating"] = "boating"; Tag["fishing"] = "fishing"; Tag["hiking"] = "hiking"; Tag["horsebackRiding"] = "horsebackRiding"; Tag["paddling"] = "paddling"; Tag["windSports"] = "windSports"; Tag["surfing"] = "surfing"; Tag["swimming"] = "swimming"; Tag["whitewaterPaddling"] = "whitewaterPaddling"; Tag["wildlifeWatching"] = "wildlifeWatching"; // Amenities Tag["picnicTable"] = "picnicTable"; Tag["fires"] = "fires"; Tag["toilets"] = "toilets"; Tag["outhouse"] = "outhouse"; Tag["potableWater"] = "potableWater"; Tag["petFriendly"] = "petFriendly"; Tag["rvHookup"] = "rvHookup"; Tag["rvSanitation"] = "rvSanitation"; Tag["trash"] = "trash"; Tag["showers"] = "showers"; Tag["wifi"] = "wifi"; Tag["handicap"] = "handicap"; // Terrain Tag["beach"] = "beach"; Tag["cave"] = "cave"; Tag["desert"] = "desert"; Tag["forest"] = "forest"; Tag["hotSpring"] = "hotSpring"; Tag["lake"] = "lake"; Tag["river"] = "river"; Tag["swimmingHole"] = "swimmingHole"; Tag["waterfall"] = "waterfall"; Tag["creek"] = "creek"; })(Tag || (Tag = {})); export const placeSearchTool = (server, campertunityClient) => { server.tool('place-search', { limit: z.number().default(50).optional().describe('Number of places to return. Default is 50, max is 1000.'), startDate: z.string().optional().describe('Start date for availability search. Format: YYYY-MM-DD'), endDate: z.string().optional().describe('End date for availability search. Format: YYYY-MM-DD'), adults: z.number().optional().describe('Number of adults. Default is 1.'), children: z.number().optional().describe('Number of children. Default is 0.'), latitude: z.number().optional().describe('Latitude to filter by.'), longitude: z.number().optional().describe('Longitude to filter by.'), radius: z.number().optional().default(20).describe('Radius to filter by (in km).'), filters: z.array(z.enum(Object.values(Tag))).optional().describe('Filter out places that have specific tags.'), campgroundDescription: z.string().optional().describe('Describe the campground you are looking for. Note: not the location, but something about the campground like "has a pool" or "near a lake" or "has a playground"'), }, async ({ limit, startDate, endDate, adults, children, latitude, longitude, radius, filters, campgroundDescription }) => { try { const params = new URLSearchParams(); if (limit) params.set('limit', limit.toString()); if (startDate) params.set('startDate', startDate); if (endDate) params.set('endDate', endDate); if (adults) params.set('adults', adults.toString()); if (children) params.set('children', children.toString()); if (latitude) params.set('latitude', latitude.toString()); if (longitude) params.set('longitude', longitude.toString()); if (radius) params.set('radius', radius.toString()); if (filters) params.set('filters', filters.join(',')); if (campgroundDescription) params.set('campgroundDescription', campgroundDescription); const places = await campertunityClient.get(`/place/search?${params.toString()}`); return { content: [{ type: 'text', text: JSON.stringify(places), mimeType: 'application/json' }], }; } catch (error) { return { content: [{ type: 'text', text: 'Error: ' + error.message }], isError: true, }; } }); };