MagnusS is probably right. A Shader might be a good idea.
Anyway:
You can apply and change materials at different places.
First, you got the mesh. This will often be of type "ArrayMesh":
https://docs.godotengine.org/en/latest/classes/class_arraymesh.html?highlight=arraymesh
If you've got a MeshInstance Node then you'll get the mesh via its mesh
property.
Anyway, changing/setting the Mesh material will change the material of all occurances of this mesh at the same time.
In the editor you'll see these materials if you click on the Mesh inside the Meshinstance. There'll be Secions "Surface 1" and so on.
Then you got get_surface_material_count ()
to iterate the materials and get_surface_material ( int surface )
. These materials are not always defined. In the editor you'll see these materials under "Material" (and then an index number starting at 0). If this material is defined (you can do that in the editor) then it will override the mesh material. You should be able to use `getsurfacematerial(index)' and then directly change the albedo.
Provided you've first assigned materials to the MeshInstance, the Tween could look somewhat like this: (I'm using your "mesh" for the MeshInstance node, a bit misleading.)
(Edited!)
for i in range(mesh.get_surface_material_count()):
var mat = mesh.get_surface_material(i)
if mat != null:
tween.interpolate_property(mesh, "material/"+str(i)+"/albedo_color",
mat.albedo_color, Color(100,100,100), 2,
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
tween.start()
else:
print("Error: Material "+str(i)+" of mesh "+mesh.get_name()+" is null!")
(untested)