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

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

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)}"

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

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