Model Context Protocol (MCP) server for Letterboxd, providing film metadata and account actions via scraping and Playwright.
The Letterboxd MCP server defines 12 tools with consistent naming patterns (verb_noun: search, get_*) and clear descriptions (avg ~80 chars, all >20 chars). All tools have documented input schemas with proper JSON Schema structure (type, properties, additionalProperties: false, required arrays). Parameter descriptions are present and explain the semantic meaning. However, there are meaningful gaps: (1) Output schemas are NOT documented, the server does not declare what fields tools return, forcing LLMs to reason about response structure; (2) Error handling is implicit (timeout wrapper exists, but no tool-level error categorization, recovery guidance, or user-fixable vs retryable classification); (3) Parameters lack constraints (enums, min/max bounds) in many cases, e.g., 'limit' and 'maxPages' accept unbounded integers; (4) Pagination is well-designed (nextCursor, fetchAll, maxPages, maxItems) but response structure is assumed, not documented. Tool definitions are directly visible in index.js (lines with 'name', 'description', 'inputSchema'), so inference risk is minimal. Overall composition is strong, tools are single-responsibility and chain-friendly (username resolution, film slugs). This is a solid B- implementation: good naming, adequate descriptions, proper schema structure, but missing output documentation and error guidance.
Get detailed film metadata by film slug.
Get list metadata and entries by owner username and list slug.
Get a member profile summary and profile stats.
Get diary entries for a member (supports automatic pagination).
Get films watched by a member (supports automatic pagination).
Get a member list directory (supports automatic pagination).
Get favorite/pinned films shown on a member profile.
No output schemas documented. LLMs cannot infer the structure of responses (field names, types, required vs optional). Forces LLMs to reason about JSON structure without guidance, increasing hallucination risk and token waste.
Numeric parameters (limit, maxPages, maxItems) lack min/max bounds in schema. 'limit' and 'maxPages' are unbounded integers, LLMs can pass absurd values (1 million pages, limit=999999) that break pagination logic or consume excessive resources.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Get films rated by a member (supports automatic pagination).
Get review summaries for a member (supports automatic pagination).
Get a member watchlist (supports automatic pagination).
Get full review details by username + film slug (+ optional review id).
Search Letterboxd by query. Supports films, lists, members, and reviews.
No error handling guidance. While timeout wrappers exist (TOOL_TIMEOUT_MS), tools do not document error categories, recovery paths, or what the LLM should do if a lookup fails. E.g., if get_member(username='invalid') returns 404, the response does not suggest alternatives or recovery steps.
Parameter 'username' has unclear resolution logic. Description says 'Letterboxd username, profile URL, or "me"' but does not explain what 'me' resolves to (requires LETTERBOXD_USERNAME env var or ensures login). If login fails, error message is clear but this dependency is non-obvious to LLMs planning multi-step sequences.
Pagination implementation is sophisticated (nextCursor, fetchAll, maxPages, maxItems) but the response structure is not documented. Tools return {items, meta} but meta structure (count, pages, fetchAll, nextCursor conditionally) is inferred by LLMs, not declared. If nextCursor is omitted when no more pages exist, this conditional behavior should be explicit.
MAX_RESPONSE_BYTES truncation behavior (defined in index.js) is not surfaced in tool descriptions or error messages. If an LLM's query returns a response exceeding LETTERBOXD_MAX_RESPONSE_BYTES, the truncated response includes a warning but the tool description does not mention this risk. LLMs may not realize responses are truncated.