@mcp.tool()
def search_polyhaven_assets(
ctx: Context, asset_type: str = "all", categories: str = None
) -> str:
"""
Search for assets on Polyhaven with optional filtering.
Parameters:
- asset_type: Type of assets to search for (hdris, textures, models, all)
- categories: Optional comma-separated list of categories to filter by
Returns a list of matching assets with basic information.
"""
try:
blender = get_blender_connection()
result = blender.send_command(
"search_polyhaven_assets",
{"asset_type": asset_type, "categories": categories},
)
if "error" in result:
return f"Error: {result['error']}"
# Format the assets in a more readable way
assets = result["assets"]
total_count = result["total_count"]
returned_count = result["returned_count"]
formatted_output = f"Found {total_count} assets"
if categories:
formatted_output += f" in categories: {categories}"
formatted_output += f"\nShowing {returned_count} assets:\n\n"
# Sort assets by download count (popularity)
sorted_assets = sorted(
assets.items(), key=lambda x: x[1].get("download_count", 0), reverse=True
)
for asset_id, asset_data in sorted_assets:
formatted_output += (
f"- {asset_data.get('name', asset_id)} (ID: {asset_id})\n"
)
formatted_output += (
f" Type: {['HDRI', 'Texture', 'Model'][asset_data.get('type', 0)]}\n"
)
formatted_output += (
f" Categories: {', '.join(asset_data.get('categories', []))}\n"
)
formatted_output += (
f" Downloads: {asset_data.get('download_count', 'Unknown')}\n\n"
)
return formatted_output
except Exception as e:
logger.error(f"Error searching Polyhaven assets: {str(e)}")
return f"Error searching Polyhaven assets: {str(e)}"