Skip to main content

An MCP server that turns your rough movie notes into polished reviews and tracks your watch history

Project description

letterbox-buddy

An MCP server for people who watch a lot of movies and can never be bothered to write a proper review right after.

The idea is simple: you just tell Claude (through Claude Desktop) something like "watched Fargo tonight, the dialogue was great but it dragged in the middle", and it turns that into an actual review, saves it with a rating, pulls the director/genre/year from TMDB automatically, and can spit out Letterboxd-ready text whenever you want it. It also remembers your whole watch history, so you can ask it things like "what have I watched by the Coen brothers" or "what should I watch next based on what I've been into lately."

This is a personal tool I built mainly to learn the MCP protocol by actually building something with it, not to ship a polished product. It works and I use it, but treat it like a working prototype, not battle-tested software.

What it actually does

  1. You write a rough note about a movie you watched, in your own words, whatever comes to mind.
  2. Claude (the one you're already chatting with in Claude Desktop) turns that into a polished review and asks you for a rating.
  3. The server looks the movie up on TMDB, grabs the director/genres/year, and stores everything in a local SQLite database.
  4. Later, you can ask for your watch history, stats on directors/genres you've been watching a lot, or recommendations based on your habits.
  5. When you're ready to log it on Letterboxd, ask for the formatted text and paste it in yourself.

No accounts, no cloud database, no automatic posting anywhere. It's just you, Claude, and a .sqlite3 file on your machine.

Tools

Tool What it does
search_movie Searches TMDB by title, returns candidates so Claude can ask "which one did you mean?" if there are several.
log_movie_note Saves a movie + your raw note + rating (0.5-5 stars, Letterboxd style). Fetches director/genres/year from TMDB the first time a movie shows up.
get_watch_history Lists what you've logged, filterable by director, genre, or date range.
get_director_stats How many times you've watched each director, average rating, which titles.
get_recommendations Returns raw data only - your most-watched director/genre plus movies of theirs you haven't logged yet. No opinions baked in, that's Claude's job.
generate_letterboxd_text Saves the polished review text and hands back a plain, copy-paste-ready version (no title/year/rating, Letterboxd shows those itself).

Setup

1. Get a TMDB API key

Free, just needs an account: https://www.themoviedb.org/settings/api

2. Clone and install

git clone https://github.com/alpondr/letterbox-buddy-mcp.git
cd letterbox-buddy-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

3. Add your API key

cp .env.example .env

Then open .env and paste your TMDB key in.

4. Set up the database (optional, happens automatically anyway)

The server creates the SQLite database on first run, at ~/.local/share/letterbox-buddy/db.sqlite3 by default. Want it somewhere else? Set LETTERBOX_DB_PATH in your .env.

If you want to run the migration manually for whatever reason:

python -m letterbox_buddy.db.migrate

5. Connect it to Claude Desktop

Add this to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "letterbox-buddy": {
      "command": "/absolute/path/to/letterbox-buddy-mcp/.venv/bin/python",
      "args": ["-m", "letterbox_buddy.server"]
    }
  }
}

Restart Claude Desktop (fully quit, not just close the window) and you should see the tools show up.

Once this is published to PyPI, this whole setup collapses into just running uvx letterbox-buddy - no clone, no venv, nothing to install by hand.

Notes on design decisions

A few choices here look "wrong" if you're used to bigger projects, so here's the reasoning behind them.

Why SQLite and no auth. Single machine, single user, nothing to authenticate against - Postgres and JWT would just be unused infrastructure here.

Why no separate LLM API. Claude is already right there doing the conversation, so a second LLM would just duplicate work for no reason. The server stays dumb on purpose - fetch/store/return data, all the thinking happens in the chat.

Why Letterboxd posting is copy-paste only. There's no public API for posting on someone's behalf, and I'd rather the last step stay a deliberate human action anyway.

Why "letterbox" not "letterboxd". Not affiliated with Letterboxd, didn't want the name to imply a partnership that doesn't exist.

Known limitations / what this isn't

  • Error handling is minimal - happy path only.
  • No TMDB rate-limit handling or caching.
  • Single machine, no sync between devices.
  • No automated tests, everything checked manually.
  • Single-user only, no accounts.
  • Not on PyPI yet, schema may still change.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

letterbox_buddy-0.1.0.tar.gz (8.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

letterbox_buddy-0.1.0-py3-none-any.whl (13.9 kB view details)

Uploaded Python 3

File details

Details for the file letterbox_buddy-0.1.0.tar.gz.

File metadata

  • Download URL: letterbox_buddy-0.1.0.tar.gz
  • Upload date:
  • Size: 8.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for letterbox_buddy-0.1.0.tar.gz
Algorithm Hash digest
SHA256 e6d88f720dcdbb1b1a9bab5c4346a3f160808c4965558987fd12eb324f5a78b8
MD5 a0a2764edb3e7f2289fdd50833fe6edc
BLAKE2b-256 b7480ba423c01d9e383d62f52c7e694c96f4373e1fa59a01358871d67c78050e

See more details on using hashes here.

File details

Details for the file letterbox_buddy-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for letterbox_buddy-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2ff41354ddff0e634bdc071a9ff0021c89bec82bb3c44e833cecc0aabc74fc40
MD5 ec54000c3a719a406bf0222fe5699442
BLAKE2b-256 0953588f02795b12b85e4556820d9b9b00765dd08541ef011f48bad879b4823c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page