3.2 UPDATE
As of version 3.2 from this commit onward methods have been added to clamp the window min and max sizes, which would be the best answer to this.
From mrtnfchs comment below, the methods are the following:
OS.min_window_size = Vector2(min_x, min_y)
OS.max_window_size = Vector2(max_x, max_y)
OLD EXAMPLE
In older versions a less than ideal way of accomplishing it would be to clamp the dimensions based on when the root viewport is being resized. (It is hacky and some flickering occurs.)
Relies on this method to manually update to the new sizes: http://docs.godotengine.org/en/latest/classes/class_os.html#class-os-set-window-size
var minX = 300
var minY = 300
func _ready():
get_node("/root").connect("size_changed", self, "resize")
func resize():
var currentSize = OS.get_window_size()
if(currentSize.x < minX):
OS.set_window_size(Vector2(minX, currentSize.y))
if(currentSize.y < minY):
OS.set_window_size(Vector2(currentSize.x, minY))