MolTravel

com.moltravel由 moltravel.com 發布官方發布者v1.0.0更新於 Oct 27, 2026

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

已驗證Streamable HTTP可網頁執行位置與生活網頁搜尋與抓取商業與電商

概覽

AI 產生的概覽

彙整式旅遊 MCP 伺服器,讓助理搜尋航班、旅行團、活動與飯店,查詢簽證,並取得國家與旅遊警示資訊。

可以做什麼
  • 搜尋航班並在多個訂票網站間比價
  • 查找旅行團、出發日期、評價與業者,並可提出預訂請求或索取手冊
  • 搜尋活動與體驗,查詢可預訂日期與價格,並產生可嵌入的活動元件
  • 依目的地或座標搜尋飯店住宿,並預測價格走勢
  • 查詢機場、航空公司、國家資訊、簽證規定與英國旅遊警示
  • 以自然語言提出旅遊問題,由路由工具分派到合適的工具(選用 Gemini 工具)
適用情境
適合需要端到端行程規劃的助理:比較航班與飯店、尋找旅行團或活動,並確認目的地的簽證與安全資訊,而不必分別串接多個旅遊 API。
執行需求
遠端 streamable HTTP 端點;未宣告驗證、環境變數或標頭。README 中的自架方式需要 Python 與其相依套件,自然語言路由工具可選用 GEMINI_API_KEY,並可設定 PORT。需要能連線至上游服務商的網路。
安裝前請注意
預訂與手冊工具會代替使用者執行操作:建立預訂請求並寄送電子郵件至使用者提供的信箱,呼叫前應先確認資料。聯絡方式與電子郵件會傳送給第三方服務商,結果彙整自外部服務,其可用性與正確性無法保證。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 MolTravel,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/com.moltravel%2Ftravel/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "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

來源:README.md,提交 2a0046d

工具

56

restcountries_country_info

[restcountries] Look up country information from REST Countries.

輸入參數query必填fieldssearch_by

fcdo_travel_advice

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

輸入參數country必填

fcdo_list_countries

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

無需輸入參數。

airports_lookup

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

輸入參數code必填

airports_near

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

輸入參數limitlatitude必填longitude必填radius_kminclude_small

airlines_lookup

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

輸入參數code必填

visa_check

Check visa requirement for a passport country visiting a destination.

輸入參數passport必填destination必填

visa_summary

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

輸入參數passport必填

data_status

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

無需輸入參數。

peek_experience_availability

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

輸入參數id必填endDate必填quantity必填startDate必填

peek_experience_details

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

輸入參數id必填

peek_list_tags

[peek] List all category tags

無需輸入參數。

peek_render_activity_tiles

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

輸入參數id必填

peek_search_experiences

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

輸入參數querytagIdlatLngendDateregionIdstartDatecategoryId

peek_search_regions

[peek] Search for regions by name

輸入參數limitquery必填

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.

輸入參數operatorId必填

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.

無需輸入參數。

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.

無需輸入參數。

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 ($, €).

無需輸入參數。

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.

無需輸入參數。

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.

無需輸入參數。

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.

輸入參數pagetourId必填currencydateRange必填

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.

輸入參數tourId必填currency

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.

輸入參數pagetourId必填

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.

輸入參數tourIds必填currency

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.

無需輸入參數。

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.

輸入參數email必填entity必填lastName必填question必填firstName必填phoneNumberagentInformation

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.

輸入參數email必填tourId必填lastName必填firstName必填paxAdults必填paxChildren必填phoneNumberdepartureDate必填agentInformation必填extraInformation必填

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.

輸入參數email必填tourId必填

skiplagged_sk_destinations_anywhere

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

輸入參數from必填adultsdepart必填returnchildrenfare_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.

輸入參數sortadultsorigin必填childreninfantsLapreturnDatedestination必填infantsSeatdepartureDate必填

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.

輸入參數sortadultsorigin必填childreninfantsLapreturnDate必填destination必填infantsSeatdepartureDate必填

skiplagged_sk_hotel_details

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

輸入參數livecheckin必填hotelId必填checkout必填numRoomsnumAdultsnumChildren

skiplagged_sk_resolve_location

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

無需輸入參數。

skiplagged_sk_resolve_iata

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

輸入參數input必填

ferryhopper_get_ports

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

無需輸入參數。

ferryhopper_get_disruptions

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

輸入參數country必填tripDate必填

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.

輸入參數portLocation必填

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.

輸入參數date必填arrivalLocation必填departureLocation必填

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.

輸入參數legs必填

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.

輸入參數tripId必填

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

輸入參數query必填

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。

其他 Moltravel 整合