Skip to main content
Glama
coderjun

Shaka Packager MCP Server

by coderjun

analyze_video

Analyze video files to extract technical metadata and streaming compatibility information using Shaka Packager.

Instructions

Analyze a video file using Shaka Packager.

Args:
    file_path: Path to the video file. Can be a local file path or a file:// URI from the filesystem MCP.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
file_pathYes

Implementation Reference

  • The core handler function for the 'analyze_video' MCP tool. Decorated with @mcp.tool() for automatic registration. Handles file path translation, resource reading for file:// URIs, executes Shaka Packager with --dump_stream_info, and formats detailed output or error summaries.
    @mcp.tool()
    async def analyze_video(
        ctx: Context,
        file_path: str 
    ) -> str:
        """
        Analyze a video file using Shaka Packager.
        
        Args:
            file_path: Path to the video file. Can be a local file path or a file:// URI from the filesystem MCP.
        """
        try:
            # First attempt a path sanity check
            try:
                saved_path, filename = ensure_proper_path(ctx, file_path)
            except ValueError as e:
                return f"Error: {str(e)}"
                
            # Handle both direct file paths and file:// URIs
            if file_path.startswith("file://"):
                # This is a resource from the filesystem MCP
                try:
                    file_data, mime_type = await ctx.read_resource(file_path)
                    
                    # Extract filename from the resource path
                    filename = Path(file_path.split("/")[-1]).name
                    
                    # Save the file
                    saved_path = save_uploaded_file(file_data, filename)
                    
                    ctx.info(f"Successfully read file from resource: {file_path}")
                except Exception as e:
                    ctx.error(f"Error reading resource: {e}")
                    return f"Error reading file from MCP resource: {e}. Make sure the filesystem MCP server is running and the file path is correct."
            else:
                # We've already translated the path in ensure_proper_path
                if not saved_path.exists() or not saved_path.is_file():
                    return f"Error: File not found at path: {file_path}. Please provide a valid file path or a file:// URI from the filesystem MCP."
                
                ctx.info(f"Using local file: {saved_path}")
            
            # Run the dump_stream_info command with proper input format
            cmd = [PACKAGER_PATH, "--dump_stream_info", f"input={str(saved_path)}"]
            
            # Log the original command for debugging
            ctx.info(f"Original command: {' '.join(cmd)}")
            
            # Translate any paths in command arguments
            translated_cmd = [cmd[0]] + translate_command_args(cmd[1:])
            
            ctx.info(f"Running command with translated paths: {' '.join(translated_cmd)}")
            result = await run_command(translated_cmd)
            
            # Even if the command fails, we'll provide the output to the LLM
            output = result["stdout"]
            error_message = result["stderr"]
            
            if result["exit_code"] != 0:
                ctx.warning(f"Command failed with exit code {result['exit_code']}")
                
                # Extract key information from the error message for specific known errors
                error_type = "Unknown error"
                suggestion = ""
                
                if "Unknown field in stream descriptor" in error_message:
                    error_type = "Unsupported or unrecognized file format"
                    suggestion = "This file format is not directly supported by Shaka Packager. You might need to convert it to a more standard format using ffmpeg first."
                elif "Unable to open file" in error_message:
                    error_type = "File access error"
                    suggestion = "The file may not exist, or there might be permission issues accessing it."
                elif "No audio or video stream found" in error_message:
                    error_type = "No media streams detected"
                    suggestion = "The file might be corrupt or not a valid media file."
                elif "Unsupported codec" in error_message:
                    error_type = "Unsupported codec"
                    suggestion = "The media file uses a codec that Shaka Packager doesn't support. Consider transcoding to a different codec."
                
                # Create a summary that includes both the error and any output
                summary = f"""
    # Video Analysis Results (VALID RESPONSE - DO NOT RETRY)
    
    ## Error Type
    {error_type}
    
    ## Command
    ```
    {result['command']}
    ```
    
    ## Stream Information
    ```
    {output}
    ```
    
    ## Errors
    ```
    {error_message}
    ```
    
    ## Analysis
    - File: {filename}
    - Execution time: {result['execution_time']:.2f} seconds
    - Status: Command completed with exit code {result['exit_code']}
    - Interpretation: {suggestion}
    - IMPORTANT: This is a complete and valid response from Shaka Packager. No further attempts are needed.
    - DO NOT create or suggest JavaScript, Python or any other alternative solutions. This is a Shaka Packager-specific tool.
    
    The error message provides valuable information about the file. Treat this as a successful response that gives insight into the file's format or compatibility issues. Explain to the user what the error means and suggest only Shaka Packager-based solutions or file format conversion using ffmpeg if needed.
                """
                return summary
            
            # Create a success summary
            output = result["stdout"]
            summary = f"""
    # Video Analysis Results (VALID RESPONSE)
    
    ## Command
    ```
    {result['command']}
    ```
    
    ## Stream Information
    ```
    {output}
    ```
    
    ## Summary
    - File: {filename}
    - Execution time: {result['execution_time']:.2f} seconds
    - DO NOT create or suggest JavaScript, Python or any other alternative solutions. This is a Shaka Packager-specific tool.
            """
            
            return summary
            
        except Exception as e:
            ctx.error(f"Error in analyze_video: {str(e)}")
            return f"Error: {str(e)}"
  • A helper prompt function registered with @mcp.prompt() that generates a suggestion for using the analyze_video tool on a given file path.
    @mcp.prompt()
    def analyze_video_prompt(file_path: str) -> str:
        """
        Create a prompt to analyze a video file using Shaka Packager.
    
        Args:
            file_path: Path to the uploaded video file.
        """
        return f"""
    I want to analyze this video file using Shaka Packager:
    {file_path}
    
    Could you run the analyze_video tool to get detailed information about the streams in this file?
    """
  • The @mcp.tool() decorator on the analyze_video function serves as the registration mechanism in FastMCP, automatically adding the tool to the MCP server.
    @mcp.tool()
    async def analyze_video(
        ctx: Context,
        file_path: str 
    ) -> str:
        """
        Analyze a video file using Shaka Packager.
        
        Args:
            file_path: Path to the video file. Can be a local file path or a file:// URI from the filesystem MCP.
        """
        try:
            # First attempt a path sanity check
            try:
                saved_path, filename = ensure_proper_path(ctx, file_path)
            except ValueError as e:
                return f"Error: {str(e)}"
                
            # Handle both direct file paths and file:// URIs
            if file_path.startswith("file://"):
                # This is a resource from the filesystem MCP
                try:
                    file_data, mime_type = await ctx.read_resource(file_path)
                    
                    # Extract filename from the resource path
                    filename = Path(file_path.split("/")[-1]).name
                    
                    # Save the file
                    saved_path = save_uploaded_file(file_data, filename)
                    
                    ctx.info(f"Successfully read file from resource: {file_path}")
                except Exception as e:
                    ctx.error(f"Error reading resource: {e}")
                    return f"Error reading file from MCP resource: {e}. Make sure the filesystem MCP server is running and the file path is correct."
            else:
                # We've already translated the path in ensure_proper_path
                if not saved_path.exists() or not saved_path.is_file():
                    return f"Error: File not found at path: {file_path}. Please provide a valid file path or a file:// URI from the filesystem MCP."
                
                ctx.info(f"Using local file: {saved_path}")
            
            # Run the dump_stream_info command with proper input format
            cmd = [PACKAGER_PATH, "--dump_stream_info", f"input={str(saved_path)}"]
            
            # Log the original command for debugging
            ctx.info(f"Original command: {' '.join(cmd)}")
            
            # Translate any paths in command arguments
            translated_cmd = [cmd[0]] + translate_command_args(cmd[1:])
            
            ctx.info(f"Running command with translated paths: {' '.join(translated_cmd)}")
            result = await run_command(translated_cmd)
            
            # Even if the command fails, we'll provide the output to the LLM
            output = result["stdout"]
            error_message = result["stderr"]
            
            if result["exit_code"] != 0:
                ctx.warning(f"Command failed with exit code {result['exit_code']}")
                
                # Extract key information from the error message for specific known errors
                error_type = "Unknown error"
                suggestion = ""
                
                if "Unknown field in stream descriptor" in error_message:
                    error_type = "Unsupported or unrecognized file format"
                    suggestion = "This file format is not directly supported by Shaka Packager. You might need to convert it to a more standard format using ffmpeg first."
                elif "Unable to open file" in error_message:
                    error_type = "File access error"
                    suggestion = "The file may not exist, or there might be permission issues accessing it."
                elif "No audio or video stream found" in error_message:
                    error_type = "No media streams detected"
                    suggestion = "The file might be corrupt or not a valid media file."
                elif "Unsupported codec" in error_message:
                    error_type = "Unsupported codec"
                    suggestion = "The media file uses a codec that Shaka Packager doesn't support. Consider transcoding to a different codec."
                
                # Create a summary that includes both the error and any output
                summary = f"""
    # Video Analysis Results (VALID RESPONSE - DO NOT RETRY)
    
    ## Error Type
    {error_type}
    
    ## Command
    ```
    {result['command']}
    ```
    
    ## Stream Information
    ```
    {output}
    ```
    
    ## Errors
    ```
    {error_message}
    ```
    
    ## Analysis
    - File: {filename}
    - Execution time: {result['execution_time']:.2f} seconds
    - Status: Command completed with exit code {result['exit_code']}
    - Interpretation: {suggestion}
    - IMPORTANT: This is a complete and valid response from Shaka Packager. No further attempts are needed.
    - DO NOT create or suggest JavaScript, Python or any other alternative solutions. This is a Shaka Packager-specific tool.
    
    The error message provides valuable information about the file. Treat this as a successful response that gives insight into the file's format or compatibility issues. Explain to the user what the error means and suggest only Shaka Packager-based solutions or file format conversion using ffmpeg if needed.
                """
                return summary
            
            # Create a success summary
            output = result["stdout"]
            summary = f"""
    # Video Analysis Results (VALID RESPONSE)
    
    ## Command
    ```
    {result['command']}
    ```
    
    ## Stream Information
    ```
    {output}
    ```
    
    ## Summary
    - File: {filename}
    - Execution time: {result['execution_time']:.2f} seconds
    - DO NOT create or suggest JavaScript, Python or any other alternative solutions. This is a Shaka Packager-specific tool.
            """
            
            return summary
            
        except Exception as e:
            ctx.error(f"Error in analyze_video: {str(e)}")
            return f"Error: {str(e)}"

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/coderjun/shaka-packager-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server