A multi-tool MCP server suite for movie database search and web research, integrated with a Flask-based chat application for movie recommendations and information retrieval.
The server defines 4 tools with partial structure. All tools have descriptions and input schemas are visible, but quality is inconsistent. Tool names follow verb_noun convention (find_similar_movies, web_search, fetch_page_content, research), which is good. However, descriptions are brief and lack context about when to use each tool. Parameter descriptions exist but are minimal. No output schemas are documented. The tools are READ_ONLY, which is good for safety, but error handling guidance is absent. The server lacks tool annotations (readOnlyHint, etc.) despite having read-only semantics. No evidence of pagination support for list-like operations, though research and web_search both accept max_results parameters.
Fetch and parse the full text content of a web page using Jina Reader.
Return vector-search results for movies similar to the movie title (Query should be a title like: "Title (year)" the year is optional).
Search the web for a query and fetch the full content of top results, returning a consolidated research report.
Search the web using DuckDuckGo and return top results with titles, URLs, and snippets.
No output schemas documented. Tools return results but LLMs cannot plan downstream tool chains or know what fields to expect. For example, find_similar_movies returns 'vector-search results' but the structure is undefined.
Description for 'research' tool is vague (55 chars). States 'consolidated research report' but does not explain how it differs from web_search (same query, different aggregation?), when to choose one over the other, or what 'consolidated' means structurally.
Missing tool annotations. All 4 tools are read-only but do not declare readOnlyHint=true. Agents cannot distinguish read-only tools from destructive ones without explicit annotations.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | <=2025-11-25 | v2 |
Parameter descriptions lack constraint details. 'top_k' has no min/max bounds (could accept -1, 0, 1000?). 'max_results' similarly unconstrained. 'max_chars' description mentions -1 for no limit but does not specify practical bounds. LLMs cannot validate their own input.
find_similar_movies query parameter expects 'Title (year)' format but description does not clarify what happens if year is omitted, if year is required, or what happens on ambiguity (multiple movies same title, different years). LLM must guess.
No error handling guidance. Descriptions do not explain what happens on failure: 'Movie not found, try search_web()?' or 'URL fetch failed, is the page accessible?' Agents receive errors with no recovery path.
Tool composition gap: web_search and research both search the web. Descriptions do not explain when to use web_search (just titles/URLs?) vs research (fetch and consolidate?). LLMs will reason about both and waste tokens.
fetch_page_content parameter 'url' has no validation hints. What schemes are allowed (http/https only)? What happens if the URL is invalid or times out? Description silent.