**Flight and hotel search for your terminal, Python, and AI assistants.**
Runs on your machine, no API keys.
[](https://pypi.org/project/viajante/)
[](https://pypi.org/project/viajante/)
[](https://www.npmjs.com/package/@viajante/mcp)
[](https://github.com/felipebasurto/viajante/actions/workflows/test.yml)
[Website](https://viajante.felipebasurto.com) ·
[Usage guide](https://github.com/felipebasurto/viajante/blob/main/docs/usage.md) ·
[Architecture](https://github.com/felipebasurto/viajante/blob/main/docs/architecture.md) ·
[Changelog](https://github.com/felipebasurto/viajante/blob/main/CHANGELOG.md)
It reads Google Flights, Google Hotels, and Booking.com directly, and Skiplagged
when you opt in. It returns prices, itinerary details, and links. It reports what the provider returned
and says so when something is unknown; it never invents a fare.
## Quick start
Requires **Python 3.10+**.
```bash
pip install viajante
viajante flights JFK-LHR:2026-11-15 --fetch sweep
viajante hotels London 2026-11-15 2026-11-20 --currency GBP --source google
```
Use future dates. Not sure of a code? `viajante airports london`.
Prefer not to install? `uvx --from viajante viajante airports JFK`, or
`npx -y -p @viajante/mcp viajante airports JFK` (both need [`uv`](https://docs.astral.sh/uv/)).
These searches use plain HTTP. Booking.com and `--fetch detail` need the
[browser extra](#optional-browser-support).
## Connect an AI assistant
Add this to your assistant's MCP configuration (needs
[`uv`](https://docs.astral.sh/uv/getting-started/installation/) and Python 3.10+):
```json
{
"mcpServers": {
"viajante": {
"command": "npx",
"args": ["-y", "@viajante/mcp"]
}
}
}
```
Without Node, use `"command": "uvx"` with
`"args": ["--from", "viajante[mcp]", "viajante-mcp"]`. That covers Google
Flights and Hotels with no Chromium. The npm entry also includes the browser
extra, which `search_explore` needs.
Then ask in plain language:
> Find a seven-night round trip from BOS to LHR, departing any day in
> November 2026. Compare the dates.
> Hotels in Tokyo, November 12 to 16, two adults, free cancellation, in JPY.
Every tool result (except `lookup_airports`) carries one envelope: `status`,
`completeness`, `empty_reason`, `retry_after`, `observed_at`. Only
`empty_reason: provider_empty` means the provider found nothing. A client that
only takes a URL can use `viajante-mcp --transport streamable-http`; it has no
auth, so keep it on loopback ([details](https://github.com/felipebasurto/viajante/blob/main/docs/usage.md#mcp-client-compatibility)).