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
For many people, Letterboxd is a diary: what they watched, on which night, how many stars it got, and a list of films to get to next. The reviews, lists and follows are there too, but the part you open after every film is the log.
That log is three tables: films, viewings and a watchlist. Tell Grok what you thought of the ending, and it writes the row while you talk. A year from now you can ask what you gave five stars, or how many times you've rewatched the same comfort film, and get an answer from your own data.
Connect Grok to databasedmcp
databasedmcp is a remote MCP server that gives AI assistants private SQLite databases, with nothing to install.
Open grok.com/connectors, add a new connector, choose Custom and enter https://databasedmcp.com/mcp. When Grok opens the databasedmcp page, sign in and select Allow. Then turn the connector on in a chat.
Any other MCP client works the same way; the docs have the details.
Copy this prompt to build it
Paste this into Grok 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 film diary for me in databasedmcp, in one go. 1. Create a database called films, described as "Film diary: what I've watched, my ratings and my watchlist". 2. Create three tables: - films: id, title (required), year, director, added_at (defaults to now). One row per film, however many times I watch it. - viewings: id, film_id (references films), watched_on (date, defaults to today), rating (0.5 to 5 in half stars, optional), rewatch (1 if I'd seen it before, else 0), where_watched (cinema, home, plane), notes (a line or two in my words). - watchlist: id, film_id (references films, one row per film at most), added_on (date, defaults to today), suggested_by, note. 3. Write the database a guide that says what each table is for, to look films up by title and year before adding them so there are no duplicates, to set rewatch from whether an earlier viewing exists, to take a film off the watchlist once I've watched it, and the queries for "what did I watch this month", "what do I rewatch most" and "what's oldest on my watchlist". From then on: when I say I watched something, log a viewing (adding the film if it's new) with my rating and anything I said about it. When I want to see something later, add it to the watchlist with who suggested it. 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 film diary in databasedmcp: every film I watch, when, my rating out of 5, whether it was a rewatch and where I saw it, plus a watchlist. When I tell you I watched something, log it.
Grok creates a database called films and its tables:
CREATE TABLE films (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
year INTEGER,
director TEXT,
added_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE viewings (
id INTEGER PRIMARY KEY,
film_id INTEGER NOT NULL REFERENCES films(id),
watched_on TEXT NOT NULL DEFAULT (date('now')),
rating REAL CHECK (rating BETWEEN 0.5 AND 5),
rewatch INTEGER NOT NULL DEFAULT 0 CHECK (rewatch IN (0, 1)),
where_watched TEXT,
notes TEXT
);
CREATE TABLE watchlist (
id INTEGER PRIMARY KEY,
film_id INTEGER NOT NULL UNIQUE REFERENCES films(id),
added_on TEXT NOT NULL DEFAULT (date('now')),
suggested_by TEXT,
note 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. Grok files things the same way next week as today, and so does any other assistant you connect.
# films: a film diary
- **films**: one row per film. Look it up by title (LIKE) and year before adding, to avoid duplicates.
- **viewings**: one row each time I watch a film. `rating` is 0.5 to 5 in half stars. Set `rewatch` to 1 when an earlier viewing exists.
- **watchlist**: films I want to see, with who suggested them. Delete the row once I've watched the film.
This month: `SELECT v.watched_on, f.title, v.rating, v.rewatch FROM viewings v JOIN films f ON f.id = v.film_id WHERE v.watched_on >= date('now', 'start of month') ORDER BY v.watched_on`
Rewatched most: `SELECT f.title, count(*) AS times, round(avg(v.rating), 1) AS avg_rating FROM viewings v JOIN films f ON f.id = v.film_id GROUP BY f.id HAVING times > 1 ORDER BY times DESC`
Oldest on the watchlist: `SELECT f.title, f.year, w.suggested_by, w.added_on FROM watchlist w JOIN films f ON f.id = w.film_id ORDER BY w.added_on LIMIT 5`
Use it
From here on you talk, and Grok writes the rows. Each request below is one statement:
Noor says I have to see Paris, Texas, the 1984 one. Put it on my watchlist.
INSERT INTO films (title, year) VALUES (?, ?) RETURNING id -- params: ["Paris, Texas",1984]
Grok adds it to the watchlist, with who suggested it.
INSERT INTO watchlist (film_id, suggested_by) VALUES (?, ?) -- params: [1,"Noor"]
Watched Paris, Texas tonight at the Rialto. 4.5 stars. That last scene through the glass.
INSERT INTO viewings (film_id, rating, where_watched, notes) VALUES (?, ?, ?, ?) -- params: [1,4.5,"Rialto cinema","The last scene through the glass. Slow in the best way."]
Grok takes it off the watchlist.
DELETE FROM watchlist WHERE film_id = ? -- params: [1]
Watched it again at home with Sam. Still a 4.5.
INSERT INTO viewings (film_id, rating, where_watched, rewatch) SELECT ?, ?, ?, EXISTS (SELECT 1 FROM viewings WHERE film_id = ?) -- params: [1,4.5,"Home, with Sam",1]
The rewatch flag comes from the diary itself: it's 1 because an earlier viewing exists.
Ask it questions
Once there's data, each report you'd pay for is a single query:
What did I watch this month, and what did I give it?
SELECT v.watched_on, f.title, v.rating, v.rewatch FROM viewings v JOIN films f ON f.id = v.film_id WHERE v.watched_on >= date('now', 'start of month') ORDER BY v.watched_on
Which films do I keep going back to?
SELECT f.title, count(*) AS times, round(avg(v.rating), 1) AS avg_rating FROM viewings v JOIN films f ON f.id = v.film_id GROUP BY f.id HAVING times > 1 ORDER BY times DESC
Pick me something from the watchlist. What's been waiting longest?
SELECT f.title, f.year, w.suggested_by, w.added_on FROM watchlist w JOIN films f ON f.id = w.film_id ORDER BY w.added_on LIMIT 5
You can also open the database on the website, page through its rows and run read-only SQL yourself.
What you give up
Letterboxd is also a place to read what friends and strangers thought, follow people whose taste you trust, and share lists. Here, the diary is yours. Anyone on your databasedmcp account can browse its rows on the website, but nobody likes or replies to a review.
Letterboxd knows every film's director, cast and runtime. This diary has no posters, cast pages or film database behind it. A film has whatever you or Grok write in its row, and there's no artwork at all. If browsing films and the community around them is half the fun, keep Letterboxd. Your private notes can live here.
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.