2424
2525from holoviz_mcp .config import get_config
2626from holoviz_mcp .config import logger
27+ from holoviz_mcp .display_mcp .utils import find_extensions
28+ from holoviz_mcp .display_mcp .utils import find_requirements
29+ from holoviz_mcp .display_mcp .utils import validate_code
2730
2831
2932class Snippet (BaseModel ):
@@ -435,7 +438,7 @@ def create_visualization(
435438 description : str = "" ,
436439 readme : str = "" ,
437440 method : Literal ["jupyter" , "panel" ] = "jupyter" ,
438- ) -> dict [ str , str ] :
441+ ) -> Snippet :
439442 """Create a visualization request.
440443
441444 This is the core business logic for creating visualizations,
@@ -456,8 +459,8 @@ def create_visualization(
456459
457460 Returns
458461 -------
459- dict[str, str]
460- Dictionary with 'id', 'url', and 'created_at' keys
462+ Snippet
463+ The snippet created for the visualization request.
461464
462465 Raises
463466 ------
@@ -468,10 +471,6 @@ def create_visualization(
468471 Exception
469472 If database operation or other errors occur
470473 """
471- # Import here to avoid circular dependency
472- from holoviz_mcp .display_mcp .utils import find_extensions
473- from holoviz_mcp .display_mcp .utils import find_requirements
474-
475474 # Validate app is not empty
476475 if not app :
477476 raise ValueError ("App code is required" )
@@ -481,6 +480,8 @@ def create_visualization(
481480 # Validate syntax
482481 ast .parse (app ) # Raises SyntaxError if invalid
483482
483+ validation_result = validate_code (app )
484+
484485 # Infer requirements and extensions
485486 requirements = find_requirements (app )
486487 extensions = find_extensions (app ) if method == "jupyter" else []
@@ -494,16 +495,14 @@ def create_visualization(
494495 method = method ,
495496 requirements = requirements ,
496497 extensions = extensions ,
497- status = "pending" ,
498+ status = "success" if not validation_result else "error" ,
499+ error_message = validation_result if validation_result else None ,
498500 )
499501
500- self .create_snippet (snippet_obj )
502+ snippet_saved = self .create_snippet (snippet_obj )
501503
502504 # Return result
503- return {
504- "id" : snippet_obj .id ,
505- "created_at" : snippet_obj .created_at .isoformat (),
506- }
505+ return snippet_saved
507506
508507 @staticmethod
509508 def _row_to_snippet (row : dict ) -> Snippet :
0 commit comments