databasedmcp

← Articles

Alternative to TripIt: a trip planner with Claude

Paste your booking confirmations into Claude and get every trip as a day-by-day plan you can ask about on the way.

7 min read

databasedmcp gives your AI assistant databases it keeps between conversations, so everything in this article works from the day you connect it. Free to start, no card.

Get started free

Why build it yourself

TripIt turns a pile of confirmation emails into one plan: the flight, the hotel, the train, in order, with times and addresses. On the day, you open it to see what's next, not to dig through your inbox.

That plan is three tables: trips, bookings and an itinerary. Paste a confirmation into Claude and it picks out what matters and saves it. Tell it you want to see the castle on Saturday morning and it adds that too. Ask what's on tomorrow, or which nights still need a bed, and it answers from your own rows.

Connect Claude to databasedmcp

databasedmcp is a remote MCP server that gives AI assistants private SQLite databases, with nothing to install.

In Claude on the web, desktop or mobile, open Settings → Connectors, choose Add custom connector and enter https://databasedmcp.com/mcp. Select Connect, sign in to databasedmcp with your email or Google, and select Allow. Then turn databasedmcp on for a conversation from the tools menu.

Claude asks before it runs anything that changes or deletes data. Reading runs without asking.

Any other MCP client works the same way; the docs have the details.

Copy this prompt to build it

Paste this into Claude to set up the database, its tables and its guide in one go. The rest of this article walks through what it makes and how you use it.

prompt
Set up a trip planner for me in databasedmcp, in one go.

