Skip to main content
Glama

ida_add_function_comment

Add comments to functions in IDA databases to document analysis and improve code understanding during reverse engineering.

Instructions

Add a comment to a function in the IDA database

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
function_nameYes
commentYes
is_repeatableNo

Implementation Reference

  • Core IDA Pro implementation of the tool: validates inputs, finds function by name, calls idc.set_func_cmt(func_addr, comment, is_repeatable) to add the comment, refreshes views.
    def add_function_comment(self, function_name: str, comment: str, is_repeatable: bool) -> Dict[str, Any]:
        """Add a comment to a function"""
        return self._add_function_comment_internal(function_name, comment, is_repeatable)
        
    def _add_function_comment_internal(self, function_name: str, comment: str, is_repeatable: bool) -> Dict[str, Any]:
        """Internal implementation for add_function_comment without sync wrapper"""
        try:
            # Parameter validation
            if not function_name:
                return {"success": False, "message": "Function name cannot be empty"}
            if not comment:
                # Allow empty comment to clear the comment
                comment = ""
            
            # Get function address
            func_addr: int = ida_name.get_name_ea(0, function_name)
            if func_addr == idaapi.BADADDR:
                return {"success": False, "message": f"Function '{function_name}' not found"}
            
            # Check if it's a function
            func: Optional[ida_funcs.func_t] = ida_funcs.get_func(func_addr)
            if not func:
                return {"success": False, "message": f"'{function_name}' is not a function"}
            
            # Open pseudocode view
            ida_hexrays.open_pseudocode(func_addr, 0)
            
            # Add function comment
            # is_repeatable=True means show comment at all references to this function
            # is_repeatable=False means show comment only at function definition
            result: bool = idc.set_func_cmt(func_addr, comment, is_repeatable)
            
            if result:
                # Refresh view
                self._refresh_view_internal()
                comment_type: str = "repeatable" if is_repeatable else "regular"
                return {"success": True, "message": f"Added {comment_type} comment to function '{function_name}'"}
            else:
                return {"success": False, "message": f"Failed to add comment to function '{function_name}'"}
        
        except Exception as e:
            print(f"Error adding function comment: {str(e)}")
            traceback.print_exc()
            return {"success": False, "message": str(e)}
  • MCP server tool handler: calls IDAProFunctions.add_function_comment with parsed arguments and returns result as TextContent.
    case IDATools.ADD_FUNCTION_COMMENT:
        result: str = ida_functions.add_function_comment(
            arguments["function_name"], 
            arguments["comment"], 
            arguments.get("is_repeatable", False)
        )
        return [TextContent(
            type="text",
            text=result
        )]
  • Pydantic model defining input schema for the tool: function_name, comment, optional is_repeatable.
    class AddFunctionComment(BaseModel):
        function_name: str
        comment: str
        is_repeatable: bool = False  # Whether the comment should be repeatable
  • Tool registration in MCP server's list_tools(): name, description, inputSchema.
        name=IDATools.ADD_FUNCTION_COMMENT,
        description="Add a comment to a function in the IDA database",
        inputSchema=AddFunctionComment.schema(),
    ),
  • Proxy method in IDAProFunctions class that sends 'add_function_comment' request to IDA plugin via communicator and formats response.
    def add_function_comment(self, function_name: str, comment: str, is_repeatable: bool = False) -> str:
        """Add a comment to a function"""
        try:
            response: Dict[str, Any] = self.communicator.send_request(
                "add_function_comment", 
                {"function_name": function_name, "comment": comment, "is_repeatable": is_repeatable}
            )
            
            if "error" in response:
                return f"Error adding comment to function '{function_name}': {response['error']}"
            
            success: bool = response.get("success", False)
            message: str = response.get("message", "")
            
            if success:
                comment_type: str = "repeatable" if is_repeatable else "regular"
                return f"Successfully added {comment_type} comment to function '{function_name}': {message}"
            else:
                return f"Failed to add comment to function '{function_name}': {message}"
        except Exception as e:
            self.logger.error(f"Error adding function comment: {str(e)}", exc_info=True)
            return f"Error adding comment to function '{function_name}': {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/MxIris-Reverse-Engineering/ida-mcp-server'

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