movie-rec
movie-rec
movie-rec는 FastMCP 서버로 구현된 영화 및 TV 추천 서비스입니다. SQLite에 관객별 증거(evidence)를 저장하고, MovieLens ALS 요인과 TMDB에서 후보를 검색하며, 추천 실행과 반응을 기록합니다.
아키텍처
이 저장소는 다음 부분으로 구성됩니다:
movie_rec/server.py: FastMCP 도구 및 선택적 GitHub OAuth 인증.movie_rec/service.py: MCP 표면이 공유하는 애플리케이션 수준 작업.movie_rec/store.py: SQLite 스키마, 불변 증거 이벤트, 파생 프로필, 추천 실행, 후보 노출.movie_rec/retrieval.py: 후보 조합, 필터링, 순위 지정, 증거 첨부.movie_rec/als.py및movie_rec/movielens.py: MovieLens ALS 훈련 산출물 및 관객별 폴드인(fold-in) 검색.movie_rec/tmdb.py,movie_rec/tmdb_recommendations.py및movie_rec/discover.py: TMDB 제목 해석, 추천 확장, 속성 기반 발견.scripts/: 오프라인 MovieLens 훈련, 픽스처 생성, 증거 형태 검사.tests/: 합성 데이터를 사용한 단위 및 통합 테스트.
이 서비스는 primary와 shared라는 두 개의 중립적 관객 네임스페이스를 인식합니다. 증거와 추천 기록은 관객별로 격리되어 유지됩니다.
Related MCP server: MediaSage
MCP 도구
서버는 다음 도구를 제공합니다:
resolve_title: TMDB를 통해 영화 또는 TV 제목을 해석하고 정식 레코드를 저장합니다.add_evidence: 불변 증거 이벤트를 추가합니다.get_evidence_context: 관객에 대한 현재 증거와 파생 프로필을 반환합니다.get_candidates: 사용 가능한 검색 레인에서 후보를 검색하고 필터링합니다.record_recommendations: 추천 실행에 대해 최종 선정 및 표시된 제목을 표시합니다.get_recommendation_history: 최근 추천 실행과 표시된 제목을 반환합니다.record_reaction: 관객 및 선택적 실행에 연결된 반응을 저장합니다.discover_titles: 미디어 유형, 장르, 연도, 언어, 키워드, 투표 수 및 정렬 기준으로 TMDB를 조회합니다.
로컬 설정
Python 3.11 이상과 uv가 필요합니다.
uv sync --all-extras
cp .env.example .env.env의 플레이스홀더 값을 교체하세요. 로컬 셸 사용의 경우, 서비스 시작 전에 파일을 로드하세요:
set -a
. ./.env
set +a
uv run movie-rec serve --transport stdio기본 데이터베이스 경로는 현재 사용자의 로컬 데이터 디렉터리 아래에 있습니다. MOVIE_REC_DB_PATH 및 MOVIE_REC_ARTIFACTS_PATH로 프로젝트 로컬 또는 외부 런타임 저장소를 선택할 수 있습니다.
Streamable HTTP 전송의 경우 바인드 포트를 제공하고 .env.example에 나열된 모든 GitHub OAuth 변수를 구성하세요:
uv run movie-rec serve --transport http --host 127.0.0.1 --port 8000HTTP 전송은 구성된 GitHub 로그인으로 접근을 제한합니다. 배포별 TLS 종료, 공용 라우팅 및 비밀 저장소는 이 저장소 범위를 벗어납니다.
외부 API
제목 해석, 메타데이터, 발견 및 TMDB 추천 확장에는 TMDB 접근이 필요합니다. MOVIE_REC_TMDB_ENV_FILE로 선택된 파일에 TMDB_READ_ACCESS_TOKEN 또는 TMDB_API_KEY 중 하나를 설정하세요.
GitHub OAuth는 HTTP 전송에만 필요합니다. GitHub OAuth 애플리케이션을 구성하고 MOVIE_REC_PUBLIC_URL, MOVIE_REC_GITHUB_CLIENT_ID, MOVIE_REC_GITHUB_CLIENT_SECRET, MOVIE_REC_OAUTH_SIGNING_KEY 및 MOVIE_REC_ALLOWED_GITHUB_LOGIN을 설정하세요. Stdio 전송에는 GitHub OAuth가 필요하지 않습니다.
MovieLens 훈련은 구성된 로컬 아카이브가 없을 때 체크섬이 고정된 MovieLens 32M 아카이브를 다운로드합니다. 다음 명령으로 훈련 및 매핑 산출물을 생성하세요:
uv run --extra offline python scripts/train_movielens.py train
uv run --extra offline python scripts/train_movielens.py map테스트
다음 명령으로 전체 테스트 스위트를 실행하세요:
uv run pytest결정적 ALS 폴드인 픽스처를 다시 생성하려면:
uv run --extra offline python scripts/generate_als_fixture.py생성기는 시드된 합성 요인과 implicit 라이브러리의 사용자 요인 재계산을 독립 참조 구현으로 사용합니다.
개인정보 보호
이 공개 저장소에는 개인 추천 증거, 선호 기록, 취향 파생 모델 행, 가족 맥락, 런타임 데이터베이스, 배포 비밀 또는 비공개 인프라 구성이 포함되어 있지 않습니다. 테스트와 커밋된 픽스처는 합성 또는 가상 데이터를 사용합니다. 런타임 증거, 데이터베이스, 생성된 모델 산출물, 내보내기, 백업 및 비밀 파일은 .gitignore에 의해 제외됩니다.
라이선스
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. LICENSE를 참조하세요.
Available Tools
8 toolsadd_evidenceC
Append one immutable evidence event and return its event ID.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| payload | Yes | ||
| audience | Yes | ||
| title_id | No | ||
| supersedes | No | ||
| exposure_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral trait: the event is 'immutable' (append-only), which informs the agent that changes cannot be undone. However, with no annotations provided, the description carries the full burden and does not mention side effects, permissions, rate limits, or response structure beyond returning an ID. This is partial transparency.
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 a single, focused sentence that front-loads the core action ('Append') and key attribute ('immutable'). Every word contributes value; there is no fluff or redundancy. It is an exemplary concise description.
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?
Despite having an output schema, the description fails to provide any context about the purpose of the evidence event, the meaning of parameters, or the relationship to sibling tools. With six parameters and zero parameter documentation, the agent lacks the information needed to construct valid calls. The description is far too sparse for the tool's complexity.
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?
Schema description coverage is 0%, and the description provides no explanation for any of the six parameters (kind, payload, audience, title_id, supersedes, exposure_id). The description mentions none of them, leaving the agent completely dependent on the raw schema, which lacks descriptions. This is a critical gap.
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 verb ('Append') and specific resource ('immutable evidence event') and explicitly mentions the return value (event ID). It is specific enough to distinguish from generic tools, though it does not reference sibling tools like record_reaction or record_recommendations, so differentiation is implicit.
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?
No guidance on when to use this tool versus its siblings. It does not mention conditions, prerequisites, or exclusions. The description merely states what it does, leaving the agent to infer when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_titlesA
Find titles by era, genre, rating, language, or keywords.
Use this when similarity search cannot express the user's request. Results can be passed to get_candidates as seed titles. Seen, rated, and not_interested titles are excluded unless allow_repeats applies; not_interested stays excluded. When sorting by vote_average.desc without min_vote_count, the default floor is 1000 votes for movies and 500 for TV. Calls are cheap and paging is normal.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| sort_by | No | popularity.desc | |
| year_to | No | ||
| audience | No | primary | |
| keywords | No | ||
| year_from | No | ||
| media_type | Yes | ||
| allow_repeats | No | ||
| exclude_genres | No | ||
| include_genres | No | ||
| min_vote_count | No | ||
| min_vote_average | No | ||
| original_language | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does so well. It discloses exclusion rules ('Seen, rated, and not_interested titles are excluded unless allow_repeats applies; not_interested stays excluded'), the default vote floor ('the default floor is 1000 votes for movies and 500 for TV'), and cost/paging behavior ('Calls are cheap and paging is normal'). No contradictions.
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?
Three sentences, no fluff. Purpose is front-loaded, then usage context, then edge-case behavior. Every sentence adds value and the description is compact for a 13-parameter tool.
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?
Given the tool's complexity (13 params, output schema present), the description covers the most important behavioral aspects: exclusion rules, default thresholds, and chaining to get_candidates. It does not explain how filters combine (AND/OR) or what happens with no results, but these are minor given the output schema and the simplicity of the tool's purpose.
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?
Schema coverage is 0%, so the description must compensate. It maps main filter categories (era→year_from/year_to, genre→include/exclude_genres, rating→min_vote_average, language→original_language, keywords→keywords) but does not explain several parameters (page, sort_by, audience, allow_repeats, min_vote_count). Those are self-explanatory from names, but the description adds only partial value over 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 states a clear verb ('Find') and resource ('titles') with a specific set of filters: era, genre, rating, language, keywords. It also distinguishes itself from similarity search by saying 'use this when similarity search cannot express the user's request,' which differentiates it from siblings like get_candidates and resolve_title.
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?
Explicitly provides when-to-use guidance: 'Use this when similarity search cannot express the user's request.' It also explains how results can feed into another tool: 'Results can be passed to get_candidates as seed titles.' This is clear and actionable for an agent choosing between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_candidatesC
Candidate calls are cheap. Read every candidate against the ask and the user's evidence, then requery with different seed_titles, genre filters, or exclude_title_ids if the pool is off target. Any returned title_id can be a seed; use resolve_title for seeds named in the user's words. Use exclude_seed_title_ids to avoid user-positive seeds used in an earlier call. Larger limits pull more seeds and deeper pages; min_vote_average and min_vote_count adjust the score floors. Property arguments add a discover route to the same pool. On general calls, ALS candidates come from the user's overall movie taste vector, not from one seed. Set allow_repeats only to include titles the user has seen or rated; titles marked not_interested remain excluded. Use detail="full" only when the complete metadata and evidence records are needed. Record only final picks.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| detail | No | compact | |
| context | No | ||
| sort_by | No | ||
| year_to | No | ||
| audience | Yes | ||
| keywords | No | ||
| year_from | No | ||
| media_type | No | ||
| seed_titles | No | ||
| allow_repeats | No | ||
| exclude_genres | No | ||
| include_genres | No | ||
| min_vote_count | No | ||
| min_vote_average | No | ||
| exclude_title_ids | No | ||
| original_language | No | ||
| exclude_seed_title_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose several behavioral traits: calls are cheap, ALS candidates derive from the user's overall taste vector rather than a single seed, repeats default off, and not_interested titles stay excluded. But it omits the return format, pagination semantics, and any auth or rate-limit context. Decent disclosure, incomplete given zero annotation coverage.
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 a dense, unstructured block of roughly 130 words with no front-loading of purpose. It jumps erratically between requery strategy, seed resolution, limit behavior, score floors, the property route, ALS internals, allow_repeats, and detail level. Sentences are stacked without separation into a clear spec, making it hard to consume.
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?
Despite the length, the description is not complete for an 18-parameter tool with zero schema coverage and no annotations. The required 'audience' field is left unexplained, several filter parameters are ignored, and the relationship between parameters is implied rather than specified. The presence of an output schema partially offsets the need to document return values, but the parameter coverage gap is too large.
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?
Schema description coverage is 0%, so the description must explain the semantics of 18 parameters. It covers seed_titles, genre filters, exclude_title_ids, exclude_seed_title_ids, limit, min_vote_average, min_vote_count, allow_repeats, and detail — roughly half. The required parameter audience is never explained, and context, sort_by, year_to/year_from, media_type, keywords, and original_language are entirely undocumented. This is a major gap for a fully-unannotated 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 core function — that this tool returns candidate title IDs/records for the current ask — is never plainly stated. It is only inferred from phrases like 'Candidate calls are cheap' and 'Any returned title_id can be a seed.' The description is a wall of operational advice rather than a clear verb+resource specification, and it never distinguishes its output from the discover_titles sibling beyond a cryptic 'Property arguments add a discover route to the same pool.'
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?
There is substantial tactical guidance: when to requery with new seeds/genres/exclude_title_ids, to use resolve_title for user-named seeds, to use exclude_seed_title_ids for earlier positive seeds, and to set allow_repeats. However, this is intra-tool parameter guidance, not tool-selection guidance — it never explicitly says when to choose get_candidates versus discover_titles or the evidence tools. The guidance is present but muddled and scattered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_evidence_contextC
Return the audience's latest profile and relevant immutable evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| audience | Yes | ||
| title_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The word 'Return' implies a read-only operation, but it does not disclose any constraints, side effects, authentication requirements, or limitations. It also doesn't explain what 'immutable evidence' entails or how it might affect the response. This is a significant gap for a tool with no annotation support.
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 a single sentence with no fluff or repetition. It is front-loaded with the action and resource. While it is appropriately short, it sacrifices essential detail, but for conciseness alone it earns a solid score.
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?
The tool has four parameters, one required, and an output schema, yet the description explains none of them. The agent has to infer that 'audience' maps to the required parameter, and the purpose of limit, query, and title_ids is completely opaque. Given the schema coverage is 0%, the description is far from complete enough for correct invocation.
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?
Schema description coverage is 0%, meaning the description mentions none of the four parameters. Baseline for a tool with parameters and low coverage requires the description to compensate, but here it fails entirely. The agent must rely solely on the schema, which provides basic types and defaults but no conceptual explanation of how each parameter (audience, limit, query, title_ids) influences the result.
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 specific verb ('Return') and a specific resource ('the audience's latest profile and relevant immutable evidence'). It clearly indicates the tool retrieves data, distinguishing it from write-oriented siblings like add_evidence. However, it doesn't explicitly differentiate from other read tools like get_candidates or get_recommendation_history, so it stops short of a 5.
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 provides no guidance on when to use this tool versus the sibling tools. It doesn't mention any conditions, alternatives, or exclusions. The agent is left to infer usage solely from the tool's name and description, which is insufficient given the range of sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendation_historyC
Return recent runs; shortlisted explanations are null by construction.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| audience | 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 must disclose behavioral traits. It mentions that 'shortlisted explanations are null by construction,' which is a useful output detail, but it does not disclose read-only nature, whether it has side effects, authentication needs, or rate limits. This is insufficient for a tool with zero annotation support.
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 a single, short sentence, which is appropriately sized for a simple tool. It is front-loaded with the core purpose. However, it could be more structured by including explicit parameter info, but the brevity itself is not a problem.
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?
The tool has two parameters and a required one, but missing parameter explanations and usage guidance make it incomplete. The output schema exists but is not described in the description; still, the description should at least mention what 'runs' contain. Overall, an agent cannot use this tool correctly without additional context.
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 input schema has 0% description coverage, meaning the schema provides no prose for parameters. The description does not explain the meaning of 'audience' or 'limit', nor does it clarify the enum values 'primary' and 'shared.' The agent is left to guess the semantics.
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 uses a clear verb ('Return') and a resource ('recent runs'), but the noun 'runs' is ambiguous without context. It is likely recommendation runs given the siblings, but this is not stated. It does distinguish itself from siblings by focusing on history, but not explicitly.
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?
No guidance is provided on when to use this tool relative to alternatives. There is no mention of which sibling would be appropriate instead, nor any condition for using this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_reactionC
Record a reaction and optionally link it to a recommendation run.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| run_id | No | ||
| audience | Yes | ||
| reaction | Yes | ||
| title_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It mentions that a reaction can optionally be linked to a run, but does not state whether this is a write operation, whether it is idempotent, what errors may occur, or the format of the response. This is a minimal disclosure insufficient for safe invocation.
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 a single, clear sentence with no wasted words. It front-loads the primary purpose and quickly mentions the optional linking. It is appropriately concise for the information it conveys, though it is so short that it sacrifices depth.
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 five parameters, no annotations, and zero schema description coverage, the description is far too sparse. It does not explain what constitutes a 'reaction', how to specify an audience, or the meaning of 'run_id' and 'note'. An agent would need to infer most usage context from parameter names alone, making correct invocation risky.
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?
Schema description coverage is 0%, so the description must compensate by explaining parameter meanings. It does not mention any of the five parameters (audience, title_id, reaction, run_id, note) or their roles. Even the enum values for 'reaction' and 'audience' are left unexplained, providing no added value over the raw 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 clearly states the action ('Record a reaction') and the optional extension ('link it to a recommendation run'). It is specific and distinct from siblings like 'record_recommendations' and 'get_recommendation_history'. The purpose is unambiguous and not a tautology.
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 provides no guidance on when to use this tool versus alternatives. It only mentions the optional linking to a recommendation run, implying a use case but without stating prerequisites, exclusions, or comparisons to sibling tools. An agent cannot determine when to choose this over other recording/history tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_recommendationsB
Record only final picks. Candidate calls are cheap: read every candidate against the ask and the user's evidence, and requery with different seed_titles, genre filters, or exclude_title_ids when needed. Any returned title_id can be a seed, and resolve_title turns titles from the user's words into seed IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| picks | Yes | ||
| run_id | Yes | ||
| shortlisted | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It only says 'record' with no mention of side effects, overwrites, idempotency, permissions, or constraints. It does not describe what happens to the data (e.g., whether it replaces existing recommendations under a run_id). For a write tool, this is a significant transparency gap.
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 main purpose is front-loaded in a concise first sentence. The second sentence is longer but still focused on workflow guidance. It could be tighter—the detail about requerying is somewhat tangential—but overall it is efficient and not padded.
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?
The tool has 3 required parameters, no annotations, and an output schema that is not described. The description lacks any explanation of parameter types or meaning, expected return values, or prerequisites. While it offers useful surrounding workflow context (cheap candidate calls, resolve_title), it does not provide enough for a correct invocation, especially given the schema coverage is 0%.
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?
Schema coverage is 0%, so the description must explain 'run_id', 'picks', and 'shortlisted'. It never mentions any of them. The terms 'seed_titles', 'genre filters', and 'exclude_title_ids' appear but belong to other tools, not this one. An agent would have no idea what to pass for 'picks' (array of objects) or 'shortlisted' (array of integers) from the description alone.
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 opening phrase 'Record only final picks' states a specific verb and resource, and explicitly contrasts with candidate exploration ('Candidate calls are cheap'), distinguishing this tool from siblings like get_candidates and discover_titles. The agent can immediately understand this is for persisting the final selection, not for searching.
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 implies usage: this is for final picks, not candidate generation. It advises that candidate calls are cheap and suggests requerying with different seeds/filters, and mentions resolve_title for converting user words to seed IDs. However, it does not explicitly list when *not* to use this tool or name alternative tools as the preferred choice for exploration, leaving some inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_titleC
Search TMDB, store canonical matches, and return their local title IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| query | Yes | ||
| media_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are completely absent, so the description must disclose behavioral traits. It mentions storing canonical matches, implying a write side-effect, but does not explain whether the operation is idempotent, whether it overwrites existing records, what authentication or permissions are required, or any rate limits. This is minimal disclosure for a mutation tool.
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 a single short sentence, but it is under-specified rather than concise. It omits critical details (parameter usage, when to use, side effects) that a longer, better-structured description would include. It is not front-loaded with the most decision-relevant information.
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?
Given the tool performs a non-trivial operation (search, persist, return IDs) and has sibling tools with overlapping purposes, the description is incomplete. It does not explain what 'canonical matches' means, nor does it clarify when to use this over get_candidates or discover_titles. The existence of an output schema covers return format, but that does not compensate for the missing usage and parameter guidance.
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?
Schema description coverage is 0% — the schema provides no descriptions for query, year, or media_type. The tool description does not mention these parameters at all, so it offers no compensation for the coverage gap. An agent has no idea how 'query' is matched, whether 'year' is a filter or a hint, or what values media_type can take.
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: search TMDB, store canonical matches, and return local title IDs. It identifies the resource (TMDB) and the deliverable (local title IDs), which is specific and not a tautology. However, it does not explicitly differentiate this from sibling tools like get_candidates or discover_titles, so it loses a point.
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?
There is no guidance on when to use this tool versus alternatives. It does not mention any conditions, prerequisites (e.g., whether a pre-existing title record is needed), or when not to use it. An agent would have to infer usage from the name and description alone.
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. Dates show when Glama detected each change.
8 tool updates
v0.1.0- First observed
add_evidence - First observed
discover_titles - First observed
get_candidates - First observed
get_evidence_context - First observed
get_recommendation_history - First observed
record_reaction - First observed
record_recommendations - First observed
resolve_title
TDQS
Each tool has a clearly distinct purpose: resolving titles, adding evidence, retrieving context, generating candidates, recording recommendations, fetching history, recording reactions, and discovering titles. No two tools appear to overlap in functionality, and the descriptions provide strong differentiation.
All tool names follow a consistent verb_noun pattern: resolve_title, add_evidence, get_evidence_context, get_candidates, record_recommendations, get_recommendation_history, record_reaction, discover_titles. The pattern is systematic and predictable, making tool selection straightforward.
With 8 tools, the server is well-scoped for its purpose of movie recommendation and user feedback. Each tool addresses a distinct part of the workflow without redundancy, and the count is within the typical well-scoped range (3-15).
The tool set covers the core lifecycle: resolving user inputs, adding evidence, generating candidates, recording recommendations, retrieving history, and capturing reactions. Minor gaps exist (e.g., no explicit delete/update for evidence or reactions), but these are not critical for the main recommendation flow and can be worked around.
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
Movies and TV show data — search, details, ratings, and cast from iTunes and TVmaze APIs
Recommendations, search, catalogue, analytics, and platform admin tools for NeuronSearchLab
- AchriomOAuthcom.achriom
Media memory for AI agents and their humans: books, movies, music, shows, anime, podcasts, games.
Machine-readable entity discovery with provenance, trust and verified source evidence.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceIntegrates with The Movie Database (TMDB) API to provide movie information, search capabilities, and recommendations.1975MIT
- 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-
- AlicenseAqualityCmaintenanceProvides access to The Movie Database (TMDB) API, enabling users to search for movies, TV shows, and people, get detailed information, discover content with advanced filters, and retrieve recommendations.13315MIT
- AlicenseNot gradedqualityDmaintenanceIntegrates with The Movie Database (TMDB) API to provide movie information, search capabilities, and recommendations.21MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ppikkuaho/movie-rec'
If you have feedback or need assistance with the MCP directory API, please join our Discord server