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.
接入配置
选择客户端,复制配置,再按项目文档补齐环境变量。
claude mcp add trvl --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>' --env AFKLM_KEY='<AFKLM_KEY>' --env AFKL_KLM_COOKIES='<AFKL_KLM_COOKIES>' --env SERPAPI_KEY='<SERPAPI_KEY>' --env TRAVELPAYOUTS_TOKEN='<TRAVELPAYOUTS_TOKEN>' -- docker run -i --rm -e TRVL_MCP_TOKEN -e TRVL_MCP_READ_TOKEN -e TRVL_MCP_WRITE_TOKEN -e TRVL_MCP_OAUTH_CLIENT_SECRET -e AFKLM_KEY -e AFKL_KLM_COOKIES -e SERPAPI_KEY -e TRAVELPAYOUTS_TOKEN ghcr.io/mikkoparkkola/trvl:1.27.0~/.codex/config.toml
[mcp_servers.trvl]
command = "docker"
args = ["run", "-i", "--rm", "-e", "TRVL_MCP_TOKEN", "-e", "TRVL_MCP_READ_TOKEN", "-e", "TRVL_MCP_WRITE_TOKEN", "-e", "TRVL_MCP_OAUTH_CLIENT_SECRET", "-e", "AFKLM_KEY", "-e", "AFKL_KLM_COOKIES", "-e", "SERPAPI_KEY", "-e", "TRAVELPAYOUTS_TOKEN", "ghcr.io/mikkoparkkola/trvl:1.27.0"]
env = { TRVL_MCP_TOKEN = "<TRVL_MCP_TOKEN>", TRVL_MCP_READ_TOKEN = "<TRVL_MCP_READ_TOKEN>", TRVL_MCP_WRITE_TOKEN = "<TRVL_MCP_WRITE_TOKEN>", TRVL_MCP_OAUTH_CLIENT_SECRET = "<TRVL_MCP_OAUTH_CLIENT_SECRET>", AFKLM_KEY = "<AFKLM_KEY>", AFKL_KLM_COOKIES = "<AFKL_KLM_COOKIES>", SERPAPI_KEY = "<SERPAPI_KEY>", TRAVELPAYOUTS_TOKEN = "<TRAVELPAYOUTS_TOKEN>" }
# codex mcp add trvl --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>' --env AFKLM_KEY='<AFKLM_KEY>' --env AFKL_KLM_COOKIES='<AFKL_KLM_COOKIES>' --env SERPAPI_KEY='<SERPAPI_KEY>' --env TRAVELPAYOUTS_TOKEN='<TRAVELPAYOUTS_TOKEN>' -- docker run -i --rm -e TRVL_MCP_TOKEN -e TRVL_MCP_READ_TOKEN -e TRVL_MCP_WRITE_TOKEN -e TRVL_MCP_OAUTH_CLIENT_SECRET -e AFKLM_KEY -e AFKL_KLM_COOKIES -e SERPAPI_KEY -e TRAVELPAYOUTS_TOKEN ghcr.io/mikkoparkkola/trvl:1.27.0~/.cursor/mcp.json
{
"mcpServers": {
"trvl": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"TRVL_MCP_TOKEN",
"-e",
"TRVL_MCP_READ_TOKEN",
"-e",
"TRVL_MCP_WRITE_TOKEN",
"-e",
"TRVL_MCP_OAUTH_CLIENT_SECRET",
"-e",
"AFKLM_KEY",
"-e",
"AFKL_KLM_COOKIES",
"-e",
"SERPAPI_KEY",
"-e",
"TRAVELPAYOUTS_TOKEN",
"ghcr.io/mikkoparkkola/trvl:1.27.0"
],
"env": {
"TRVL_MCP_TOKEN": "<TRVL_MCP_TOKEN>",
"TRVL_MCP_READ_TOKEN": "<TRVL_MCP_READ_TOKEN>",
"TRVL_MCP_WRITE_TOKEN": "<TRVL_MCP_WRITE_TOKEN>",
"TRVL_MCP_OAUTH_CLIENT_SECRET": "<TRVL_MCP_OAUTH_CLIENT_SECRET>",
"AFKLM_KEY": "<AFKLM_KEY>",
"AFKL_KLM_COOKIES": "<AFKL_KLM_COOKIES>",
"SERPAPI_KEY": "<SERPAPI_KEY>",
"TRAVELPAYOUTS_TOKEN": "<TRAVELPAYOUTS_TOKEN>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"trvl": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"TRVL_MCP_TOKEN",
"-e",
"TRVL_MCP_READ_TOKEN",
"-e",
"TRVL_MCP_WRITE_TOKEN",
"-e",
"TRVL_MCP_OAUTH_CLIENT_SECRET",
"-e",
"AFKLM_KEY",
"-e",
"AFKL_KLM_COOKIES",
"-e",
"SERPAPI_KEY",
"-e",
"TRAVELPAYOUTS_TOKEN",
"ghcr.io/mikkoparkkola/trvl:1.27.0"
],
"env": {
"TRVL_MCP_TOKEN": "<TRVL_MCP_TOKEN>",
"TRVL_MCP_READ_TOKEN": "<TRVL_MCP_READ_TOKEN>",
"TRVL_MCP_WRITE_TOKEN": "<TRVL_MCP_WRITE_TOKEN>",
"TRVL_MCP_OAUTH_CLIENT_SECRET": "<TRVL_MCP_OAUTH_CLIENT_SECRET>",
"AFKLM_KEY": "<AFKLM_KEY>",
"AFKL_KLM_COOKIES": "<AFKL_KLM_COOKIES>",
"SERPAPI_KEY": "<SERPAPI_KEY>",
"TRAVELPAYOUTS_TOKEN": "<TRAVELPAYOUTS_TOKEN>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"trvl": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"TRVL_MCP_TOKEN",
"-e",
"TRVL_MCP_READ_TOKEN",
"-e",
"TRVL_MCP_WRITE_TOKEN",
"-e",
"TRVL_MCP_OAUTH_CLIENT_SECRET",
"-e",
"AFKLM_KEY",
"-e",
"AFKL_KLM_COOKIES",
"-e",
"SERPAPI_KEY",
"-e",
"TRAVELPAYOUTS_TOKEN",
"ghcr.io/mikkoparkkola/trvl:1.27.0"
],
"env": {
"TRVL_MCP_TOKEN": "<TRVL_MCP_TOKEN>",
"TRVL_MCP_READ_TOKEN": "<TRVL_MCP_READ_TOKEN>",
"TRVL_MCP_WRITE_TOKEN": "<TRVL_MCP_WRITE_TOKEN>",
"TRVL_MCP_OAUTH_CLIENT_SECRET": "<TRVL_MCP_OAUTH_CLIENT_SECRET>",
"AFKLM_KEY": "<AFKLM_KEY>",
"AFKL_KLM_COOKIES": "<AFKL_KLM_COOKIES>",
"SERPAPI_KEY": "<SERPAPI_KEY>",
"TRAVELPAYOUTS_TOKEN": "<TRAVELPAYOUTS_TOKEN>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"trvl": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"TRVL_MCP_TOKEN",
"-e",
"TRVL_MCP_READ_TOKEN",
"-e",
"TRVL_MCP_WRITE_TOKEN",
"-e",
"TRVL_MCP_OAUTH_CLIENT_SECRET",
"-e",
"AFKLM_KEY",
"-e",
"AFKL_KLM_COOKIES",
"-e",
"SERPAPI_KEY",
"-e",
"TRAVELPAYOUTS_TOKEN",
"ghcr.io/mikkoparkkola/trvl:1.27.0"
],
"env": {
"TRVL_MCP_TOKEN": "<TRVL_MCP_TOKEN>",
"TRVL_MCP_READ_TOKEN": "<TRVL_MCP_READ_TOKEN>",
"TRVL_MCP_WRITE_TOKEN": "<TRVL_MCP_WRITE_TOKEN>",
"TRVL_MCP_OAUTH_CLIENT_SECRET": "<TRVL_MCP_OAUTH_CLIENT_SECRET>",
"AFKLM_KEY": "<AFKLM_KEY>",
"AFKL_KLM_COOKIES": "<AFKL_KLM_COOKIES>",
"SERPAPI_KEY": "<SERPAPI_KEY>",
"TRAVELPAYOUTS_TOKEN": "<TRAVELPAYOUTS_TOKEN>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"trvl": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"TRVL_MCP_TOKEN",
"-e",
"TRVL_MCP_READ_TOKEN",
"-e",
"TRVL_MCP_WRITE_TOKEN",
"-e",
"TRVL_MCP_OAUTH_CLIENT_SECRET",
"-e",
"AFKLM_KEY",
"-e",
"AFKL_KLM_COOKIES",
"-e",
"SERPAPI_KEY",
"-e",
"TRAVELPAYOUTS_TOKEN",
"ghcr.io/mikkoparkkola/trvl:1.27.0"
],
"env": {
"TRVL_MCP_TOKEN": "<TRVL_MCP_TOKEN>",
"TRVL_MCP_READ_TOKEN": "<TRVL_MCP_READ_TOKEN>",
"TRVL_MCP_WRITE_TOKEN": "<TRVL_MCP_WRITE_TOKEN>",
"TRVL_MCP_OAUTH_CLIENT_SECRET": "<TRVL_MCP_OAUTH_CLIENT_SECRET>",
"AFKLM_KEY": "<AFKLM_KEY>",
"AFKL_KLM_COOKIES": "<AFKL_KLM_COOKIES>",
"SERPAPI_KEY": "<SERPAPI_KEY>",
"TRAVELPAYOUTS_TOKEN": "<TRAVELPAYOUTS_TOKEN>"
}
}
}
}需要的环境变量
TRVL_MCP_TOKENTRVL_MCP_READ_TOKENTRVL_MCP_WRITE_TOKENTRVL_MCP_OAUTH_CLIENT_SECRETAFKLM_KEYAFKL_KLM_COOKIESSERPAPI_KEYTRAVELPAYOUTS_TOKEN
把占位值换成你自己的密钥;不要把密钥提交到代码仓库。