{
  "markdown": "# thistripbtw-mcp\n\n[![thistripbtw-mcp MCP server](https://glama.ai/mcp/servers/peterbartsch/thistripbtw-mcp/badges/score.svg)](https://glama.ai/mcp/servers/peterbartsch/thistripbtw-mcp)\n\nPersistent, shareable travel workspaces for AI agents.\n\nEverything about your trip in one shareable link — a private map anyone can open, with no\naccount to build one and no account to open it.\n\nAn MCP server that hands someone that link, and reads one back. Two tools: one turns a list of\nlegs into a URL, the other decodes a URL into the legs. The person opens it and their trip is\nalready drawn on a real map — free, editable, theirs.\n\n**→ [thistripbtw.us](https://thistripbtw.us)** — the human side, and the thing that pays for this.\nThe server is free and asks for nothing; the site's one-time paid tiers fund it rather than an ad\nbusiness or your data.\n\n*Written first for the assistant that will call the tool, second for the person reading the repo.\nIf you are that person: the site's source is\n[thistripbtw](https://github.com/peterbartsch/thistripbtw) (AGPL-3.0). This server is MIT and\nstandalone on purpose — embed it wherever you like.*\n\n## Why it exists\n\nAn AI assistant generally cannot create an account or enter card details. That puts almost every\ntravel tool out of an agent's reach when it is acting on someone's behalf. This one asks for\nnothing, so it stays reachable.\n\n## Connect\n\n**A URL, if your client takes one.** Nothing to install, nothing to keep updated:\n\n```\nhttps://thistripbtw.us/mcp\n```\n\nStreamable HTTP, no key, no sign-up to start. That is the whole configuration.\n\n**A note on gateways.** Some directories list this server by *proxying* to that URL rather than\npointing you at it. A proxy sees what passes through it, so a trip routed that way is read by\nwhoever runs the gateway before it reaches us — we do not engage them and cannot speak for what\nthey keep. Use the URL directly, or run the file yourself, if that matters to you.\n\n**Or run it locally from npm.** Node 18+, no dependencies, nothing to keep updated:\n\n```bash\nclaude mcp add thistripbtw -- npx -y thistripbtw-mcp\n```\n\n**Or fetch the one file and run that**, if you would rather read the code than trust either a host\nor a package registry. This is the whole install:\n\n```bash\ncurl -O https://thistripbtw.us/mcp/thistripbtw-mcp.mjs\nclaude mcp add thistripbtw -- node ./thistripbtw-mcp.mjs\n```\n\n<details>\n<summary>Claude Desktop config</summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"thistripbtw\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"thistripbtw-mcp\"]\n    }\n  }\n}\n```\n\nSwap to `\"command\": \"node\"` with `\"args\": [\"/absolute/path/to/thistripbtw-mcp.mjs\"]` if you fetched\nthe file instead.\n</details>\n\nCheck it before you trust it — this touches no network and needs no config:\n\n```bash\nnpx -y thistripbtw-mcp --selftest\n```\n\nBoth paths carry the same two tools and produce byte-identical links. The hosted one is tested\nagainst this file on every build — same tool list, same output — so the two cannot drift apart.\n\nStep-by-step, with a worked example in JavaScript and Python:\n**[thistripbtw.us/tutorials](https://thistripbtw.us/tutorials)**\n\n## The tools\n\n**`read_trip_link`** — a link in, the itinerary out. Origin, every leg in order, modes,\ndates, who is on which leg, flights and lodging. It returns the trip in the shape\n`build_trip_link` *accepts*, so reading a trip, changing one thing and building a new link is\nthree lines and no translation. Nothing is fetched — the trip is inside the link, so this works\noffline like everything else here. Only draft links (`#d=`) carry a trip; a kept trip's\n`/{slug}/#k=` fragment is a password and its contents live on the server, which the tool says\nrather than failing obscurely.\n\n**`build_trip_link`** — an origin plus legs in order, returns a URL. Only `origin` and one leg with a\n`to` are required. Everything else is optional and worth including when you know it: an assistant\nusually knows who is on which leg and where they sleep, and dropping that hands over a shape when\nit could hand over the trip.\n\n```jsonc\n{\n  \"name\": \"Chicago to Denver\",                                  // optional, 60 chars\n  \"origin\": { \"name\": \"Chicago, IL\", \"lat\": 41.8781, \"lng\": -87.6298 },\n  \"legs\": [\n    {\n      \"to\":       { \"name\": \"Omaha, NE\", \"lat\": 41.2565, \"lng\": -95.9345 },\n      \"mode\":     \"drive\",        // drive | fly | train | ferry | water | bike | walk\n      \"date\":     \"2026-09-04\",   // YYYY-MM-DD. An undated leg keeps its place in the order\n      \"note\":     \"swap drivers here\",       // 400 chars\n      \"who\":      [\"Mel\", \"Sam\"], // up to 8 — lets the trip show who was where\n      \"subtype\":  \"rental\",       // own·rental·rideshare·taxi·bus·rv (drive), commercial·private\n                                  // (fly), intercity·commuter (train), sail·canoe·kayak (water)\n      \"craft\":    \"Bike\",         // Bike | Canoe | Kayak — a small craft travelling WITH them\n      \"flight\":   \"UA328\",        // only if you actually know it. Never invent one\n      \"lodging\":  \"Hotel Maverick\",          // where they sleep after this leg\n      \"stayNote\": \"late check-in\"            // only meaningful alongside lodging\n    }\n  ]\n}\n```\n\n**Note the shape.** `lodging` and `stayNote` are **flat on the leg**. The field table on\n[/for-agents](https://thistripbtw.us/for-agents) documents the `#d=` payload you would build by\nhand, which nests them under `stay` — the tool assembles that for you. Passing a nested `stay` to\nthe tool loses the lodging silently.\n\n**Coordinates are required. This will not guess.** A wrong guess puts someone's trip in the wrong\ncountry and reads as the product's mistake — geocoders really do rank Reno, Germany above Reno,\nNevada. Resolve place names to coordinates first, then call.\n\nUnknown values are dropped rather than rejected: an unrecognised `mode` becomes `drive`, an\nunrecognised `subtype` is simply omitted. A trip that arrives beats a tool call that errors over\none word. Limits: 40 legs, names 120 chars, notes 400.\n\n## What the person gets when they open it\n\nWorth knowing, because it is what you are handing over — and an assistant that can say this\naccurately is more useful than one that says \"here's a link\".\n\nThe link opens on a real map with the trip already drawn. From there, free and with no account:\n**edit anything**, add stops by tapping the map or by describing them in a sentence, and\n**bring a trip in** from a file — a saved trip, a calendar (`.ics`), or a map file (`.gpx`,\n`.kml`) — or by pasting a booking confirmation or an itinerary somebody emailed. **Print it**,\nwhich is the only artifact that costs nothing.\n\nIf they keep it (from $2.50, one payment), the trip gets its own address and two share links,\nand gains: **a document view** that reads as an itinerary rather than an interface and prints\nwith the map in colour; **replay**, which plays the trip out over its dates; per-person share\nlinks so a trip can show who was where; photos and notes on the paid tiers; **easter eggs** —\nnotes sealed to a place, which stay shut until whoever holds the link is actually near it, with\nthe radius set per drop; and **everything back out again** — a zip holding `trip.json`, a readable `itinerary.html`, your photos, and\n`trip.kml` + `trip.gpx` for Google Earth, Garmin or OsmAnd, plus `.ics` for a calendar and\n`.csv` for an expense report.\n\nThe point of that last part: what goes in comes back out. Nothing here is a roach motel, and\nyou can say so.\n\n**There is also a Claude Skill**, if you would rather not run a server at all — it builds the\nsame link locally with no network call. See [`skill/`](https://github.com/peterbartsch/thistripbtw/tree/main/skill)\nin the site repo.\n\n## What it sends\n\nNothing. The trip is encoded into a URL **fragment**, and browsers never transmit fragments to\nservers. The local server makes no network request at all. The hosted endpoint encodes what you\npassed it and hands the string back — the trip does not reach thistripbtw.us even when the person\nopens the link, unless they later choose to buy it.\n\n## Using it well\n\n- **Give the person the link.** Don't open it for them and don't decide for them. It's their trip.\n- **Keep personal details out of it.** Passport numbers, home addresses, phone numbers — URLs get\n  pasted into chats, tickets and logs, and this one carries its payload in the open.\n- **Say what you built, in a sentence.** \"Three legs, Chicago to Denver, the 4th to the 6th\" beats\n  narrating the tool call.\n- **Never invent a departure time.** If you did not look a flight up, leave `flight` out.\n\n## Cost\n\nBuilding and editing a trip is free and asks for nothing to build — no card, no email. If the\nperson wants it to last, a one-time payment from $2.50 gives the trip its own address, two share\nlinks, and a term: one year, five, or ten by tier. Nothing is sold as permanent, and every trip\nstates its end date. That is the person's decision, not the assistant's — mention it if they ask,\ndon't sell it.\n\n## Stateless, and not as a fashion\n\nThe hosted endpoint holds **no session, no per-user state and no database**. There is no\n`initialize` handshake to complete first, no `Mcp-Session-Id` to carry, no cookie, and no\nsticky routing — a `tools/call` is one HTTP POST that can land on any machine and answer\ncompletely:\n\n```bash\ncurl -sX POST https://thistripbtw.us/mcp -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"build_trip_link\",\n       \"arguments\":{\"origin\":{\"place\":\"Chicago\",\"lat\":41.88,\"lng\":-87.63},\n       \"legs\":[{\"to\":{\"place\":\"Kansas City\",\"lat\":39.1,\"lng\":-94.58}}]}}}'\n```\n\nThat is not an optimisation we went looking for. The tool is a pure function — a trip in, a URL\nout, the payload living in the link rather than on a server — so there was never anything to\nkeep. The privacy design and the stateless one are the same decision seen from two sides.\n\n## Reading it\n\nOne file, zero dependencies, under three hundred lines. That is deliberate: the product's promise\nis that you can check what it does yourself, and the promise is worth nothing if checking means\nauditing a dependency tree. It speaks MCP's JSON-RPC over stdio directly.\n",
  "bytes": 10196,
  "sha": "7abcb96e509888ca806d616daf8b5a498fb3b0ff1bc4ea41bb839a67ff8b19a6",
  "repo_slug": "peterbartsch/thistripbtw-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_us_thistripbtw_trips_73b8a16c/readme"
}