Server definition
- Hash
- sha256:b9bf7d246cc997716482b64e87dc53e091df1ebca288f47b45e4ad6f88975ba9
- What it is
- What a remote MCP server returned when asked what it offers: 12 tools
The blob, as servednamed by its sha256
{
"instructions": "Fly Travel Albania — licensed Albanian online travel agency (Tirana). All prices are CACHED from recent real searches (each row has cached_at/age_minutes) — not live. CHARTER prices are PACKAGE TOTALS for the row's \"party\" (2 adults unless party_match=true says otherwise); TOUR prices are per person. Prices are DATE-SPECIFIC: never attribute a price to a different departure date than its own \"date\" field. ROUTING: discovery/advice/budget questions (\"what do you suggest for 1500 EUR, 5 stars, aquapark?\") → ONE charter_offers call with the date, party and filters; one named hotel → charter_hotel WITH the date and party; 2-6 named hotels → compare_hotels; amenities/facilities → hotel_details; \"which date is cheapest\" → charter_flexible_dates; departure calendars → charter_dates; organized group tours → tours_list, and ONE tour's program/dates/date-specific price → tour_details; non-charter holiday packages (Corfu, Parga, Crete, Malta, Barcelona…) → holiday_packages. Do NOT call charter_hotel repeatedly to browse — charter_offers filters the whole cache in one request. MULTI-ROOM parties (e.g. two families): the engine prices ONE room per search — make one call per room with that room's adults/children and sum the totals; say the total is the sum of per-room packages. If no exact cached price exists for the requested date/party, say so (party_match=false = 2-adult reference) and share the hotel_page link (it prices any date and party live). FINAL VERIFICATION: there is deliberately no live-quote tool on this anonymous surface — the hotel_page/booking links ARE the live verification: they reprice the exact date and party in seconds; hand the link when the user is ready to book. Advise from the tiers — never lead with only the cheapest option unless the user explicitly asks for the cheapest. Always give the user a booking_link/hotel_page URL to book. Human pages: https://flytravel.al/cmimet (live prices), https://flytravel.al/per-ai (about this API).",
"tools": [
{
"description": "Deep link into the live charter search results for a destination, date, party and optional trip length — hand this URL to the user to see live availability and book. Children are ages 0-14 at departure; ages 15+ count as adults. Pure URL builder (no data).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"adults": {
"description": "Number of adults (default 2).",
"maximum": 6,
"minimum": 1,
"type": "integer"
},
"children_ages": {
"description": "Age of each child AT DEPARTURE (0-14 = child; 15+ is counted as an adult automatically).",
"items": {
"maximum": 17,
"minimum": 0,
"type": "integer"
},
"maxItems": 6,
"type": "array"
},
"date": {
"description": "Departure date, format YYYY-MM-DD.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"destination": {
"description": "Destination key, e.g. 'antalya'.",
"type": "string"
},
"nights": {
"description": "Trip length in nights. Omit for the standard charter length (6 nights / 7 days). Most departures also sell 3-10 nights.",
"maximum": 21,
"minimum": 2,
"type": "integer"
}
},
"required": [
"destination",
"date"
],
"type": "object"
},
"name": "booking_link",
"outputSchema": null
},
{
"description": "Cheapest flight+hotel charter packages from Tirana (Albania) per destination, from the live booking-engine cache (the 5 cheapest per destination, each on its own date). Use for \"what is the cheapest…\" only; for advice or filtering use charter_offers. CACHED prices (from recent real searches on flytravel.al — not a live query; every row carries cached_at/age_minutes). Charter prices are PACKAGE TOTALS in EUR for the row's \"party\" (flight + hotel + transfers), NOT per person. party_match=false means the price is the 2-adult reference, not the total for the requested party — say so. A price belongs ONLY to its own \"date\": never present it as the price of another date.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"destination": {
"description": "Optional destination key, e.g. 'antalya' or 'bodrum'. Omit to get every destination.",
"type": "string"
}
},
"type": "object"
},
"name": "charter_cheapest",
"outputSchema": null
},
{
"description": "Real upcoming charter departure dates from Tirana for a destination (cached calendar), each with the trip lengths (nights_available) really on sale for that departure and a ready booking-search link. Filter with date_from/date_to or month; total_count/has_more say when the calendar holds MORE dates than returned — never present a capped list as the whole calendar. For \"which date is cheapest\" use charter_flexible_dates.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"adults": {
"description": "Number of adults (default 2).",
"maximum": 6,
"minimum": 1,
"type": "integer"
},
"children_ages": {
"description": "Age of each child AT DEPARTURE (0-14 = child; 15+ is counted as an adult automatically).",
"items": {
"maximum": 17,
"minimum": 0,
"type": "integer"
},
"maxItems": 6,
"type": "array"
},
"date_from": {
"description": "Only departures on/after this date (YYYY-MM-DD).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"date_to": {
"description": "Only departures on/before this date (YYYY-MM-DD).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"destination": {
"description": "Destination key, e.g. 'antalya' or 'bodrum'.",
"type": "string"
},
"limit": {
"description": "Max dates to return (default 20).",
"maximum": 60,
"minimum": 1,
"type": "integer"
},
"month": {
"description": "Whole-month window, e.g. '2026-09' (ignored when date_from/date_to given).",
"pattern": "^\\d{4}-\\d{2}$",
"type": "string"
},
"nights": {
"description": "Trip length in nights. Omit for the standard charter length (6 nights / 7 days). Most departures also sell 3-10 nights.",
"maximum": 21,
"minimum": 2,
"type": "integer"
}
},
"required": [
"destination"
],
"type": "object"
},
"name": "charter_dates",
"outputSchema": null
},
{
"description": "For flexible travellers: the lowest CACHED package total for each departure date inside a window (max 31 days) for a destination and party, plus best_value_date. Dates with no cache are returned as availability_status=no_cached_data — NOT as \"no offers\" (the cache only holds recently searched dates; the search_url prices them live). CACHED prices (from recent real searches on flytravel.al — not a live query; every row carries cached_at/age_minutes). Charter prices are PACKAGE TOTALS in EUR for the row's \"party\" (flight + hotel + transfers), NOT per person. party_match=false means the price is the 2-adult reference, not the total for the requested party — say so. A price belongs ONLY to its own \"date\": never present it as the price of another date.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"adults": {
"description": "Number of adults (default 2).",
"maximum": 6,
"minimum": 1,
"type": "integer"
},
"budget_total_max": {
"description": "Max TOTAL budget in EUR for the whole party.",
"type": "integer"
},
"children_ages": {
"description": "Age of each child AT DEPARTURE (0-14 = child; 15+ is counted as an adult automatically).",
"items": {
"maximum": 17,
"minimum": 0,
"type": "integer"
},
"maxItems": 6,
"type": "array"
},
"date_from": {
"description": "Window start, YYYY-MM-DD (default today).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"date_to": {
"description": "Window end, YYYY-MM-DD (default date_from + 14 days; max 31-day window).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"destination": {
"description": "Destination key, e.g. 'antalya' or 'bodrum'.",
"type": "string"
},
"nights": {
"description": "Trip length in nights. Omit for the standard charter length (6 nights / 7 days). Most departures also sell 3-10 nights.",
"maximum": 21,
"minimum": 2,
"type": "integer"
},
"stars_min": {
"description": "Minimum hotel star rating (1-5).",
"maximum": 5,
"minimum": 1,
"type": "integer"
}
},
"required": [
"destination"
],
"type": "object"
},
"name": "charter_flexible_dates",
"outputSchema": null
},
{
"description": "Cached price(s) for ONE hotel named by the user (e.g. \"Granada Luxury Belek\") — searches the full price cache (hundreds of hotels). ALWAYS pass the date and the party the user gave: the per-date cache is read for that EXACT party first (party_match=true = real total for that family), then the 2-adult file (party_match=false = reference price). exact_date_matches = real cached prices for the requested date; other_cached_offers belong to their OWN dates (availability_status=reference_other_date). When nothing is cached for the requested date, say so and give hotel_page (it prices any date live). Do NOT call this tool repeatedly to browse — use charter_offers (filters) or compare_hotels (2-6 named hotels) instead. For amenities use hotel_details. CACHED prices (from recent real searches on flytravel.al — not a live query; every row carries cached_at/age_minutes). Charter prices are PACKAGE TOTALS in EUR for the row's \"party\" (flight + hotel + transfers), NOT per person. party_match=false means the price is the 2-adult reference, not the total for the requested party — say so. A price belongs ONLY to its own \"date\": never present it as the price of another date.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"adults": {
"description": "Number of adults (default 2).",
"maximum": 6,
"minimum": 1,
"type": "integer"
},
"children_ages": {
"description": "Age of each child AT DEPARTURE (0-14 = child; 15+ is counted as an adult automatically).",
"items": {
"maximum": 17,
"minimum": 0,
"type": "integer"
},
"maxItems": 6,
"type": "array"
},
"date": {
"description": "Desired departure date, format YYYY-MM-DD — exact-date cache is checked and the date is baked into the links.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"destination": {
"description": "Optional destination key ('antalya', 'bodrum') to narrow the search.",
"type": "string"
},
"hotel": {
"description": "Hotel name, or part of it.",
"type": "string"
},
"nights": {
"description": "Trip length in nights. Omit for the standard charter length (6 nights / 7 days). Most departures also sell 3-10 nights.",
"maximum": 21,
"minimum": 2,
"type": "integer"
}
},
"required": [
"hotel"
],
"type": "object"
},
"name": "charter_hotel",
"outputSchema": null
},
{
"description": "THE discovery tool: filters the whole cached charter inventory (hundreds of hotels) in ONE call by date, TOTAL budget, stars, board, zone, party and hotel features (aquapark, kids club, adults-only, beach, spa, luxury…). Built for \"I have X EUR for 2 adults + a child, Antalya, 5 stars, aquapark, near the beach — what do you suggest?\". Returns the price range, three quality tiers (economy-but-good / mid / premium) and a shortlist; advise from the tiers, never only the cheapest. Pass the date whenever the user has one (exact availability for that date) and the real party (exact-party cache is used when present). excluded_unknown_features tells how many hotels were dropped because their facilities are unknown. CACHED prices (from recent real searches on flytravel.al — not a live query; every row carries cached_at/age_minutes). Charter prices are PACKAGE TOTALS in EUR for the row's \"party\" (flight + hotel + transfers), NOT per person. party_match=false means the price is the 2-adult reference, not the total for the requested party — say so. A price belongs ONLY to its own \"date\": never present it as the price of another date.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"adults": {
"description": "Number of adults (default 2).",
"maximum": 6,
"minimum": 1,
"type": "integer"
},
"adults_only": {
"description": "true = only adults-only hotels; false = EXCLUDE adults-only hotels (use false for any party with children).",
"type": "boolean"
},
"aquapark": {
"description": "true = only hotels with an aquapark / water park.",
"type": "boolean"
},
"beach": {
"description": "true = only hotels with a beach (own or nearby, per the hotel facts).",
"type": "boolean"
},
"board": {
"description": "Board filter substring, e.g. 'all inclusive', 'ultra'.",
"type": "string"
},
"budget_total_max": {
"description": "Max TOTAL budget in EUR for the whole party.",
"type": "integer"
},
"budget_total_min": {
"description": "Optional min total, to skip too-basic offers.",
"type": "integer"
},
"children_ages": {
"description": "Age of each child AT DEPARTURE (0-14 = child; 15+ is counted as an adult automatically).",
"items": {
"maximum": 17,
"minimum": 0,
"type": "integer"
},
"maxItems": 6,
"type": "array"
},
"date": {
"description": "Departure date, format YYYY-MM-DD (recommended — exact availability for that date).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"destination": {
"description": "Optional destination key ('antalya', 'bodrum'). Omit to search all.",
"type": "string"
},
"family_friendly": {
"description": "true = only hotels with family facilities (kids club / kids pool / family rooms) and not adults-only.",
"type": "boolean"
},
"kids_club": {
"description": "true = only hotels with a kids / mini club.",
"type": "boolean"
},
"limit": {
"description": "Shortlist size (default 12).",
"maximum": 24,
"minimum": 1,
"type": "integer"
},
"luxury": {
"description": "true = only hotels tagged luxury.",
"type": "boolean"
},
"nights": {
"description": "Trip length in nights. Omit for the standard charter length (6 nights / 7 days). Most departures also sell 3-10 nights.",
"maximum": 21,
"minimum": 2,
"type": "integer"
},
"private_beach": {
"description": "true = only hotels listing a private / own beach.",
"type": "boolean"
},
"spa": {
"description": "true = only hotels with spa / Turkish bath / sauna.",
"type": "boolean"
},
"stars_min": {
"description": "Minimum hotel star rating (1-5).",
"maximum": 5,
"minimum": 1,
"type": "integer"
},
"zone": {
"description": "Zone/resort filter substring, e.g. 'Belek', 'Alanya', 'Lara', 'Side', 'Kemer'.",
"type": "string"
}
},
"type": "object"
},
"name": "charter_offers",
"outputSchema": null
},
{
"description": "Side-by-side comparison of 2-6 named hotels for a date and party: cached price (with party_match + cached_at), stars, zone, board, room, features (aquapark, kids club, beach, spa, adults-only…) and a booking link each — one call instead of several charter_hotel calls. Hotels not in the cache are listed in not_found (do NOT say they are unavailable — the cache only holds recently searched offers). CACHED prices (from recent real searches on flytravel.al — not a live query; every row carries cached_at/age_minutes). Charter prices are PACKAGE TOTALS in EUR for the row's \"party\" (flight + hotel + transfers), NOT per person. party_match=false means the price is the 2-adult reference, not the total for the requested party — say so. A price belongs ONLY to its own \"date\": never present it as the price of another date.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"adults": {
"description": "Number of adults (default 2).",
"maximum": 6,
"minimum": 1,
"type": "integer"
},
"children_ages": {
"description": "Age of each child AT DEPARTURE (0-14 = child; 15+ is counted as an adult automatically).",
"items": {
"maximum": 17,
"minimum": 0,
"type": "integer"
},
"maxItems": 6,
"type": "array"
},
"date": {
"description": "Departure date, format YYYY-MM-DD (recommended).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"destination": {
"description": "Optional destination key ('antalya', 'bodrum').",
"type": "string"
},
"hotels": {
"description": "Hotel names (or parts of them).",
"items": {
"type": "string"
},
"maxItems": 6,
"minItems": 2,
"type": "array"
},
"nights": {
"description": "Trip length in nights. Omit for the standard charter length (6 nights / 7 days). Most departures also sell 3-10 nights.",
"maximum": 21,
"minimum": 2,
"type": "integer"
}
},
"required": [
"hotels"
],
"type": "object"
},
"name": "compare_hotels",
"outputSchema": null
},
{
"description": "Our NON-charter holiday packages from Tirana (flight+hotel or bus+hotel: Corfu, Parga, Crete, Malta, Barcelona, Mallorca, Rimini…): which destinations are on sale right now, their validated upcoming departure dates, an INDICATIVE \"from €X per person\" price and the booking page link. The exact price depends on hotel/room/party and is computed live on the package page (link) — never present price_from as a bookable quote. For Turkey/Egypt beach charters (Antalya, Bodrum…) use the charter_* tools instead. Cached/validated data only, no live call.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"date_from": {
"description": "Only departures on/after this date (YYYY-MM-DD).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"date_to": {
"description": "Only departures on/before this date (YYYY-MM-DD).",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"destination": {
"description": "Package destination key from the no-argument listing (e.g. 'korfuz', 'barcelona', 'kreta'). Omit to list every destination.",
"type": "string"
}
},
"type": "object"
},
"name": "holiday_packages",
"outputSchema": null
},
{
"description": "Static facts we hold about ONE charter hotel: stars, zone, provider-tagged categories, tri-state features (aquapark, kids_club, kids_pool, beach, private_beach, spa, adults_only, luxury, night_entertainment, water_slides — true/false/null where null = unknown), the facility list and a short description. FACTS ONLY: never claim a feature that is null/absent; distances to beach/airport are NOT available — do not estimate them. No prices here (use charter_hotel). Cache/DB read, no live call.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"destination": {
"description": "Optional destination key ('antalya', 'bodrum').",
"type": "string"
},
"hotel": {
"description": "Hotel name, or part of it.",
"type": "string"
}
},
"required": [
"hotel"
],
"type": "object"
},
"name": "hotel_details",
"outputSchema": null
},
{
"description": "Today's full machine-readable price digest (charter packages, tours, guides, FAQ) — same content as https://flytravel.al/llms-full.txt (cached, rebuilt hourly). Overview only; for any specific hotel/date/party use the charter_* tools.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "prices_digest",
"outputSchema": null
},
{
"description": "Full cached details for ONE organized group tour: the COMPLETE departure-date calendar, the day-by-day program as text, duration, transport, and the per-person price. Match by `tour` (part of the name/cities, e.g. \"Stamboll\", \"Milano Como\") or exact `tour_id` from tours_list. Pass `date` + the party when the user has them: when that departure's group price is warm in cache you get the EXACT group total (price_status=cached_for_date); otherwise price_from is the PER PERSON price of the NEAREST departure (price_status=list_from) — every departure date has its OWN price, never quote one date's price for another; tour_page prices any date live. Answer date questions ONLY from departure_dates — it is the complete current calendar. Seats/availability are confirmed by staff. Cache/DB read, no live call.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"adults": {
"description": "Number of adults (default 2).",
"maximum": 9,
"minimum": 1,
"type": "integer"
},
"children_ages": {
"description": "Age of each child, 0-11 (TOURS price 12+ as adults — a DIFFERENT bracket than charter packages).",
"items": {
"maximum": 17,
"minimum": 0,
"type": "integer"
},
"maxItems": 4,
"type": "array"
},
"date": {
"description": "Desired departure date, YYYY-MM-DD — checked against the calendar and baked into tour_page.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"tour": {
"description": "Tour name or city, or part of it (e.g. \"Stamboll\", \"Dubai\").",
"type": "string"
},
"tour_id": {
"description": "Exact tour id from tours_list (preferred when known).",
"type": "integer"
}
},
"type": "object"
},
"name": "tour_details",
"outputSchema": null
},
{
"description": "Escorted group tours from Tirana with Albanian-speaking guides (cached catalogue): stable id, title, days/nights, cities, transport, next_departure and the PER PERSON price in EUR — unlike charter packages, tour prices are per person. For one tour's full calendar, program and date-specific price use tour_details.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Max tours to return (default 10).",
"maximum": 30,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "tours_list",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:b9bf7d246cc997716482b64e87dc53e091df1ebca288f47b45e4ad6f88975ba9 | sha256sum