If it's enough to fill the holes of some MultiPolygon m, you could do this:
no_holes = MultiPolygon(Polygon(p.exterior) for p in m)
If you also need to fill the holes that arise from touching Polygons inside your MultiPolygon, the following should work:
# Create a polygon `b` that contains `m`
xmin, ymin, xmax, ymax = m.bounds
b = Polygon([(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin)]).buffer(1, resolution=1)
# Take the complement of `m` in `b`, which is a MultiPolygon.
# Pick the outer polygon and take the complement in `b`.
no_holes = b - min(b - m, key=lambda p: p.bounds)