MolTravel

com.moltravelPublished by moltravel.comOfficial publisherv1.0.0Updated Oct 27, 2026

Aggregated travel MCP — flights, tours, activities, price checks, visas, and more.

Overview

AI-generated overview

Aggregated travel MCP server that lets an assistant search flights, tours, activities and hotels, check visas, and read country and travel-advisory data.

What you can do
  • Search flights and compare fares across booking sites
  • Find tours, departures, reviews and operators, and request bookings or brochures
  • Search activities and experiences, check availability and pricing, and render activity widgets
  • Search hotels and accommodation by destination or coordinates, and forecast price trends
  • Look up airports, airlines, countries, visa requirements and UK travel advisories
  • Ask a natural-language travel question that routes to the right tools (optional Gemini tool)
When to use it
Useful when an assistant should handle trip planning end to end: comparing flights and hotels, finding tours or activities, and checking visa and safety information for a destination without wiring up several separate travel APIs.
Requirements
Remote streamable HTTP endpoint; no authentication, environment variables or headers are declared. The README's self-hosting path needs Python and its dependencies, with an optional GEMINI_API_KEY for the natural-language routing tool and a PORT setting. Network access to upstream providers is required.
Before you install
Booking and brochure tools act on the user's behalf: they create booking requests and send email to an address the user supplies, so confirm details before calling them. Contact details and email addresses are passed to third-party providers, and results are aggregated from external services whose availability and accuracy are not guaranteed.

Installation

In SourceWeft

  1. Open MolTravel in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

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.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "moltravel": {
      "type": "http",
      "url": "https://mcp.moltravel.com/mcp"
    }
  }
}

README

MoltTravel

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]


  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)

Why?

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:

  • 21+ tools from 4 upstream MCP providers + 6 built-in datasets
  • Zero config for static data — airports, airlines, and visas load lazily with no API keys
  • Schema-transparent proxy — clients see the real upstream JSON Schema; upstream servers validate their own args
  • One line to connect from Claude Desktop, Claude Code, Cursor, or any MCP client

Quick Start

bash
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

Server starts at http://localhost:8000/mcp. That's it.


Connect Your Client

Claude Desktop

Add to claude_desktop_config.json:

json
{  "mcpServers": {    "molttravel": {      "url": "http://localhost:8000/mcp"    }  }}
Claude Code

Add to .claude/settings.json:

json
{  "mcpServers": {    "molttravel": {      "url": "http://localhost:8000/mcp"    }  }}
Python (programmatic)
python
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"})

Tools

Flights & Pricing

ToolProviderWhat it does
kiwi_search-flightKiwi.comSearch flights by route, date, passengers, cabin class
navifare_format_flight_pricecheck_requestNavifareParse flight details from natural language into structured data
navifare_flight_pricecheckNavifareCompare a flight's price across multiple booking sites

Experiences & Activities

ToolProviderWhat it does
peek_search_experiencesPeek.comSearch 300K+ verified activities worldwide
peek_experience_detailsPeek.comFull details, reviews, and photos for an experience
peek_experience_availabilityPeek.comCheck availability and pricing for specific dates
peek_search_regionsPeek.comFind region IDs by name
peek_list_tagsPeek.comBrowse activity categories and tags
peek_render_activity_tilesPeek.comRender embeddable activity widgets

Reference Data (built-in, no API keys needed)

ToolDatasetWhat it does
airports_lookupOurAirportsLook up by IATA or ICAO code
airports_searchOurAirportsSearch by name, filter by country or type
airports_nearOurAirportsFind airports within a radius of any coordinates
airlines_lookupOpenFlightsLook up by IATA or ICAO code
airlines_searchOpenFlightsSearch by name, filter by country or active status
visa_checkPassport IndexCheck visa requirement between two countries
visa_summaryPassport IndexFull visa-free/VOA/e-visa breakdown for a passport
restcountries_country_infoREST CountriesCapital, currencies, languages, timezones, population
fcdo_travel_adviceUK FCDOSafety advisories, entry requirements, health warnings
fcdo_list_countriesUK FCDOList all countries with travel advisories
data_status—Check which datasets are loaded and record counts

Natural Language (optional)

ToolWhat it does
travel_agentAsk any travel question — Gemini routes to the right tools and returns a combined answer

Requires GEMINI_API_KEY. Example: "Cheapest flights from Zurich to Rome next week, and do I need a visa?"


How It Works

1. Tool Discovery

On startup, MoltTravel connects to each upstream MCP server, calls tools/list, and registers every discovered tool with a {provider}_{tool_name} prefix:

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)

Native tools (airports, airlines, visas, countries, FCDO) are registered directly.

2. Schema-Transparent Proxy

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.

python
# 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))

3. Lazy Data Loading

Static datasets (airports, airlines, visas) download on first use behind async locks. No startup penalty, no wasted bandwidth if you only use flight tools.


Configuration

VariableDefaultDescription
PORT8000Server port
GEMINI_API_KEY—Enables the travel_agent natural-language routing tool

Deployment

Docker
dockerfile
FROM python:3.12-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .EXPOSE 8000CMD ["python", "molttravel_server.py"]
bash
docker build -t molttravel .docker run -p 8000:8000 molttravel
Render / Railway / Fly.io

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.


Project Structure

moltravel-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 router

Extending

Add an MCP provider

Add one line to providers/__init__.py and restart:

python
MCP_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}

Tools are discovered and registered automatically as your_provider_{tool_name}.

Add a native tool

python
@server.tool(name="my_tool")async def my_tool(query: str) -> str:    """Description shown to MCP clients."""    return "result"

Data Sources & Licenses

