TrvlBLOCK
Travel MCP server + CLI for AI assistants — flights, hotels, trains, cars, ferries, price alerts. No API keys, single Go binary. 1 smart MCP tool + 66 aliases (98.9% smaller tools/list). Works with Claude, Cursor, Windsurf, Codex.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://goreportcard.com/report/github.com/MikkoParkkola/trvl) [](https://github.com/MikkoParkkola/trvl/actions/workflows/ci.yaml) [](https://github.com/MikkoParkkola/trvl/releases) [](https://github.com/MikkoParkkola/trvl/releases) [](LICENSE) [](https://pkg.go.dev/github.com/MikkoParkkola/trvl) [](https://modelcontextprotocol.io/specification/2026-07-28) [](https://github.com/MikkoParkkola/trvl#what-it-can-do) [](https://go.dev/) [](https://insiders.vscode.dev/redirect/mcp/install?name=trvl&config=%7B%22command%22%3A%22trvl%22%2C%22args%22%3A%5B%22mcp%22%5D%7D) [](cursor://anysphere.cursor-deeplink/mcp/install?name=trvl&config=%7B%22command%22%3A%22trvl%22%2C%22args%22%3A%5B%22mcp%22%5D%7D) [](https://socialistic.ai/en/skill/trvl-travel-mcp-4f7aa7)
Ask your AI assistant to plan a real trip, and it actually can. trvl gives Claude, Cursor, Windsurf, Codex, or any MCP-compatible cli
74b0aee82db1OBSERVED · 2026-10-08Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add trvl:1.26.0 --env TRVL_MCP_TOKEN=${TRVL_MCP_TOKEN} --env TRVL_MCP_READ_TOKEN=${TRVL_MCP_READ_TOKEN} --env TRVL_MCP_WRITE_TOKEN=${TRVL_MCP_WRITE_TOKEN} --env TRVL_MCP_OAUTH_CLIENT_SECRET=${TRVL_MCP_OAUTH_CLIENT_SECRET} -- docker run -i --rm ghcr.io/mikkoparkkola/trvl:1.26.0:Noneclaude mcp add trvl-mcp --env TRVL_MCP_TOKEN=${TRVL_MCP_TOKEN} --env TRVL_MCP_READ_TOKEN=${TRVL_MCP_READ_TOKEN} --env TRVL_MCP_WRITE_TOKEN=${TRVL_MCP_WRITE_TOKEN} --env TRVL_MCP_OAUTH_CLIENT_SECRET=${TRVL_MCP_OAUTH_CLIENT_SECRET} -- npx -y [email protected]Trust audit
BLOCKgrade F · trust 55/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (5 observation(s))
- Shell
- declared (5 observation(s))
- Dependencies
- pinned
- Secrets in source
- found
Findings (25)
if out, err := exec(ctx, "gws", "calendar", "agenda", "--days", itoa(days), "--format", "json"); err == nil {if out, err := exec(ctx, "icalBuddy", "-f", "-n", "-ea", "-nc", "-b", "", "-iep", "title,datetime", "-po", "title,datetime", "eventsFrom:today", "to:today+"+itoa(days)); err == nil {05281eded06cc2ab73ce99b9e42369ec3bd16638c8ec1453c4a95c51ee0e5c0ff13a4a81346a477b7a2beafa0b8fa028f37e7d0371709333053f7b12583b51bc6af2cf3246b6a09819fb93732124686523d61f945bc18069aaea5e5cd88add90af306407
const secret = "T00000000-B11111111-zzzzzzzzzzzzzzzzzzzzzzzz"
const secret = "T00000000-B11111111-yyyyyyyyyyyyyyyyyyyyyyyy"
const token = "T4K9m2QpR7vN1sW6xL8b"
.goreleaser.yaml
.trivyignore
.nojekyll
const fixtureDir = "../../internal/inboxparser/testdata"
"CLI": "../../cmd/trvl/flights.go",
"MCP": "../../mcp/tools_flights.go",
"CLI": "../../cmd/trvl/ground.go",
"MCP": "../../mcp/tools_ground.go",
{"link local metadata ip", "https://169.254.169.254/latest/meta-data/", false},"http://169.254.169.254/latest/meta-data/",
opts.BookingURL = "http://169.254.169.254/latest/meta-data/"
{"link-local metadata", endpoint, "http://169.254.169.254/latest/meta-data/", false},{"self-hosted endpoint, metadata service", "http://127.0.0.1:8080/api", "http://169.254.169.254/latest/meta-data/", false},- **`/dashboard` is now browser-native on localhost.** A loopback bind serves the dashboard without a bearer token (read-only, secret-redacted, local-only — the same posture as `/health`), so `trvl mc
`http://127.0.0.1:8080/v1/heartbeat`. The path the binary serves is
When running as an HTTP server (`trvl mcp --http`), the same view is served as a read-only, auto-refreshing HTML dashboard at `/dashboard`. On a local (loopback) bind it needs no token — just open <ht
`http://localhost`/`http://127.0.0.1` is allowed for local development only).
- **Exception:** `http://localhost` and `http://127.0.0.1` public URLs are
<!--F/--></span><!--F/--></button></div><!--M/--><!--M#s0-2-0-20-37-6-49-3[2]--><div aria-labelledby="s0-2-0-20-37-6-49-3[2]-@0" class="mt-6"><div id="s0-2-0-20-37-6-49-3[2]-@0" class="px-4 pb-2 text-
Gates applied: no_behavioural_pass.
74b0aee82db1full audit observations/trust-audit/mcp-server/mikkoparkkola__trvl.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | 74b0aee82db1 | BLOCK | F | 55 | first audit |
Questions
What is the Trvl MCP server?
Travel MCP server + CLI for AI assistants — flights, hotels, trains, cars, ferries, price alerts. No API keys, single Go binary. 1 smart MCP tool + 66 aliases (98.9% smaller tools/list). Works with Claude, Cursor, Windsurf, Codex.
Is Trvl safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (55/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What credentials does Trvl need?
It reads AFKLM_KEY, TRVL_MCP_OAUTH_CLIENT_SECRET, TRVL_MCP_READ_TOKEN, TRVL_MCP_TOKEN and TRVL_MCP_WRITE_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Trvl run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as trvl-heartbeat.
How current is this page?
The grade is for one exact copy of the source (74b0aee82db1), read on 2026-10-08. The repository is watched and re-audited when it changes.