search_sketchfab_models
Search and filter 3D models on Sketchfab based on query, categories, and downloadability using the MCP server BlenderMCP. Returns a formatted list of matching models.
Instructions
Search for models on Sketchfab with optional filtering.
Parameters:
query: Text to search for
categories: Optional comma-separated list of categories
count: Maximum number of results to return (default 20)
downloadable: Whether to include only downloadable models (default True)
Returns a formatted list of matching models.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| categories | No | ||
| count | No | ||
| downloadable | No | ||
| query | Yes |
Implementation Reference
- src/blender_mcp/server.py:577-653 (handler)The MCP tool handler for 'search_sketchfab_models'. It defines the tool using @mcp.tool() decorator, specifies input parameters (query, categories, count, downloadable), and implements the logic by forwarding the search parameters to the Blender addon via the socket connection using blender.send_command('search_sketchfab_models', params). Formats and returns the search results from Sketchfab.@mcp.tool() def search_sketchfab_models( ctx: Context, query: str, categories: str = None, count: int = 20, downloadable: bool = True ) -> str: """ Search for models on Sketchfab with optional filtering. Parameters: - query: Text to search for - categories: Optional comma-separated list of categories - count: Maximum number of results to return (default 20) - downloadable: Whether to include only downloadable models (default True) Returns a formatted list of matching models. """ try: blender = get_blender_connection() logger.info(f"Searching Sketchfab models with query: {query}, categories: {categories}, count: {count}, downloadable: {downloadable}") result = blender.send_command("search_sketchfab_models", { "query": query, "categories": categories, "count": count, "downloadable": downloadable }) if "error" in result: logger.error(f"Error from Sketchfab search: {result['error']}") return f"Error: {result['error']}" # Safely get results with fallbacks for None if result is None: logger.error("Received None result from Sketchfab search") return "Error: Received no response from Sketchfab search" # Format the results models = result.get("results", []) or [] if not models: return f"No models found matching '{query}'" formatted_output = f"Found {len(models)} models matching '{query}':\n\n" for model in models: if model is None: continue model_name = model.get("name", "Unnamed model") model_uid = model.get("uid", "Unknown ID") formatted_output += f"- {model_name} (UID: {model_uid})\n" # Get user info with safety checks user = model.get("user") or {} username = user.get("username", "Unknown author") if isinstance(user, dict) else "Unknown author" formatted_output += f" Author: {username}\n" # Get license info with safety checks license_data = model.get("license") or {} license_label = license_data.get("label", "Unknown") if isinstance(license_data, dict) else "Unknown" formatted_output += f" License: {license_label}\n" # Add face count and downloadable status face_count = model.get("faceCount", "Unknown") is_downloadable = "Yes" if model.get("isDownloadable") else "No" formatted_output += f" Face count: {face_count}\n" formatted_output += f" Downloadable: {is_downloadable}\n\n" return formatted_output except Exception as e: logger.error(f"Error searching Sketchfab models: {str(e)}") import traceback logger.error(traceback.format_exc()) return f"Error searching Sketchfab models: {str(e)}"