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
JavaScript
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,
};
}
});
};