1. Create a database called trips, described as "Trip planner: trips, bookings and a day-by-day itinerary".
2. Create three tables:
   - trips: id, name (required, like "Lisbon in March"), starts_on and ends_on (dates), notes.
   - bookings: id, trip_id (references trips), kind (flight, train, hotel, car, event or other), starts_at and ends_at (local date and time, like 2027-03-12 07:40), provider (the airline, hotel or company), details (flight number, seat, address, what's included). Never store passport numbers, payment details or the codes that let someone manage a booking.
   - itinerary: id, trip_id (references trips), day (date), time (like 09:30, empty if it's whenever), what (required), booking_id (references bookings, when it comes from one), notes.
3. Write the database a guide that says what each table is for, to read the dates, times and provider out of a pasted confirmation and leave the rest out, to add each booking to the itinerary on its day, and the queries for "the plan day by day", "which nights have no hotel yet" and "what trips are coming up".

From then on: when I paste a confirmation, add it as a booking on the right trip (making the trip if it's new) and put it in the itinerary. When I tell you what I want to do on a day, add it to the itinerary. Show me the tables when you're finished.

Ask for the database

You don't write the schema. Describe what you want:

Set up a trip planner in databasedmcp: trips, the bookings I paste in (flights, trains, hotels) and a day-by-day itinerary. When I paste a confirmation, save it and put it on the right day.

Claude creates a database called trips and its tables:

schema
CREATE TABLE trips (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  starts_on TEXT,
  ends_on TEXT,
  notes TEXT
);

CREATE TABLE bookings (
  id INTEGER PRIMARY KEY,
  trip_id INTEGER NOT NULL REFERENCES trips(id),
  kind TEXT NOT NULL CHECK (kind IN ('flight', 'train', 'hotel', 'car', 'event', 'other')),
  starts_at TEXT,
  ends_at TEXT,
  provider TEXT,
  details TEXT
);

CREATE TABLE itinerary (
  id INTEGER PRIMARY KEY,
  trip_id INTEGER NOT NULL REFERENCES trips(id),
  day TEXT NOT NULL,
  time TEXT,
  what TEXT NOT NULL,
  booking_id INTEGER REFERENCES bookings(id),
  notes TEXT
);

It also writes the database a guide on how the tables are meant to be used. The guide comes back with the schema whenever an assistant looks the database up. Claude files things the same way next week as today, and so does any other assistant you connect.

guide
# trips: trips, bookings, itinerary

- **trips**: one row per trip, with its first and last day.
- **bookings**: one per flight, train, hotel, car or event. Read dates, times and provider out of the confirmation I paste; times are local. Never store passport numbers, payment details or booking-management codes.
- **itinerary**: the day-by-day plan. Rows from a booking set `booking_id`; `time` is empty for "whenever".

Day by day: `SELECT i.day, i.time, i.what, b.details FROM itinerary i LEFT JOIN bookings b ON b.id = i.booking_id WHERE i.trip_id = ? ORDER BY i.day, i.time IS NULL, i.time`

Nights with no hotel: a recursive CTE over the trip's nights, keeping those with no hotel booking where date(starts_at) <= night < date(ends_at).

Coming up: `SELECT name, starts_on, ends_on FROM trips WHERE ends_on >= date('now') ORDER BY starts_on`

Use it

From here on you talk, and Claude writes the rows. Each request below is one statement:

I'm going to Lisbon from 12 to 16 March 2027. Start a trip for it.
execute
INSERT INTO trips (name, starts_on, ends_on) VALUES (?, ?, ?) RETURNING id
-- params: ["Lisbon in March","2027-03-12","2027-03-16"]
Here's the flight confirmation. [pastes the email]
execute
INSERT INTO bookings (trip_id, kind, starts_at, ends_at, provider, details) VALUES (?, ?, ?, ?, ?, ?)
-- params: [1,"flight","2027-03-12 07:40","2027-03-12 10:05","Bluegull Air","BG 312, Helsinki to Lisbon, seat 14C, 1 checked bag"]

Claude keeps the times and the seat and leaves the rest of the email out.

And the hotel. [pastes the confirmation]
execute
INSERT INTO bookings (trip_id, kind, starts_at, ends_at, provider, details) VALUES (?, ?, ?, ?, ?, ?)
-- params: [1,"hotel","2027-03-12 15:00","2027-03-16 11:00","Casa do Largo","Double room, breakfast included, Rua das Flores 12"]

Claude puts both bookings on the itinerary, on the day they start.

execute
INSERT INTO itinerary (trip_id, day, time, what, booking_id) SELECT trip_id, date(starts_at), strftime('%H:%M', starts_at), kind || ': ' || provider, id FROM bookings WHERE trip_id = ?
-- params: [1]
On Saturday I want the castle in the morning, lunch somewhere in Alfama, and the tile museum after.
execute
INSERT INTO itinerary (trip_id, day, time, what) VALUES (?, ?, ?, ?), (?, ?, ?, ?), (?, ?, ?, ?)
-- params: [1,"2027-03-13","09:30","Castle",1,"2027-03-13","12:30","Lunch in Alfama",1,"2027-03-13","15:00","Tile museum"]

Ask it questions

Once there's data, each report you'd pay for is a single query:

What's the plan, day by day?
query
SELECT i.day, i.time, i.what, b.details FROM itinerary i LEFT JOIN bookings b ON b.id = i.booking_id WHERE i.trip_id = ? ORDER BY i.day, i.time IS NULL, i.time
-- params: [1]
Are there any nights I haven't booked a bed for?
query
WITH RECURSIVE nights(night) AS (SELECT starts_on FROM trips WHERE id = ? UNION ALL SELECT date(night, '+1 day') FROM nights, trips t WHERE t.id = ? AND date(night, '+1 day') < t.ends_on) SELECT night FROM nights WHERE NOT EXISTS (SELECT 1 FROM bookings b WHERE b.trip_id = ? AND b.kind = 'hotel' AND date(b.starts_at) <= night AND date(b.ends_at) > night)
-- params: [1,1,1]

The CTE lists every night of the trip and keeps the ones no hotel covers. Here it comes back empty: Casa do Largo covers all 4.

What trips have I got coming up?
query
SELECT name, starts_on, ends_on FROM trips WHERE ends_on >= date('now') ORDER BY starts_on

You can also open the database on the website, page through its rows and run read-only SQL yourself.

What you give up

TripIt builds the itinerary from confirmation emails you forward or that it finds in your inbox. Here, a booking exists because you pasted it into Claude. Nothing arrives on its own, and nothing is added to your calendar.

TripIt can tell you when a flight is delayed or moves gate. databasedmcp has no flight data and sends no notifications, so check the airline's own app on the day. What you get is a plan in your own database. Claude can read it, and so can anyone you invite to your account.

Try it

databasedmcp is free to start, with no card. Free has 100 tool calls a week, enough to set this up and try it for a week. Starter has 1,000 for everyday use.

Create an account

More articles · databasedmcp · Docs