Skip to main content
Glama
lolpack

MCP Pyrefly Autotype Server

by lolpack

analyze_python_file

Analyze Python files to identify missing type annotations, helping improve code documentation and type safety.

Instructions

Analyze a Python file for missing type annotations

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
file_pathYesPath to the Python file to analyze
detailedNoInclude detailed analysis information

Implementation Reference

  • The handler logic within the call_tool function that processes calls to 'analyze_python_file', validates input, runs the analysis via PyreflyAnalyzer, and returns formatted results.
    if name == "analyze_python_file": file_path = arguments.get("file_path") detailed = arguments.get("detailed", False) if not file_path: raise ValueError("Missing file_path argument") if not os.path.exists(file_path): raise ValueError(f"File not found: {file_path}") analysis = await pyrefly_analyzer.analyze_file(file_path) if detailed: result_text = f"""Detailed Pyrefly Analysis for {file_path}: Functions needing types ({len(analysis.get('functions_needing_types', []))}): {chr(10).join(f" - {func}" for func in analysis.get('functions_needing_types', []))} Variables needing types ({len(analysis.get('variables_needing_types', []))}): {chr(10).join(f" - {var}" for var in analysis.get('variables_needing_types', []))} Suggested types: {chr(10).join(f" - {name}: {type_hint}" for name, type_hint in analysis.get('suggested_types', {}).items())} Pyrefly Output: {analysis.get('pyrefly_output', 'No output available')}""" else: result_text = f"""Pyrefly Analysis for {file_path}: Functions needing types: {len(analysis.get('functions_needing_types', []))} Variables needing types: {len(analysis.get('variables_needing_types', []))}""" return [types.TextContent(type="text", text=result_text)]
  • Schema definition for the 'analyze_python_file' tool, including input parameters file_path (required) and detailed (optional boolean).
    types.Tool( name="analyze_python_file", description="Analyze a Python file for missing type annotations", inputSchema={ "type": "object", "properties": { "file_path": { "type": "string", "description": "Path to the Python file to analyze" }, "detailed": { "type": "boolean", "description": "Include detailed analysis information", "default": False } }, "required": ["file_path"], }, ),
  • Registration of the 'analyze_python_file' tool via the MCP server.list_tools() handler, which lists all available tools including this one.
    @server.list_tools() async def handle_list_tools() -> list[types.Tool]: """ List available tools for Python type analysis and modification. """ return [ types.Tool( name="analyze_python_file", description="Analyze a Python file for missing type annotations", inputSchema={ "type": "object", "properties": { "file_path": { "type": "string", "description": "Path to the Python file to analyze" }, "detailed": { "type": "boolean", "description": "Include detailed analysis information", "default": False } }, "required": ["file_path"], }, ), types.Tool( name="add_types_to_file", description="Add type annotations to a Python file using Pyrefly", inputSchema={ "type": "object", "properties": { "file_path": { "type": "string", "description": "Path to the Python file to add types to" }, "backup": { "type": "boolean", "description": "Create a backup of the original file", "default": True }, "aggressive": { "type": "boolean", "description": "Use aggressive type inference", "default": False }, "safe_mode": { "type": "boolean", "description": "Use safe mode for type inference", "default": True } }, "required": ["file_path"], }, ), types.Tool( name="type_check_file", description="Run type checking on a Python file using Pyrefly", inputSchema={ "type": "object", "properties": { "file_path": { "type": "string", "description": "Path to the Python file to type check" } }, "required": ["file_path"], }, ), types.Tool( name="get_project_context", description="Get project-wide type information for better type inference", inputSchema={ "type": "object", "properties": { "project_path": { "type": "string", "description": "Path to the project directory" } }, "required": ["project_path"], }, ), ]
  • Helper method in PyreflyAnalyzer class that runs the pyrefly autotype command on the file, parses the output, and returns structured analysis data used by the tool handler.
    async def analyze_file(self, file_path: str) -> Dict[str, Any]: """Analyze a Python file using Pyrefly's analysis capabilities.""" try: # Use Pyrefly to analyze the file result = await self.run_pyrefly_command([ "uv", "run", "pyrefly", "autotype", file_path ]) if result["success"]: # Parse Pyrefly's output for analysis information analysis = self._parse_pyrefly_analysis(result["stdout"], file_path) return analysis else: return { "error": result.get("error", result.get("stderr", "Unknown error")), "file_path": file_path } except Exception as e: return {"error": str(e), "file_path": file_path}

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/lolpack/mcp-pyrefly-autotype'

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