why can't a mosfet be directly driven by a microcontroller?

First, microcontroller I/O ports have limited load capacity, typically allowing currents around 10-20 mA. Therefore, they are generally not used to drive loads directly.

Let's briefly compare the differences in driving BJTs and MOSFETs.
Bipolar Junction Transistor (BJT):
BJTs are current-controlled devices. As long as the base-emitter voltage (Ube) exceeds the threshold voltage, typically 0.7V, the transistor will turn on. For BJTs, 3.3V is certainly greater than Ube, and the base current (Ib) can be calculated as \( Ib = \frac{(VO - 0.7V)}{R2} \). By connecting an appropriate resistor in series with the base, the BJT can operate in saturation. Microcontrollers usually aim for low power consumption, so the supply voltage is typically low, around 3.3V.
MOSFET:
MOSFETs are voltage-controlled devices. The gate-source voltage (Vgs) must exceed the threshold voltage to turn on, generally around 3-5V, with saturation drive voltage at 6-8V, which is higher than the 3.3V from the I/O port. If driven with 3.3V, the MOSFET may not turn on fully or could operate in a partially conducting state. In this state, the MOSFET has high internal resistance, which limits its ability to handle high current loads, leading to increased power dissipation and potential damage.
Therefore, it is usually preferable to control a BJT with the microcontroller, which in turn drives the MOSFET. Why use a BJT to drive a MOSFET? This is because BJTs have lower load capacity compared to MOSFETs, making them suitable for control applications. Can MOSFETs be driven directly? While it is possible for some low-power MOSFETs, it is generally not advisable for larger loads.