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 集成