restcountries_country_info
[restcountries] Look up country information from REST Countries.
queryrequiredfieldssearch_by
com.moltravelPublished by moltravel.comOfficial publisherv1.0.0Updated Oct 27, 2026
Aggregated travel MCP — flights, tours, activities, price checks, visas, and more.
Aggregated travel MCP server that lets an assistant search flights, tours, activities and hotels, check visas, and read country and travel-advisory data.
Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.
Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.
Read https://sourceweft.com/mcp/com.moltravel%2Ftravel/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.Add this to your client's mcpServers config.
{
"mcpServers": {
"moltravel": {
"type": "http",
"url": "https://mcp.moltravel.com/mcp"
}
}
}One MCP server. Every travel tool.
Search flights, compare prices, check visas, look up airports,
get travel advisories — through a single endpoint.
[MCP Protocol] [Python 3.12+] [License: MIT]
Travel data is scattered across dozens of APIs, each with its own auth, format, and quirks. MoltTravel aggregates them behind a single Model Context Protocol endpoint:
Server starts at http://localhost:8000/mcp. That's it.
Add to claude_desktop_config.json:
Add to .claude/settings.json:
Requires
GEMINI_API_KEY. Example: "Cheapest flights from Zurich to Rome next week, and do I need a visa?"
On startup, MoltTravel connects to each upstream MCP server, calls tools/list, and registers every discovered tool with a {provider}_{tool_name} prefix:
Native tools (airports, airlines, visas, countries, FCDO) are registered directly.
Clients see the original upstream JSON Schema for each tool — enums, nested objects, $ref, everything. Internally, MoltTravel uses a permissive Pydantic model (Any for all fields) so arguments pass through without lossy validation. The upstream MCP server validates its own args.
Static datasets (airports, airlines, visas) download on first use behind async locks. No startup penalty, no wasted bandwidth if you only use flight tools.
The server reads PORT from the environment and binds to 0.0.0.0 — it works out of the box on any container platform. Just point the start command at python molttravel_server.py.
Add one line to providers/__init__.py and restart:
Tools are discovered and registered automatically as your_provider_{tool_name}.
git checkout -b feature/my-feature)python molttravel_server.py)Source: README.md at commit 2a0046d
[restcountries] Look up country information from REST Countries.
queryrequiredfieldssearch_by[fcdo] Get UK FCDO travel advice for a specific country. Includes safety, entry requirements, health, and warnings.
countryrequired[fcdo] List all countries with UK FCDO travel advice.
Takes no parameters.
Look up an airport by IATA (3-char) or ICAO (4-char) code. Returns full details including runways.
coderequiredSearch airports by name or city. Returns up to 20 results sorted by size.
queryrequiredcountrytype_filterFind airports near a geographic point. Returns results sorted by distance.
limitlatituderequiredlongituderequiredradius_kminclude_smallLook up an airline by IATA (2-char) or ICAO (3-char) code.
coderequiredSearch airlines by name. Returns up to 20 results.
queryrequiredcountryactive_onlyCheck visa requirement for a passport country visiting a destination.
passportrequireddestinationrequiredOverview of visa-free access for a passport country — counts by category.
passportrequiredCheck which static datasets (airports, airlines, visas) are loaded and their row counts.
Takes no parameters.
[peek] Get availability information for a specific experience including dates, times, and pricing
idrequiredendDaterequiredquantityrequiredstartDaterequired[peek] Get detailed information about a specific experience by ID
idrequired[peek] List all category tags
Takes no parameters.
[peek] Render activity tiles for a list of activity IDs, returning an embeddable widget URI
idrequired[peek] Search for travel experiences with comprehensive filtering options. Returns available categories, tags, and regions with IDs for further filtering.
querytagIdlatLngendDateregionIdstartDatecategoryId[peek] Search for regions by name
limitqueryrequired[tourradar] Use this when the user wants information about a tour operator, such as their terms and policies. Fetches operator details including name, code, and terms & conditions based on operator ID.
operatorIdrequired[tourradar] Use this when you need to find city IDs for tour search filters like start city, end city, or cities to visit. Searches for cities by name within a specific country. Supports multiple name variants to handle different spellings (e.g., Krakow, Kraków, Cracow).
searchrequiredcountry_coderequired[tourradar] Use this when you need continent IDs for filtering tours by region. Returns a list of all supported continents with their IDs and names for use in tour search filters.
Takes no parameters.
[tourradar] Use this when you need to look up country IDs for filtering tours or validating country names. Returns a complete list of all supported countries with their IDs, names, and ISO country codes.
Takes no parameters.
[tourradar] Use this when you need to check supported currencies or get currency details like symbols. Returns a list of all supported currencies with their codes (USD, EUR), names, and symbols ($, €).
Takes no parameters.
[tourradar] Use this when you need language IDs for filtering tours by guide language. Returns a list of all supported languages with their IDs, codes, and names for use in tour search filters.
Takes no parameters.
[tourradar] Use this when you need tour type IDs for filtering tours by category like adventure, cultural, or wildlife. Returns a hierarchical list of tour type groups and their individual types with IDs and names.
Takes no parameters.
[tourradar] Use this when the user asks about available departure dates, pricing for specific dates, or needs to validate if a departure date is available. Returns a list of departures for a specific tour within a date range, including availability status, pricing, and booking information.
pagetourIdrequiredcurrencydateRangerequired[tourradar] Use this when the user wants to see detailed information about a specific tour. Fetches comprehensive tour details including itinerary, pricing, operator info, images, and booking links based on tour ID.
tourIdrequiredcurrency[tourradar] Use this when the user has questions about a tour that might be answered in the FAQ section. Returns a paginated list of frequently asked questions and answers about a specific tour, covering topics like inclusions, requirements, and policies.
pagetourIdrequired[tourradar] Use this when the user wants to see tour routes on a map or compare itineraries visually. Fetches tour details for one or more tours and prepares map data with all itinerary locations, coordinates, and day-by-day information for visual display.
tourIdsrequiredcurrency[tourradar] Use this when you need to know the current date, especially before setting departure date filters. Returns the current date and time in ISO format. Essential for calculating valid date ranges for tour searches.
Takes no parameters.
[tourradar] Use this when the user describes what they want in natural language and you need AI-powered semantic search to understand their intent. Before use this tool, please READ all possible filters. PLESE USE FILTERS, when can be used, to make search faster and much more precise. Please use start_city, end_city, cities, countries, start_country, end_country filters if possible. You can use multiple of them. AI-powered semantic search for tours using natural language queries combined with optional filters. Uses Google Vertex AI to understand intent and find relevant tours based on descriptions, themes, or specific requests. Use `vertex-tour-search` when: - The user describes what they want in natural language - You need semantic/AI-powered search to understand intent - Combining natural language with filters for refined results Examples: - "Family-friendly safari with kids under 12" - "Romantic honeymoon trip with beach and mountains" - "Adventure tour with hiking and camping for beginners" - "Cultural immersion experience with local homestays" - "Wine tasting tour through European countryside" ## Input ### Required - `textSearch`: Natural language description of what the user is looking for - `display_mode`: How to display results — `"listing"` (default, carousel of tour cards) or `"map"` (interactive map view) ### Optional Filters #### Location Filters | Filter | Type | Description | | --------------- | -------- | -------------------------------------------------------------------------- | | `start_country` | string[] | Country where tour BEGINS (ISO 3166-1 alpha-2 codes). OR logic. | | `end_country` | string[] | Country where tour ENDS (ISO 3166-1 alpha-2 codes). OR logic. | | `start_city` | number[] | City IDs where tour starts. Use `b2b-cities-search` to find IDs. OR logic. | | `end_city` | number[] | City IDs where tour ends. Use `b2b-
pricecitiesmax_agemin_agetourIdscurrencydiscountdurationend_citycountriesdeparturesstart_city+7 more[tourradar] Search for tours by title using AI-powered semantic search. Returns a list of matching tour IDs and titles. Use this when you need to look up a tour by name. When you know tour id, use b2b-tour-details tool to display details about specific tour
queryrequired[tourradar] Search tour reviews using AI-powered semantic search. Requires tourIds to scope results to specific tours. Use this when the user asks about reviews, feedback, or experiences for specific tours. Combine with an optional text query to find reviews mentioning specific topics (e.g., 'food', 'guide', 'accommodation'). When you don't have tour IDs, use vertex-tour-search or vertex-tour-title-search first to find them.
querytourIdskeywordspageSizeminRatingpageTokencreatedAftertravelledAfter[tourradar] Use this when the user wants to ASK A QUESTION about a tour or operator WITHOUT committing to a booking. Two modes: - mode "tour": a question about a specific tour. Requires `tourId`. The `departureDate` is OPTIONAL here — if the customer has not picked a date, omit it and the backend will pick the nearest real departure. Do NOT fabricate a date. - mode "operator": a general/operator-level question. Requires `operatorId` and no tour. Always provide the customer's real contact details (email, first/last name; phone optional) and their actual question text. Never fabricate or assume user data — ask for missing information.
emailrequiredentityrequiredlastNamerequiredquestionrequiredfirstNamerequiredphoneNumberagentInformation[tourradar] Use this when the user explicitly wants to book a tour and has provided their contact details. Creates a booking request for a specific tour. Requires real contact details (email, names; phone optional). Always confirm the departure date by checking departures first. Never fabricate or assume user data - always ask for missing information.
emailrequiredtourIdrequiredlastNamerequiredfirstNamerequiredpaxAdultsrequiredpaxChildrenrequiredphoneNumberdepartureDaterequiredagentInformationrequiredextraInformationrequired[tourradar] Use this when the user requests a tour brochure or PDF to be sent to their email. Sends a tour brochure (PDF file) to the specified email address. Before using this, ensure the user has provided their email address. If not provided, ask the user for it. Never generate or assume email addresses.
emailrequiredtourIdrequired[tourradar] Use this when you need to find a tour operator's ID by their name for filtering tours. Searches tour operators by name and returns matching operators with their IDs. Use the returned operator ID with tour search filters.
textSearchrequired[trivago] Search live hotel and accommodation listings near specific coordinates — a landmark, address, venue, or neighborhood — aggregated via trivago's metasearch of major booking sites. Returns the same, filterable results as trivago-accommodation-search. Use when the user anchors their search to a place rather than a named destination (e.g. "near the stadium," "within walking distance of X"). Additional Information: {"knownInformation":{"currentYear":"2026","today":"2026-10-11"}}
roomsadultsarrivalrequiredcountryfilterschildrencurrencylanguagelatituderequireddeparturerequiredlongituderequiredhotel_rating+2 more[trivago] Search live hotel and accommodation listings by destination or point of interest, aggregated via trivago's metasearch of major booking sites. Returns results with price, rating, amenities, and a link per property. Supports date range, guest/room configuration, and filters for star rating, guest rating, and amenities. Use for destination- or place-name-based lodging search. Additional Information: {"knownInformation":{"currentYear":"2026","today":"2026-10-11"}}
queryrequiredroomsadultsarrivalrequiredcountryfilterschildrencurrencylanguagedeparturerequiredhotel_ratingchildren_ages+1 more[trivago] Forecast monthly hotel price trends for a destination — average, minimum, and maximum nightly rate by star rating, across a date window. Use for planning questions like "when is the cheapest month to visit X" or "how do prices change through the year" — this is a forecasting tool, not a live-availability search. Additional Information: {"knownInformation":{"currentYear":"2026","today":"2026-10-11"}}
queryrequiredcountrycurrencylanguageend_monthstart_monthhotel_rating[skiplagged] Search Skiplagged for flights between specific locations with filtering options for passengers, fare class, stops, airlines, and timing preferences
sortlimitadultsoffsetoriginrequiredchildrenmaxStopsfareClassinfantsLapreturnDatedestinationrequiredinfantsSeat+14 more[skiplagged] Find lower-priced destinations from a departure city when the user is flexible about where to go.
fromrequiredadultsdepartrequiredreturnchildrenfare_classinfantsLapinfantsSeat[skiplagged] Generate a flexible calendar of the lowest one-way fares around a chosen departure, returning date → cheapest-price entries to help pick the best day to fly. Intended for flexible-date price discovery, not exact itinerary selection.
sortadultsoriginrequiredchildreninfantsLapreturnDatedestinationrequiredinfantsSeatdepartureDaterequired[skiplagged] Generate a flexible round-trip price calendar for a fixed-length stay around a chosen travel window. Returns (depart date, return date, lowest total price) entries for nearby date pairs that preserve the original trip length; intended for price discovery, not exact itinerary selection.
sortadultsoriginrequiredchildreninfantsLapreturnDaterequireddestinationrequiredinfantsSeatdepartureDaterequired[skiplagged] Search Skiplagged for hotels in a city with specific check-in and check-out dates, including ratings and pricing.
cityrequiredsortlimitoffsetcheckinrequiredcheckoutrequirednumRoomsnumAdultsnumChildren[skiplagged] Search Skiplagged for rental cars between pickup and dropoff locations/dates, returning prices, companies, and car details.
limitoffsetpickupDaterequiredpickupTimedropoffDaterequireddropoffTimepickupLocationrequireddropoffLocation[skiplagged] Fetch room-level availability, pricing, and amenities for a specific hotel and stay dates.
livecheckinrequiredhotelIdrequiredcheckoutrequirednumRoomsnumAdultsnumChildren[skiplagged] Search Skiplagged support articles for answers about its services, products, and policies.
queryrequiredtop_k[skiplagged] Resolve coarse location metadata supplied by the client to the nearest airport. Takes no user-provided arguments.
Takes no parameters.
[skiplagged] Resolve a city name to a valid IATA code
inputrequired[ferryhopper] Find ferry ports, harbors, maritime terminals, port IDs, codes, and geographic locations.
Takes no parameters.
[ferryhopper] Find all ferry travel disruptions, including delays, weather alerts, and strikes for a given date and country.
countryrequiredtripDaterequired[ferryhopper] Find all direct ferry routes and reachable destination ports from a given origin port without layovers or transfers.
portLocationrequired[ferryhopper] Deprecated: prefer search_ferry_trips, which covers this tool plus round-trip and multi-leg search and per-segment availability flags. Get a list of available one-way ferry trips between two ports on a specific date.
daterequiredarrivalLocationrequireddepartureLocationrequired[ferryhopper] Search ferry trips as an ordered chain of 1 to 5 legs. Takes human-readable location names (e.g. city or port name) for each leg, not port codes — no need to call get_ports first. Availability flags (cabin, vehicles, pets, e-ticket) are reported per segment. - One leg: a plain one-way search. - Two legs where leg 2 reverses leg 1 (e.g. leg 1 Piraeus→Mykonos, leg 2 Mykonos→Piraeus): a round trip. - Up to 5 legs otherwise (e.g. A to B, then B to C, then C to D): an island-hopping chain. Legs after the first must depart from the location the previous leg arrived at, and must be in chronological order (a later leg may share the same date as an earlier one, but may not precede it). The response returns each leg's available options independently (legs[].options) — options are never filtered against another leg's options. Consecutive legs must leave enough time between one leg's arrival and the next leg's departure to be a valid connection; this is not pre-filtered server-side or reflected in this output, so do not assume every combination of options across legs is a valid connection — the widget the user interacts with enforces this.
legsrequired[ferryhopper] Get full details for a single sailing leg, looked up by the id of one of the options returned by search_ferry_trips (legs[].options[].id). Returns the trip's departure/arrival time, ports, and operating company, plus the vessel's technical specs, onboard amenities, and photos. Use this to answer questions about a vessel such as: does it have wifi / a restaurant / a snack bar / an open deck / a lift or elevator / wheelchair or disabled access / a designated smoking area? Is it pet-friendly, or does it allow pets on board? Does it have cabins, or a garage / vehicle deck for cars and motorbikes? How many passengers or vehicles does it carry (capacity)? How long is the vessel (length in meters)? What is its IMO number or MMSI (maritime identification numbers used for registry/tracking lookups)? Is this vessel accessible, family-friendly, or suitable for passengers who need mobility assistance? What does the vessel look like (photos)? If no detailed specs exist for the vessel in the source system, vessel.hasDetails is returned as false and every spec/amenity field is null — this means the data is unavailable, not that the vessel lacks that amenity. Also returns the trip's bookable accommodation tiers (seat/cabin classes) with their price and a photo of that accommodation, when available. Throws if the tripId is malformed or the trip is no longer bookable (e.g. it has already departed, was cancelled, or sold out) — re-run search_ferry_trips to get a fresh tripId in that case.
tripIdrequiredAsk a travel question in natural language. Routes to the right tools automatically and returns a combined answer. Example: 'Cheapest flights from Zurich to Rome next week, and do I need a visa?'
queryrequired90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare a license in the repository or the registry entry.
Kiwi.com Navifare Peek.com LastMinute (flights) (prices) (experiences) (flights) \ | | / \ | | / +--------+-----------+--------+ | | | MoltTravel MCP Server | | | | Airports Airlines Visas | | Countries FCDO Gemini AI | | | +-------------|---------------+ | MCP over HTTP | Any MCP Client (Claude, Cursor, your app)git clone https://github.com/navifare/moltravel-mcp.gitcd moltravel-mcppython -m venv venv && source venv/bin/activatepip install -r requirements.txtpython molttravel_server.py{ "mcpServers": { "molttravel": { "url": "http://localhost:8000/mcp" } }}{ "mcpServers": { "molttravel": { "url": "http://localhost:8000/mcp" } }}from mcp import ClientSessionfrom mcp.client.streamable_http import streamablehttp_client
async with streamablehttp_client("http://localhost:8000/mcp") as (r, w, _): async with ClientSession(r, w) as session: await session.initialize() tools = await session.list_tools() result = await session.call_tool("airports_lookup", {"code": "ZRH"})kiwi → kiwi_search-flight, kiwi_feedback-to-devsnavifare → navifare_flight_pricecheck, navifare_format_flight_pricecheck_requestpeek → peek_search_experiences, peek_experience_details, ...lastminute → (discovered at runtime)# Client sees the real schemaparameters = input_schema # original from upstream
# Server doesn't re-validate types — just passes throughfields[prop_name] = (Any, Field(default=None))FROM python:3.12-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .EXPOSE 8000CMD ["python", "molttravel_server.py"]docker build -t molttravel .docker run -p 8000:8000 molttravelmoltravel-mcp/├── molttravel_server.py # Server core — proxy logic, native tools, routing├── requirements.txt # mcp[cli], httpx├── test_search.py # Integration test client└── providers/ ├── __init__.py # MCP_PROVIDERS registry + exports ├── mcp_client.py # Generic HTTP client for upstream MCP servers ├── data_loader.py # CSV downloader + haversine distance ├── airports.py # 45K airports from OurAirports ├── airlines.py # 7K airlines from OpenFlights ├── visas.py # Visa requirements from Passport Index ├── restcountries.py # REST Countries API ├── fcdo.py # UK FCDO travel advisories └── gemini.py # Gemini Flash tool routerMCP_PROVIDERS = { "kiwi": McpClient("https://mcp.kiwi.com/mcp"), "navifare": McpClient("https://mcp.navifare.com/mcp"), "peek": McpClient("https://mcp.peek.com/mcp"), "your_provider": McpClient("https://mcp.example.com/mcp"), # new}@server.tool(name="my_tool")async def my_tool(query: str) -> str: """Description shown to MCP clients.""" return "result"