Understanding token scope difference

I narrowed it down to different parameters in call to …

JUPYTERHUB_API_TOKEN is generated inside User.spawn:

with this call:

api_token = self.new_api_token(note=note, roles=['server'])

Requesting the token through command line calls:

token = user.new_api_token(note="command-line generated")

As I can see, User.spawn calls has additional parameter roles=['server'], whereas another call does not. Indeed, removing roles=['server'] parameter and reinstalling JupyterHub yield two identical scopes.

I am still wondering, why this difference exists and how would I get this behavior without forking JupyterHub…