A movie recommendation server that uses OpenAI to provide personalized film suggestions based on user preferences (genres, languages, mood, dislikes) combined with TMDB movie data.
CineMCP has 3 tools with basic structure but significant quality gaps. All tools have descriptions and input schemas, but descriptions are generic and lack strategic context for LLM decision-making. Tool naming is clear (verb_noun pattern: get_*, appropriate). However, parameter descriptions are sparse or missing context about constraints, valid ranges, and format requirements. No output schemas are documented. Error handling is absent, no guidance on what happens on API failure or fallback behavior. The tool descriptions mention fallback behavior but don't explain when/why it triggers or what it returns. Schema completeness varies: get_genres has empty input (correct), but get_movies_by_genres and get_movie_recommendation lack enum constraints on 'sort' and 'languages' parameters despite hardcoded valid values in code.
Fetches the list of available movie genres from TMDB or returns a fallback list if no API key is provided.
Gets a personalized movie recommendation from OpenAI based on user preferences (genres, dislikes, languages, mood, sort order, minimum year) and a list of movies matching those preferences.
Fetches movies filtered by genres, languages, sort order, and minimum release year from TMDB or returns fallback movies.
Missing enum constraints on constrained parameters. 'languages' accepts exactly [English, Spanish, French, German, Japanese, Chinese, Hindi, Turkish] but schema declares it as free-form array of strings. 'sort' defaults to 'popularity.desc' with other valid options in code (likely: rating.desc, release_date.desc) but no enum provided. 'mood' parameter on get_movie_recommendation lacks enum entirely.
No documented output schemas. All three tools lack return type documentation. LLM must infer: What fields are in a genre object? What's in a movie object? Is 'recommendation' a string or object? Without this, LLM cannot reliably extract IDs for chaining calls (e.g., after get_movies_by_genres returns movies, what field names allow downstream tools to use them?).
Parameter descriptions incomplete or missing. 'minYear' on get_movies_by_genres has no description at all. Parameter constraints (min/max year, array length limits, string length) are not documented. LLM cannot validate inputs before passing them.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
No error handling or recovery guidance. Descriptions mention 'fallback' behavior (returns fallback list if no API key) but don't explain: When does fallback trigger? What does it return? Is it identical structure? Can LLM retry with different params? What about TMDB API errors (rate limit, 404 genre, invalid language)? No guidance provided.
Tool composition not documented. get_movie_recommendation internally calls get_movies_by_genres (inferred from code/frontend) but this dependency is invisible to LLM. LLM might redundantly call get_movies_by_genres before or after recommendation. No 'WHEN to use which tool' guidance in descriptions.
Generic tool descriptions lack strategic context. 'Fetches the list of available movie genres...' and 'Fetches movies filtered by genres...' are procedural, not strategic. Descriptions should answer: WHEN should the LLM select this tool vs. alternatives? What user intent does it serve? Example: 'Use this after get_genres to explore movies in user-selected genres' provides decision context.