Kompare travel search
by kompare.io · remote · no sign-in to list tools · v0.1.0 · published by io.kompare
Live prices on package holidays and niche trips from Danish travel agencies, with booking links.
4 tools: 4 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads4Claude Code: allow: see these tools
3 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http search https://mcp.kompare.io/mcpFindings
Matches of fixed checks, with the text they matched.
- Infofind_trips
The description is 3,203 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...plan, stars, transport, ski pass, distance to the lift, ...) use search_listings."
- Infosearch_listings
The description is 58,467 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...acets before search_listings to verify results exist — use the EXACT SAME filters"
- Infoget_facets
The description is 6,594 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...rformance). Filtered facets exclude their own filter to keep all options visible."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
4 tools
Only reads 4Claude Code: allow
find_tripsThe quickest way to search: describe the trip in plain words and get bookable trips back in one call.1 finding
Why it is in this group
- The name "find_trips" says "find": a word for reading.
Findings
- Info
The description is 3,203 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...plan, stars, transport, ski pass, distance to the lift, ...) use search_listings."
Description, as the server wrote it The quickest way to search: describe the trip in plain words and get bookable trips back in one call. travelType, one of: - ski: ski and snowboard holidays - golf: golf holidays - surf: surf camps and holidays - diving: diving holidays - hiking: hiking and walking holidays - charter: package holidays: sun and beach trips with flight and hotel - cycling: cycling holidays - football: football trips: a match ticket with travel and hotel - carrental: car rental - f1: Formula 1 race trips - running: running races abroad, marathons, running camps and trail tours - americanfootball: NFL game trips - yoga: yoga retreats - triathlon: triathlon races and training camps - cruise: cruises - coach: coach (bus) tours - holidayhome: holiday homes and cottages - roundtrip: round trips and guided tours through several places - citybreak: city breaks - dance: dance holidays - wellness: wellness, spa and retreat stays - safari: safaris - culture: culture trips: art, music, opera, history and theatre - sportsevent: trips to sports events other than football, F1 and NFL - camping: camping holidays: tents, mobile homes and campsite cabins - hunting: hunting trips - culinary: food and wine trips - fishing: fishing trips - language: language courses abroad - racket: padel and tennis trips - motorcycle: motorcycle tours - riding: horse riding holidays - birding: birdwatching trips - sailing: sailing holidays - concert: coach trips to concerts - umrah: Umrah and Hajj packages places: destinations, ski areas, regions or countries in plain words, English or Danish ("Ischgl", "Østrig", "Costa del Sol"). Leave it out for anywhere. When: startFrom/startTo (the window the trip starts in) or months. Party: adults and children, since prices depend on them. Optional: durationDays, maxPricePerPerson, sort (best, cheapest, soonest), limit. Response: { understood, ...{ total, accommodationCount, offset, results: [{ name, country, destination, stars, guestRating, tripsAvailable, trips: [{ start, end, durationDays, adults, children, price, pricePerPerson, currency, priceBeforeDiscount, transport, meals, unit, seller, bookingUrl }] }] } } - understood says how the request was read: the places searched, placesNotFound and placesAmbiguous. When a place was not found or is ambiguous, tell the user instead of presenting other trips as theirs. - price is the whole party's price; pricePerPerson divides it. Quote them as given, in currency — never convert or round them into a different claim. - trips holds the first few dates in sort order; tripsAvailable says how many more exist. Page with offset (it counts accommodations). - seller is the travel agency that sells the trip. bookingUrl opens that trip on the seller's site — give it to the user as the way to book. It is null when the seller can only be compared, not booked, through Kompare. - start/end are the trip's own first and last day. When nothing matches, the response holds alternatives (counts with one filter removed) to suggest what to relax. When no place matched at all, it holds a message and nothing was searched. For a filter this tool lacks (meal plan, stars, transport, ski pass, distance to the lift, ...) use search_listings.
Annotations the server declares
- title: Find trips in plain words
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_facetsGet facet counts for filterable fields, respecting current filters.1 finding
Why it is in this group
- The name "get_facets" says "get": a word for reading.
Findings
- Info
The description is 6,594 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...rformance). Filtered facets exclude their own filter to keep all options visible."
Description, as the server wrote it Get facet counts for filterable fields, respecting current filters. CRITICAL: You MUST include ALL established filters in every call — especially niche, market, adults, children, and arrivalWeeks/arrivalMonths. The facetFields parameter only controls which breakdowns are returned, NOT which filters are applied. If you omit a filter like arrivalWeeks, the counts will include ALL dates — giving misleading numbers that won't match actual availability for the user's requested dates. Example — WRONG: User wants ski in France next week for 2 people. You call get_facets with niche="ski", market="dk", countries=["france"], facetFields=["destinationSlug"]. This returns counts across ALL dates — showing destinations that may have 0 results for next week. Example — RIGHT: Same scenario. You call get_facets with niche="ski", market="dk", countries=["france"], arrivalWeeks=["2026-W15"], adults=2, children=0, facetFields=["destinationSlug"]. This returns only destinations with actual availability for next week with 2 adults. Returns: { totalCount, facets: { fieldName: { value: count, ... }, ... }, hierarchical } hierarchical lists field pairs (e.g. country ↔ destination) whose bucket counts are not expected to sum to totalCount. Common use cases: - Check destination availability: facetFields=["countrySlug", "destinationSlug"] — include arrivalWeeks + adults + children - Check date availability: facetFields=["arrivalYearWeek", "arrivalYearMonth"] — include destination/country + adults + children - Explore filter options: facetFields=["durationDays", "provider"] — include ALL current filters - Answer "where else can I go?": facetFields=["countrySlug", "destinationSlug"] — include ALL current filters (dates, travelers) Facetable fields — common (every niche): countrySlug, destinationSlug, provider, centrumDistanceRange, priceRange, pricePerPersonRange, durationDays, arrivalYearWeek, arrivalYearMonth, arrivalDate, stars, guestRatingBucket, transport, accommodationType, mealPlanType, accommodationFeatures. Niche-scoped (only meaningful on that niche): ski — skiPassIncluded, skiLiftDistanceRange, skiBusDistanceRange, skiSlopeDistanceRange, guideIncluded, transferIncluded; golf — greenFeeIncluded, courseDistanceRange, golfRoundsRange, golfTripType, golfBagIncluded, guideIncluded, transferIncluded; surf — transferIncluded, dateFlexible, boardSports, surfLevel, instruction, surfAccommodation, lessonDays, equipmentIncluded, yogaIncluded; diving — diveTripType, diveArea, certificationRequired, divesIncluded, nitroxIncluded, gearIncluded, danishDiveLeader, unlimitedHouseReef, parkFeesIncluded, dateFlexible; hiking — difficultyLevel, dailyDistanceRange, trailheadDistanceRange, tripFormat, routeDistanceRange, elevationGainRange, luggageTransportIncluded, guideIncluded, gpxAvailable; charter — beachDistanceRange, guideIncluded, transferIncluded; cycling — difficultyLevel, cyclingType, tripFormat, routeDistanceRange, elevationGainRange, eBikeAvailable, luggageTransportIncluded, guideIncluded, bikeRentalAvailable, gpxAvailable; football — league, homeTeam, awayTeam, team, matchDate, hotelIncluded; carrental — carSupplier, carClass, carBodyType, transmission, fuelType, seats, zeroExcess, pickupStation, pickupStationType; f1 — guideIncluded, hotelIncluded, race, season, raceDate, ticketType, raceDays, transferIncluded; running — guideIncluded, hotelIncluded, race, season, raceDate, transferIncluded, distances, terrain, raceSeries, entryIncluded, tripType; americanfootball — guideIncluded, league, homeTeam, awayTeam, team, matchDate, hotelIncluded, season, transferIncluded, gameType; yoga — transferIncluded, retreatFocus, yogaLevel, yogaStyles, meditationIncluded, vegetarianMeals, danishInstructor, groupSizeMax; triathlon — guideIncluded, hotelIncluded, race, season, raceDate, transferIncluded, entryIncluded, tripType, triathlonDistance, raceBrand, bikeTransportIncluded; cruise — guideIncluded, cruiseType, cruiseLine, cabinType, cruiseRegion, embarkationCountry, drinksIncluded, excursionsIncluded; coach — guideIncluded, excursionsIncluded, coachTripType, pickupRegion; holidayhome — beachDistanceRange, maxPersons, bedrooms, houseSizeRange, petsAllowed, consumptionIncluded, freeCancellation; roundtrip — excursionsIncluded, tourFormat, danishGuide, guaranteedDeparture, groupSizeMax; citybreak — transferIncluded, excursionsIncluded, escorted; dance — transferIncluded, danceStyles, danceLevel, soloWelcome; wellness — programType, spaAccess, treatmentsIncluded, dinnerIncluded, guidedProgramme, doctorConsultation; safari — tourFormat, danishGuide, safariBase, accommodationStyle, safariTypes, wildlifeFocus, privateVehicle, windowSeatGuaranteed, beachStayIncluded, parkFeesIncluded, groupSizeMax; culture — excursionsIncluded, tourFormat, danishGuide, guaranteedDeparture, cultureThemes, expertGuide, lecturesIncluded, entriesIncluded, ticketsIncluded, eventKind, groupSizeMax; sportsevent — hotelIncluded, transferIncluded, sport, competition, stage; camping — beachDistanceRange, maxPersons, bedrooms, houseSizeRange, petsAllowed, consumptionIncluded, freeCancellation, unitType, unitRange, airConditioning, coveredTerrace, pool, waterPark, kidsClub, directBeach; hunting — huntTypes, species, guideRatio, trophyFees, huntingDays, dateFlexible; culinary — danishGuide, culinaryThemes, culinaryRegion, expertType, tastingsIncluded, producerVisits, cookingClasses, groupSizeMax; fishing — guideRatio, dateFlexible, fishingTypes, fishSpecies, waterTypes, lodgingType, fishingDays, licenceIncluded, boatIncluded, tackleIncluded; language — transferIncluded, dateFlexible, courseLanguage, courseType, ageGroup, accommodationKind, roomType, courseWeeks, lessonsPerWeek, activitiesIncluded; racket — transferIncluded, dateFlexible, racketSports, racketLevel, coachingHours, playHours, danishCoach, tournamentIncluded, junior; motorcycle — guideIncluded, bikeTransportIncluded, danishGuide, pillions, mcTerrain, bikeMode, mcLevel, ridingDays, totalKm, sup… [594 more characters not shown]
Annotations the server declares
- title: Count trips per filter value
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_initGet a comprehensive overview of the available travel data for ONE niche before searching.No findings
Why it is in this group
- The name "search_init" says "search": a word for reading.
Description, as the server wrote it Get a comprehensive overview of the available travel data for ONE niche before searching. Call this FIRST. Required parameters (all four): - niche: ONE travel type — "ski", "golf", "surf", "diving", "hiking", "charter", "cycling", "football", "carrental", "f1", "running", "americanfootball", "yoga", "triathlon", "cruise", "coach", "holidayhome", "roundtrip", "citybreak", "dance", "wellness", "safari", "culture", "sportsevent", "camping", "hunting", "culinary", "fishing", "language", "racket", "motorcycle", "riding", "birding", "sailing", "concert", "umrah". Single niche per call; to compare niches, call once per niche. - market: market code (one of "dk", "nl", "se", "no") - adults: number of adult travelers (1-20) - children: number of children (0-20) Occupancy is required because counts and prices depend on group size — the overview is scoped to this exact cohort. Returns: - totalCount: total listings for this niche and group size - priceRange: { min, max } total price range - pricePerPersonRange: { min, max } per-person price range - averages: { price, pricePerPerson, stars, durationDays } — useful for setting expectations - dateRange: { earliest, latest } departure date range - destinationCount: total unique destinations available - availability.byMonth: array of { period: "2026-04", count, minPrice } — listings per month with cheapest price. Use this to suggest optimal travel months. - ratingDistribution: star-bracket counts - topDestinations: array of { destinationSlug, countrySlug, count, minPrice } — top 15 destinations sorted by popularity - facets: unfiltered facet counts for the main filterable fields (countries, providers, durations, etc.) Use availability.byMonth to guide users toward dates with the most options and best prices. Use topDestinations to suggest popular destinations. Use averages to set price expectations.
Annotations the server declares
- title: Overview of one travel type
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_listingsSearch for travel listings with filters, sorting, and pagination.1 finding
Why it is in this group
- The name "search_listings" says "search": a word for reading.
Findings
- Info
The description is 58,467 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...acets before search_listings to verify results exist — use the EXACT SAME filters"
Description, as the server wrote it Search for travel listings with filters, sorting, and pagination. This is the main search tool. Use it after search_init to find specific travel deals. Required parameters: - niche: ONE travel type — "ski", "golf", "surf", "diving", "hiking", "charter", "cycling", "football", "carrental", "f1", "running", "americanfootball", "yoga", "triathlon", "cruise", "coach", "holidayhome", "roundtrip", "citybreak", "dance", "wellness", "safari", "culture", "sportsevent", "camping", "hunting", "culinary", "fishing", "language", "racket", "motorcycle", "riding", "birding", "sailing", "concert", "umrah". Single niche per request. - market: market code (one of "dk", "nl", "se", "no") Common filters (valid for every niche): - adults (ALWAYS include — prices depend on group size) - children (ALWAYS include — prices depend on group size) - departureFrom (YYYY-MM-DD) - departureTo (YYYY-MM-DD) - onlyDiscounted (boolean — only trips with a discount) - onlyMultiDestination (boolean — only trips that sleep in more than one place (round trips, stage tours)) - countries (array of country slugs — use EXACT slugs, e.g. ["austria"]) - destinations (array of destination slugs in country_destination format, e.g. ["austria_zell-am-see"] — use EXACT slugs. Also returns round trips and stage tours that stop there; their `accommodation.route` lists every stop) - providers (array of provider slugs) - centrumDistance ({ min, max } meters to town centre) - minPrice (total price, not per person) - maxPrice (total price, not per person) - minPricePerPerson (per-person price) - maxPricePerPerson (per-person price) - durations (array of trip lengths in days, e.g. [7, 14]) - arrivalWeeks (array of ISO weeks, e.g. ["2026-W15"] — use for "next week") - arrivalMonths (array of months, e.g. ["2026-04"] — use for "in April") - arrivalDates (array of exact arrival dates, YYYY-MM-DD) - departureDateFlexDays (0-7, day flex around arrivalDates) - minStars (minimum hotel star rating, 1-5) - minGuestRating (guest review score 0-10 (TripAdvisor scores are ×2 normalized)) - maxGuestRating (guest review score 0-10) - includeUnratedGuestRating (boolean — keep unrated hotels in rated searches) - transports (array: bus, train, car, flight_bll, flight_cph, flight_aal, flight_arn, flight_got, flight_ham, flight_aar, flight_krp, flight_rnn, flight_ams, flight_ein, flight_rtm, flight_grq, flight_mst, flight_bru, flight_dus, flight_nrn, flight_cgn, flight_osl, flight_bgo, flight_svg, flight_trd, flight_mmx — a trip sold without the flight is never under a flight_<airport>: it is car, own travel (drive, or a flight the traveller books)) - accommodationTypes (array: hotel, apartment, cabin, chalet, villa, hostel, resort, pension, house, other) - mealPlanTypes (array: all_inclusive, breakfast, full_board, half_board, none) - accommodationFeatures (array, e.g. pool, wifi, sauna, spa, parking, bar) Niche-specific filters (only valid when niche matches): - Ski: skiPassIncluded (boolean), skiPassDaysCount ({ min, max } bundled lift-pass days), skiLiftDistance ({ min, max } meters), skiBusDistance ({ min, max } meters), skiSlopeDistance ({ min, max } meters), guideIncluded (boolean — a guide is in the price (riding: a riding guide or instructor); null (not stated) never matches), transferIncluded (boolean — the transfer from the airport/station (or circuit) to the accommodation is bundled; null (not stated) never matches. Shared by the event, ski, charter and tour niches (yoga, language, surf, racket, riding …)) - Golf (accommodation-centric like ski; greenFeeIncluded says whether ANY golf is in the price, golfRoundsRanges/golfBagIncluded refine it further; guideIncluded is a golf host, not a generic tour guide): greenFeeIncluded (boolean — the package price includes green fees (any rounds or unlimited golf); false = golf is bought separately), courseDistance ({ min, max } meters, hotel to nearest course), golfRoundsRanges (array: none, 1-3, 4-5, 6+, unlimited — rounds included per golfer ('none' = green fee not included)), golfTripTypes (array: stay, school, group, longstay, tour — 'stay' is the default golf-hotel package), golfBagIncluded (boolean — golf bag carried on the flight at no extra charge), guideIncluded (boolean — a guide is in the price (riding: a riding guide or instructor); null (not stated) never matches), transferIncluded (boolean — the transfer from the airport/station (or circuit) to the accommodation is bundled; null (not stated) never matches. Shared by the event, ski, charter and tour niches (yoga, language, surf, racket, riding …)) - Surf (diving's shape (one card = one seller's board-sport trip: a surf, kite, windsurf or wing camp or week with lessons, coaching or guiding in the price; offers are dated weeks or season windows x party); adults = the number of surfers, a non-surfing companion is not in the party, children only where the seller prices them; price is the party total for the trip; a season window (dateFlexible) matches any date search it overlaps, from its first bookable day to seasonEnd; boardSports/surfLevels/instructions/surfAccommodations are OR-matched; every boolean is null when the seller does not say, never false): transferIncluded (boolean — the transfer from the airport/station (or circuit) to the accommodation is bundled; null (not stated) never matches. Shared by the event, ski, charter and tour niches (yoga, language, surf, racket, riding …)), dateFlexible (boolean — hunting, diving, fishing, language, surf, racket and riding: true = season windows only (one offer the traveller books any days inside, e.g. "1/5-31/7", "hver lørdag hele året", a language course starting every Monday of a price season, a surf or padel camp open every week of its season, a riding farm stay bookable any day of its season), false = fixed-date departures only; absent = both), boardSports (array: surf, kitesurf, windsurf, wingfoil, sup — the board sports taught or guided in the price (kitesurf = kite, wingfoil = wing, sup = stan… [52467 more characters not shown]
Annotations the server declares
- title: Search trips with every filter
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or untrusted-input or outbound.
- Reads private data0
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write0
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out0
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Install
Pinned to version 0.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http search https://mcp.kompare.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__search__find_trips",
"mcp__search__search_init",
"mcp__search__search_listings",
"mcp__search__get_facets"
],
"ask": [],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as search. Review it before you use it.