MCP server for Reality Defender AI-generated media detection
Reality Defender MCP server has solid foundational structure with 3 well-named, verb-leading tools and clear Pydantic-based schemas. However, descriptions lack specificity about side effects and error recovery, parameter descriptions are sparse, and output schemas are underdocumented. Tool names follow verb_noun convention excellently (reality_defender_validate_image_authenticity, reality_defender_generate_upload_url, reality_defender_get_upload_info), but descriptions are brief (34-56 chars) and lack actionable error guidance. Input schemas are well-typed with Field descriptions in Pydantic models, but response schemas are defined as Pydantic models without explicit documentation of what fields agents should expect. The server handles API key injection via X-Api-Key header correctly (pattern:secret-injection), but lacks per-tool scope declarations and error categorization.
Generate a URL for users to upload files for analysis
Get the details and metadata of an uploaded file after user upload
Request authenticity analysis on a file from Reality Defender
Tool descriptions lack side-effect declarations and error recovery guidance. 'Request authenticity analysis on a file from Reality Defender' does not indicate this is a stateful operation, whether results are cached, or what to do if analysis fails.
Output schema (RealityDefenderAnalysisResponse) is defined as a Pydantic model but not documented in tool descriptions. LLMs have no explicit knowledge of fields like 'status', 'score', 'models', 'file_id', they must infer from the model definition at runtime.
No error categorization (retryable vs user-fixable vs fatal). Error responses exist but do not guide the agent's next action. E.g., 'API key not provided' should suggest 'Set REALITY_DEFENDER_API_KEY environment variable or pass X-Api-Key header'.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Parameter 'expected_file_type' in validate_image_authenticity has no enum constraint. Description says 'video, image, audio or text' but allows any string, inviting hallucinated values like 'photo' or 'mov'. Should be an enum.
Mutual exclusivity of file_path and file_url is enforced in model_post_init but not documented in parameter descriptions. LLMs may try to pass both or neither without explicit constraint text in descriptions.
Tool descriptions do not indicate which operations are idempotent (safe to retry) vs non-idempotent (risk duplicate side effects). Agents need this knowledge to plan retries safely.
No tool-level permission/scope declarations. Tools do not declare what API capabilities they require (e.g., 'requires realitydefender:analyze, realitydefender:upload').