DatasetSourceLicense
AirportsOurAirportsPublic Domain
AirlinesOpenFlightsODbL 1.0
Visa RequirementsPassport IndexMIT
Country InfoREST CountriesMPL 2.0
Travel AdvisoriesUK FCDOOGL v3.0

Contributing

  1. Fork the repo
  2. Create a branch (git checkout -b feature/my-feature)
  3. Make changes and test (python molttravel_server.py)
  4. Open a pull request

License

MIT

Source: README.md at commit 2a0046d

Tools

56

restcountries_country_info

[restcountries] Look up country information from REST Countries.

Parametersqueryrequiredfieldssearch_by

fcdo_travel_advice

[fcdo] Get UK FCDO travel advice for a specific country. Includes safety, entry requirements, health, and warnings.

Parameterscountryrequired

fcdo_list_countries

[fcdo] List all countries with UK FCDO travel advice.

Takes no parameters.

airports_lookup

Look up an airport by IATA (3-char) or ICAO (4-char) code. Returns full details including runways.

Parameterscoderequired

airports_near

Find airports near a geographic point. Returns results sorted by distance.

Parameterslimitlatituderequiredlongituderequiredradius_kminclude_small

airlines_lookup

Look up an airline by IATA (2-char) or ICAO (3-char) code.

Parameterscoderequired

visa_check

Check visa requirement for a passport country visiting a destination.

Parameterspassportrequireddestinationrequired

visa_summary

Overview of visa-free access for a passport country — counts by category.

Parameterspassportrequired

data_status

Check which static datasets (airports, airlines, visas) are loaded and their row counts.

Takes no parameters.

peek_experience_availability

[peek] Get availability information for a specific experience including dates, times, and pricing

ParametersidrequiredendDaterequiredquantityrequiredstartDaterequired

peek_experience_details

[peek] Get detailed information about a specific experience by ID

Parametersidrequired

peek_list_tags

[peek] List all category tags

Takes no parameters.

peek_render_activity_tiles

[peek] Render activity tiles for a list of activity IDs, returning an embeddable widget URI

Parametersidrequired

peek_search_experiences

[peek] Search for travel experiences with comprehensive filtering options. Returns available categories, tags, and regions with IDs for further filtering.

ParametersquerytagIdlatLngendDateregionIdstartDatecategoryId

peek_search_regions

[peek] Search for regions by name

Parameterslimitqueryrequired

tourradar_b2b-operator-details

[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.

ParametersoperatorIdrequired

tourradar_b2b-continents-list

[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_b2b-countries-list

[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_b2b-currencies-list

[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_b2b-languages-list

[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_b2b-tour-types-list

[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_b2b-tour-departures

[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.

ParameterspagetourIdrequiredcurrencydateRangerequired

tourradar_b2b-tour-details

[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.

ParameterstourIdrequiredcurrency

tourradar_b2b-tour-faq

[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.

ParameterspagetourIdrequired

tourradar_b2b-tour-map

[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.

ParameterstourIdsrequiredcurrency

tourradar_general-current-date

[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_web-ask-question

[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.

ParametersemailrequiredentityrequiredlastNamerequiredquestionrequiredfirstNamerequiredphoneNumberagentInformation

tourradar_web-tour-booking

[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.

ParametersemailrequiredtourIdrequiredlastNamerequiredfirstNamerequiredpaxAdultsrequiredpaxChildrenrequiredphoneNumberdepartureDaterequiredagentInformationrequiredextraInformationrequired

tourradar_web-tour-send-brochure

[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.

ParametersemailrequiredtourIdrequired

skiplagged_sk_destinations_anywhere

[skiplagged] Find lower-priced destinations from a departure city when the user is flexible about where to go.

Parametersfromrequiredadultsdepartrequiredreturnchildrenfare_classinfantsLapinfantsSeat

skiplagged_sk_flex_departure_calendar

[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.

ParameterssortadultsoriginrequiredchildreninfantsLapreturnDatedestinationrequiredinfantsSeatdepartureDaterequired

skiplagged_sk_flex_return_calendar

[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.

ParameterssortadultsoriginrequiredchildreninfantsLapreturnDaterequireddestinationrequiredinfantsSeatdepartureDaterequired

skiplagged_sk_hotel_details

[skiplagged] Fetch room-level availability, pricing, and amenities for a specific hotel and stay dates.

ParameterslivecheckinrequiredhotelIdrequiredcheckoutrequirednumRoomsnumAdultsnumChildren

skiplagged_sk_resolve_location

[skiplagged] Resolve coarse location metadata supplied by the client to the nearest airport. Takes no user-provided arguments.

Takes no parameters.

skiplagged_sk_resolve_iata

[skiplagged] Resolve a city name to a valid IATA code

Parametersinputrequired

ferryhopper_get_ports

[ferryhopper] Find ferry ports, harbors, maritime terminals, port IDs, codes, and geographic locations.

Takes no parameters.

ferryhopper_get_disruptions

[ferryhopper] Find all ferry travel disruptions, including delays, weather alerts, and strikes for a given date and country.

ParameterscountryrequiredtripDaterequired

ferryhopper_get_direct_connections_for_ports

[ferryhopper] Find all direct ferry routes and reachable destination ports from a given origin port without layovers or transfers.

ParametersportLocationrequired

ferryhopper_search_trips

[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.

ParametersdaterequiredarrivalLocationrequireddepartureLocationrequired

ferryhopper_search_ferry_trips

[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.

Parameterslegsrequired

ferryhopper_trip_details

[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.

ParameterstripIdrequired

travel_agent

Ask 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?'

Parametersqueryrequired

Version history

1
  1. v1.0.0LatestSep 16, 2026

Score

90% 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.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.

Other Moltravel integrations