letterboxd-mcp
Provides tools to retrieve a Letterboxd user's recent diary entries and written reviews, including film title, year, rating, rewatch status, watched date, review text, and TMDB ID, enabling LLMs to understand viewing history and suggest movies.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@letterboxd-mcpBased on my Letterboxd diary, recommend some movies I'd enjoy and explain why."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
letterboxd-mcp
An MCP server that feeds a Letterboxd user's viewing history to LLMs, so the model can read what you watched and suggest new movies you'll actually like.
Why RSS?
Letterboxd has no official public API. The per-user RSS feed (https://letterboxd.com/{username}/rss/) is the only sanctioned machine-readable surface, so this server parses it. No scraping, no login.
Note: the feed only holds the ~50 most recent diary entries.
Related MCP server: Filmladder MCP Server
Tools
Tool | Returns |
| Recent entries: film, year, rating, liked, rewatch, watched date, review text, TMDB id |
| Same, but only entries with written review text |
What it needs
Films must be in your diary for the feed to pick them up. Star-rating a film on its page doesn't count; it never reaches the feed. Use the Log/Review flow instead and set your rating there. Review text optional.
Written reviews still help, even a single line. A rating tells the model what you watched. A review tells it why you liked or hated it, and that second part is what makes its suggestions any good.
Setup
Requires uv.
uv sync
uv run python test_server.py # self-check against bundled fixtures
uv run python smoke.py <your_username> # live end-to-end checkMCP client registration
{
"mcpServers": {
"letterboxd": {
"command": "uv",
"args": ["run", "--directory", "/path/to/letterboxd-mcp", "python", "server.py"]
}
}
}Available Tools
2 toolsget_diaryA
Get a Letterboxd user's recent watched films: title, year, rating, liked, rewatch, watched date, review text, TMDB id. Returns ~50 most recent entries. Use to understand someone's taste before recommending movies.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must carry behavioral context. It makes clear this is a retrieval operation and adds a meaningful behavior: it returns about 50 most recent entries. It does not discuss auth, rate limits, or edge cases, but for a read-only lookup the behavior is reasonably disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the purpose and result fields, and finishes with a concrete use case. Each sentence earns its place, though the field list is a little dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single parameter, an output schema, and a clear description of returned fields and volume, this is largely complete for making the call. The main missing piece is guidance on the exact username format or pagination behavior, but these are minor for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only one parameter, username, with 0% description coverage. The description compensates by indicating this is a Letterboxd user whose recent watched diary will be returned. For a single simple string parameter, this fills the gap well enough.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action and resource: get a Letterboxd user's recent watched films, and it enumerates the returned fields. It is specific enough to understand what the tool does, though it does not explicitly differentiate itself from the sibling get_reviews.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear intended use: 'Use to understand someone's taste before recommending movies.' It does not mention when not to use it or explicitly compare with get_reviews, but the context is sufficient for most selection decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewsA
Get only the Letterboxd user's recent diary entries that have written review text (skips plain 'watched on' logs).
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the key filtering behavior—only entries with review text are returned—but does not mention authentication requirements, rate limits, pagination, or what 'recent' means. This gives the core behavior but leaves some operational details unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one focused sentence that front-loads the main filtering behavior and wastes no words. It captures the essential distinction in a compact, scannable way.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one well-named parameter and an output schema, the description is complete enough for selection and invocation. It conveys what the tool returns, what it excludes, and how it differs from its sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single username parameter with no description coverage, and the tool description does not mention username at all. However, username is self-explanatory, so the missing description is not a major obstacle. Still, the description adds no parameter-level nuance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it gets the user's diary entries that contain written review text and explicitly excludes plain 'watched on' logs. This clearly differentiates it from the sibling get_diary, so an agent can immediately understand the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the selection criteria clear: only diary entries with written review text, skipping plain logs. This implicitly tells the agent when to use get_reviews instead of the companion get_diary, though it does not explicitly name get_diary or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
get_diary - First observed
get_reviews
TDQS
Scored across 2 tools
get_diary and get_reviews both return diary entries, and get_diary already includes review text. The only distinction is that get_reviews filters out entries without text, which is a minor filtering difference rather than a clearly separate purpose. An agent could easily pick the wrong one or assume get_reviews returns something fundamentally different.
Both tools follow the exact verb_noun pattern (get_ + resource) with clear and consistent naming. get_diary and get_reviews are both prefixed with 'get' and use lowercase snake_case, maintaining a predictable and uniform style.
Two tools is very thin for a Letterboxd server, especially since the broader Letterboxd domain includes films, lists, ratings, watchlists, and user profiles. While the two tools cover a narrow use case, the count feels too low for a comprehensive MCP server.
The tool set covers diary entries and written reviews but lacks any other Letterboxd functionality such as searching films, fetching user profile data, adding to watchlists, or rating films. Even within the 'understanding taste' purpose, there is no way to query older snippets or paginate beyond the ~50 most recent entries, causing incomplete retrospective data.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
- AchriomOAuthcom.achriom
Media memory for AI agents and their humans: books, movies, music, shows, anime, podcasts, games.
Ask Claude, ChatGPT, or Grok about your ReelRifter watchlist, history, and viewing stats.
- RecaloOAuthcom.recaloapp
Your life in Recalo, from your AI: recipes, movies, books, places, people. Needs a Recalo account.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI assistants like Claude to interact with The Movie Database (TMDB) API, providing capabilities for searching movies, retrieving movie details, and generating customized movie reviews and recommendations.41343MIT
- FlicenseNot gradedqualityDmaintenanceProvides movie listings, showtimes, and personalized recommendations for Amsterdam cinemas by scraping filmladder.nl, with support for filtering by date, cinema, rating, and preferred showtimes.1-
- FlicenseNot gradedqualityDmaintenanceTracks movies, books, and TV shows with ratings and preferences, providing intelligent cross-media recommendations. Automatically fetches metadata from OMDB, Google Books, and TMDB to help manage watchlists and analyze viewing patterns.1-
- FlicenseNot gradedqualityCmaintenanceA comprehensive MCP server that enables users to interact with Letterboxd for searching films, viewing member data, and performing actions like rating or reviewing movies. It supports private data access and automated browser actions for managing watchlists, diaries, and custom lists.1-