Projectsummer
FreeNot checkedQuery, analyse and explore your own Letterboxd data — from a CLI or an LLM agent over MCP.
About
Query, analyse and explore your own Letterboxd data — from a CLI or an LLM agent over MCP.
README
Query, analyse and explore your own Letterboxd data — from a CLI, or from an LLM agent over MCP. Both paths call the same functions, so neither can drift from the other.
Status: complete and in use. Import, resolve, enrich with cast, crew and people, sync, lists, analysis and the MCP server all work end to end, covered by ~650 tests that never touch the network.
Install
Needs Python 3.11+.
git clone https://github.com/naveenpiedy/projectsummer
cd projectsummer
uv sync
That installs a summer command. Without uv,
pip install -e . does the same.
You also need a free TMDB API token — the long
Read Access Token, not the short v3 key — from
themoviedb.org/settings/api. Copy
.env.example to .env and put it there.
Getting started
Download your data from Letterboxd (Settings → Data → Export Your Data), then
point Project Summer at the .zip. There is no need to unzip it.
$ summer setup letterboxd-you-2026-09-16.zip
That runs the three stages in order: import the CSVs, look each film up to get its TMDB id, then fetch metadata, cast, crew and the people behind them. For a thousand-film library expect about forty minutes, most of it waiting on other people's servers, and only once. Interrupting is safe — every stage writes as it goes, and running it again carries on from where it stopped.
Then ask it things:
$ summer random-watchlist-pick --genre horror
Title The Stepford Wives
Year 1975
Runtime 117
Genres Thriller, Science Fiction, Horror
Directors Bryan Forbes
Candidates considered 15
$ summer query "SELECT year(watched_date) AS year, count(*) AS films
FROM diary_entries GROUP BY 1 ORDER BY 1"
summer sync keeps it current afterwards, reading your public RSS feed rather
than the website.
What it does
overview, describe-schema, query, ui |
See what is there, and ask it anything in SQL |
trends |
How your viewing changes, by year or by month |
taste |
What you rate highly, and where you differ from the crowd |
list-overlap |
How much of a list you have seen, or what two lists share |
rank |
Put films in order head to head, for fun |
list-builder |
Build a list from filters or SQL, importable into Letterboxd |
random-watchlist-pick |
Decide what to watch tonight |
ingest, resolve, enrich, sync, setup |
The pipeline |
Using the CLI has them in full, and the cookbook has queries worth stealing.
Using it from an AI assistant
summer-mcp serves your library to any MCP
client — Claude Desktop, Claude Code, and others — so you can ask about your
films in plain language:
uv sync --extra mcp
claude mcp add projectsummer -- uv run --directory /path/to/projectsummer --extra mcp summer-mcp
What an assistant can do is enforced by the server rather than left to the model: only the plugins marked for MCP exist at all, reading tools run on a connection DuckDB keeps read-only, no tool can reach your files through the database, and files are written only into the output folder. It also offers prompts for whole questions — a year in review, what to watch tonight, a taste profile. Using it from an AI assistant has the setup for other clients and the rules in full.
Configuration
Only TMDB_API_KEY is required — by enrich, and by sync when your feed
contains a film you have never logged before.
| Variable | Purpose |
|---|---|
TMDB_API_KEY |
TMDB API Read Access Token, for film metadata. |
LETTERBOXD_USERNAME |
Username for RSS polling. Defaults to your imported profile. |
LETTERBOXD_DB |
Database location. Defaults to a per-user data directory. |
LETTERBOXD_PLUGIN_PATH |
Extra directories to load plugins from. |
LETTERBOXD_MCP_READ_ONLY |
Set to true for an MCP server with no tool that changes anything. |
How it works
Every feature is one decorated function whose type hints are the schema. The CLI reads the signature to build a command; the MCP server reads the same signature to build a tool. Nothing is hand-written twice.
@plugin(category="discovery")
def random_watchlist_pick(genre: str | None = None) -> WatchlistPick:
"""Pick a random film from your watchlist.
Args:
genre: Only consider films in this genre. Case-insensitive.
"""
Drop a file of these into a directory, point LETTERBOXD_PLUGIN_PATH at it,
and your own features appear in the CLI beside the built-ins, under the same
rules. Writing a plugin is the full guide.
Documentation
- Using the CLI — sync, list building, exploring and analysing your library.
- Query cookbook — recipes for
query, every one of them run by the test suite. - Using it from an AI assistant — setting up the MCP server, the tools and prompts it offers, and the boundary it enforces.
- Writing a plugin — what the registry enforces, access and MCP exposure, progress, questions, errors and testing.
- Data model — the tables, and why they are shaped that way.
- Troubleshooting — a library that will not open, a missing TMDB token, empty list comparisons, an assistant that cannot see a tool.
Development
uv sync
uv run pytest
uv sync includes the development dependencies, FastMCP among them, so the
MCP server's tests run too.
Tests never touch the network: HTTP is faked at the session boundary, so the awkward cases — a redirect to a diary entry, a page with no ids, a timeout, TMDB rate limiting, an interruption mid-run — are exercised deliberately rather than waited for. The documentation is tested too: every query in the cookbook and every example in the plugin guide is run.
Contributing has the rules the code depends on, and what to run before opening a pull request. Security problems go through the private route in SECURITY.md rather than the issue tracker.
Roadmap
- DuckDB schema and connection layer
- Plugin registry with auto-discovery
- CLI generated from the registry
- CSV export ingestion, straight from the
.zip - Letterboxd URI → TMDB id resolution
- TMDB metadata enrichment
- RSS polling to keep the library current
- List builder: filters or SQL to a Letterboxd-importable list
- MCP server, generated from the same registry
- People and credits: gender, birthdays, roles across cast and crew
- Search-based tool discovery, and prompts, over MCP
- Trends by year and month
- Head-to-head ranking
- Taste: what you rate highly, against the crowd
- List overlap: how much of a list you have seen
Attribution and affiliation
Project Summer is an independent tool. It is not affiliated with, endorsed by, or connected to Letterboxd Limited. "Letterboxd" is used here only to describe what the tool reads.
This product uses the TMDB API but is not endorsed or certified by TMDB.
License
Install Projectsummer in Claude Desktop, Claude Code & Cursor
unyly install projectsummerInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add projectsummer -- uvx --from git+https://github.com/naveenpiedy/projectsummer projectsummerStep-by-step: how to install Projectsummer
FAQ
Is Projectsummer MCP free?
Yes, Projectsummer MCP is free — one-click install via Unyly at no cost.
Does Projectsummer need an API key?
No, Projectsummer runs without API keys or environment variables.
Is Projectsummer hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Projectsummer in Claude Desktop, Claude Code or Cursor?
Open Projectsummer on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
wenb1n-dev/SmartDB_MCP
A universal database MCP server supporting simultaneous connections to multiple databases. It provides tools for database operations, health analysis, SQL optim
by wenb1n-devPostgres Server
This server enables interaction with PostgreSQL databases through the Model Context Protocol, optimized for the AWS Bedrock AgentCore Runtime. It provides tools
by madhurprashPostgres
Query your database in natural language
by AnthropicPostgreSQL
Read-only database access with schema inspection.
by modelcontextprotocolRedis
Interact with Redis key-value stores.
by modelcontextprotocolSQLite
Database interaction and business intelligence capabilities.
by modelcontextprotocolmxcp
Open-source framework for building enterprise-grade MCP servers using just YAML, SQL, and Python, with built-in auth, monitoring, ETL and policy enforcement.
by raw-labstadas-github/a2asearch-mcp
MCP server to search 4,800+ MCP servers, AI agents, CLI tools and agent skills. Install: npx -y a2asearch-mcp. Ask Claude: "Find MCP servers for database access
by tadas-githubjulien040/anyquery
Query more than 40 apps with one binary using SQL. It can also connect to your PostgreSQL, MySQL, or SQLite compatible database. Local-first and private by desi
by julien040drakonkat/wizzy-mcp-tmdb
A MCP server for The Movie Database API that enables AI assistants to search and retrieve movie, TV show, and person information.
by drakonkatCompare Projectsummer with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All data MCPs
