{
  "markdown": "<div align=\"center\">\n\n# MoltTravel\n\n**One MCP server. Every travel tool.**\n\nSearch flights, compare prices, check visas, look up airports,<br>\nget travel advisories — through a single endpoint.\n\n[![MCP Protocol](https://img.shields.io/badge/MCP-Protocol-0066FF?style=for-the-badge)](https://modelcontextprotocol.io)\n[![Python 3.12+](https://img.shields.io/badge/Python-3.12+-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://python.org)\n[![License: MIT](https://img.shields.io/badge/License-MIT-A020F0?style=for-the-badge)](LICENSE)\n\n<br>\n\n```\n  Kiwi.com    Navifare     Peek.com    LastMinute\n  (flights)   (prices)   (experiences)  (flights)\n      \\          |           |          /\n       \\         |           |         /\n        +--------+-----------+--------+\n        |                             |\n        |    MoltTravel MCP Server    |\n        |                             |\n        |  Airports  Airlines  Visas  |\n        |  Countries  FCDO  Gemini AI |\n        |                             |\n        +-------------|---------------+\n                      |\n               MCP over HTTP\n                      |\n              Any MCP Client\n        (Claude, Cursor, your app)\n```\n\n</div>\n\n<br>\n\n## Why?\n\nTravel data is scattered across dozens of APIs, each with its own auth, format, and quirks. MoltTravel aggregates them behind a single [Model Context Protocol](https://modelcontextprotocol.io) endpoint:\n\n- **21+ tools** from 4 upstream MCP providers + 6 built-in datasets\n- **Zero config** for static data — airports, airlines, and visas load lazily with no API keys\n- **Schema-transparent proxy** — clients see the real upstream JSON Schema; upstream servers validate their own args\n- **One line to connect** from Claude Desktop, Claude Code, Cursor, or any MCP client\n\n<br>\n\n## Quick Start\n\n```bash\ngit clone https://github.com/navifare/moltravel-mcp.git\ncd moltravel-mcp\npython -m venv venv && source venv/bin/activate\npip install -r requirements.txt\npython molttravel_server.py\n```\n\nServer starts at **`http://localhost:8000/mcp`**. That's it.\n\n<br>\n\n## Connect Your Client\n\n<details>\n<summary><strong>Claude Desktop</strong></summary>\n\nAdd to `claude_desktop_config.json`:\n```json\n{\n  \"mcpServers\": {\n    \"molttravel\": {\n      \"url\": \"http://localhost:8000/mcp\"\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Claude Code</strong></summary>\n\nAdd to `.claude/settings.json`:\n```json\n{\n  \"mcpServers\": {\n    \"molttravel\": {\n      \"url\": \"http://localhost:8000/mcp\"\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Python (programmatic)</strong></summary>\n\n```python\nfrom mcp import ClientSession\nfrom mcp.client.streamable_http import streamablehttp_client\n\nasync with streamablehttp_client(\"http://localhost:8000/mcp\") as (r, w, _):\n    async with ClientSession(r, w) as session:\n        await session.initialize()\n        tools = await session.list_tools()\n        result = await session.call_tool(\"airports_lookup\", {\"code\": \"ZRH\"})\n```\n</details>\n\n<br>\n\n## Tools\n\n### Flights & Pricing\n\n| Tool | Provider | What it does |\n|:-----|:---------|:-------------|\n| `kiwi_search-flight` | Kiwi.com | Search flights by route, date, passengers, cabin class |\n| `navifare_format_flight_pricecheck_request` | Navifare | Parse flight details from natural language into structured data |\n| `navifare_flight_pricecheck` | Navifare | Compare a flight's price across multiple booking sites |\n\n### Experiences & Activities\n\n| Tool | Provider | What it does |\n|:-----|:---------|:-------------|\n| `peek_search_experiences` | Peek.com | Search 300K+ verified activities worldwide |\n| `peek_experience_details` | Peek.com | Full details, reviews, and photos for an experience |\n| `peek_experience_availability` | Peek.com | Check availability and pricing for specific dates |\n| `peek_search_regions` | Peek.com | Find region IDs by name |\n| `peek_list_tags` | Peek.com | Browse activity categories and tags |\n| `peek_render_activity_tiles` | Peek.com | Render embeddable activity widgets |\n\n### Reference Data <sub>(built-in, no API keys needed)</sub>\n\n| Tool | Dataset | What it does |\n|:-----|:--------|:-------------|\n| `airports_lookup` | OurAirports | Look up by IATA or ICAO code |\n| `airports_search` | OurAirports | Search by name, filter by country or type |\n| `airports_near` | OurAirports | Find airports within a radius of any coordinates |\n| `airlines_lookup` | OpenFlights | Look up by IATA or ICAO code |\n| `airlines_search` | OpenFlights | Search by name, filter by country or active status |\n| `visa_check` | Passport Index | Check visa requirement between two countries |\n| `visa_summary` | Passport Index | Full visa-free/VOA/e-visa breakdown for a passport |\n| `restcountries_country_info` | REST Countries | Capital, currencies, languages, timezones, population |\n| `fcdo_travel_advice` | UK FCDO | Safety advisories, entry requirements, health warnings |\n| `fcdo_list_countries` | UK FCDO | List all countries with travel advisories |\n| `data_status` | — | Check which datasets are loaded and record counts |\n\n### Natural Language <sub>(optional)</sub>\n\n| Tool | What it does |\n|:-----|:-------------|\n| `travel_agent` | Ask any travel question — Gemini routes to the right tools and returns a combined answer |\n\n> Requires `GEMINI_API_KEY`. Example: *\"Cheapest flights from Zurich to Rome next week, and do I need a visa?\"*\n\n<br>\n\n## How It Works\n\n### 1. Tool Discovery\n\nOn startup, MoltTravel connects to each upstream MCP server, calls `tools/list`, and registers every discovered tool with a `{provider}_{tool_name}` prefix:\n\n```\nkiwi       → kiwi_search-flight, kiwi_feedback-to-devs\nnavifare   → navifare_flight_pricecheck, navifare_format_flight_pricecheck_request\npeek       → peek_search_experiences, peek_experience_details, ...\nlastminute → (discovered at runtime)\n```\n\nNative tools (airports, airlines, visas, countries, FCDO) are registered directly.\n\n### 2. Schema-Transparent Proxy\n\nClients 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.\n\n```python\n# Client sees the real schema\nparameters = input_schema          # original from upstream\n\n# Server doesn't re-validate types — just passes through\nfields[prop_name] = (Any, Field(default=None))\n```\n\n### 3. Lazy Data Loading\n\nStatic datasets (airports, airlines, visas) download on first use behind async locks. No startup penalty, no wasted bandwidth if you only use flight tools.\n\n<br>\n\n## Configuration\n\n| Variable | Default | Description |\n|:---------|:--------|:------------|\n| `PORT` | `8000` | Server port |\n| `GEMINI_API_KEY` | — | Enables the `travel_agent` natural-language routing tool |\n\n<br>\n\n## Deployment\n\n<details>\n<summary><strong>Docker</strong></summary>\n\n```dockerfile\nFROM python:3.12-slim\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\nCOPY . .\nEXPOSE 8000\nCMD [\"python\", \"molttravel_server.py\"]\n```\n\n```bash\ndocker build -t molttravel .\ndocker run -p 8000:8000 molttravel\n```\n</details>\n\n<details>\n<summary><strong>Render / Railway / Fly.io</strong></summary>\n\nThe 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`.\n</details>\n\n<br>\n\n## Project Structure\n\n```\nmoltravel-mcp/\n├── molttravel_server.py        # Server core — proxy logic, native tools, routing\n├── requirements.txt            # mcp[cli], httpx\n├── test_search.py              # Integration test client\n└── providers/\n    ├── __init__.py             # MCP_PROVIDERS registry + exports\n    ├── mcp_client.py           # Generic HTTP client for upstream MCP servers\n    ├── data_loader.py          # CSV downloader + haversine distance\n    ├── airports.py             # 45K airports from OurAirports\n    ├── airlines.py             # 7K airlines from OpenFlights\n    ├── visas.py                # Visa requirements from Passport Index\n    ├── restcountries.py        # REST Countries API\n    ├── fcdo.py                 # UK FCDO travel advisories\n    └── gemini.py               # Gemini Flash tool router\n```\n\n<br>\n\n## Extending\n\n### Add an MCP provider\n\nAdd one line to `providers/__init__.py` and restart:\n\n```python\nMCP_PROVIDERS = {\n    \"kiwi\": McpClient(\"https://mcp.kiwi.com/mcp\"),\n    \"navifare\": McpClient(\"https://mcp.navifare.com/mcp\"),\n    \"peek\": McpClient(\"https://mcp.peek.com/mcp\"),\n    \"your_provider\": McpClient(\"https://mcp.example.com/mcp\"),  # new\n}\n```\n\nTools are discovered and registered automatically as `your_provider_{tool_name}`.\n\n### Add a native tool\n\n```python\n@server.tool(name=\"my_tool\")\nasync def my_tool(query: str) -> str:\n    \"\"\"Description shown to MCP clients.\"\"\"\n    return \"result\"\n```\n\n<br>\n\n## Data Sources & Licenses\n\n| Dataset | Source | License |\n|:--------|:-------|:--------|\n| Airports | [OurAirports](https://ourairports.com/data/) | Public Domain |\n| Airlines | [OpenFlights](https://openflights.org/data.php) | ODbL 1.0 |\n| Visa Requirements | [Passport Index](https://github.com/ilyankou/passport-index-dataset) | MIT |\n| Country Info | [REST Countries](https://restcountries.com) | MPL 2.0 |\n| Travel Advisories | [UK FCDO](https://www.gov.uk/foreign-travel-advice) | OGL v3.0 |\n\n<br>\n\n## Contributing\n\n1. Fork the repo\n2. Create a branch (`git checkout -b feature/my-feature`)\n3. Make changes and test (`python molttravel_server.py`)\n4. Open a pull request\n\n<br>\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 9651,
  "sha": "63542553a79113aeb92f64ac87b67f229de94d1bab1f51db8e38bcfe85848dcd",
  "repo_slug": "navifare/moltravel-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_moltravel_travel_eaa28c9b/readme"
}