Though I am not TinyMCE expert, looking into the unminified version of tinymce.min.js
I would say all plugins are loaded automatically (with themes and languages) if they follow the convention of storing them under plugins
directory:
/plugins/{plugin_name}/plugin.min.js
Here is the piece of code I think is responsible for loading:
function t() {
var e = m.ScriptLoader;
if (r.language && "en" != r.language && !r.language_url && (r.language_url = n.editorManager.baseURL + "/langs/" + r.language + ".js"), r.language_url && e.add(r.language_url), r.theme && "function" != typeof r.theme && "-" != r.theme.charAt(0) && !S.urls[r.theme]) {
var t = r.theme_url;
t = t ? n.documentBaseURI.toAbsolute(t) : "themes/" + r.theme + "/theme" + o + ".js", S.load(r.theme, t)
}
w.isArray(r.plugins) && (r.plugins = r.plugins.join(" ")), A(r.external_plugins, function(e, t) {
T.load(t, e), r.plugins += " " + t
}), A(r.plugins.split(/[ ,]/), function(e) {
if (e = L(e), e && !T.urls[e])
if ("-" == e.charAt(0)) {
e = e.substr(1, e.length);
var t = T.dependencies(e);
A(t, function(e) {
var t = {
prefix: "plugins/",
resource: e,
suffix: "/plugin" + o + ".js"
};
e = T.createUrl(t, e), T.load(e.resource, e)
})
} else T.load(e, {
prefix: "plugins/",
resource: e,
suffix: "/plugin" + o + ".js"
})
}), e.loadQueue(function() {
n.removed || n.init()
})
}