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 freeWhy 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.
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:
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.
# 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.
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]
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]
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.
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.
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?
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?
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?
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.