MCP server for searching, listing, and downloading 3D assets, HDRIs, and textures from Poly Haven
Three tools with clear verb-noun naming (search_, list_, download_) and reasonable descriptions (100-150 chars). All parameters have type definitions and descriptions. However, output schemas are not explicitly documented in the source code, only inferred from skill_success() calls. Parameter descriptions lack constraint details (e.g., valid asset_type enum values, resolution options). Error handling uses generic skill_exception() without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles.
Download a Poly Haven asset with specified file type, resolution, and optional dependencies
List available file variants and resolutions for a Poly Haven asset
Search Poly Haven assets by query, asset type, and limit
Output schemas not documented. Tool descriptions state what is returned (e.g., 'files', 'assets', 'asset_descriptor') but no formal schema is visible in source. LLMs cannot plan downstream tool calls without knowing response structure.
Parameter constraints not formalized. 'asset_type' description lists valid values as prose ('models', 'hdris', 'textures', 'all') but not as an enum. 'resolution' and 'file_type' similarly lack enum constraints, inviting hallucinated values.
No tool annotations. download_polyhaven_asset is destructive (WRITE risk, creates files) but lacks destructiveHint. search_polyhaven_assets and list_polyhaven_files are read-only but lack readOnlyHint. Agents cannot infer safety profile.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Error handling lacks recovery guidance. skill_exception() returns generic 'Failed to...' messages without actionable next steps. E.g., if variant not found, should suggest calling list_polyhaven_files() first.
Parameter descriptions lack format/range details. 'limit' has no bounds (baseline: 1 - 100 for search tools). 'output_dir' has no validation hint (must be writable, must exist?). 'resolution' lists examples but no exhaustive enum.