For Mine Blocks 1 it just keeps track of a slope variable and linearly traverses the whole world when it generates.
For Mine Blocks 2, each world genchunk (worth one biome of size, but encompasses half of two adjacent biomes) calculates a start and end height depending on the biomes (this is sort of like Perlin noise, sure). Here's what it looked like in its early stages:
But then, for the hills, it uses a stacking and removal technique I "invented" here: https://www.youtube.com/watch?v=e7Dwh9U71lM and first implemented it into this thing: https://youtu.be/3thB8uQ-H6I?t=21s
So I guess MB2 *effectively* uses one layer of Perlin noise and fills it in with a custom algorithm :D