diff --git a/requirements-swh.txt b/requirements-swh.txt
--- a/requirements-swh.txt
+++ b/requirements-swh.txt
@@ -1,4 +1,4 @@
-swh.core[db,http] >= 0.0.60
+swh.core[db,http] >= 0.0.61
 swh.model >= 0.0.27
 swh.objstorage >= 0.0.17
 swh.scheduler >= 0.0.39
diff --git a/setup.py b/setup.py
old mode 100644
new mode 100755
--- a/setup.py
+++ b/setup.py
@@ -54,7 +54,9 @@
         [console_scripts]
         swh-vault=swh.vault.cli:main
         [swh.cli.subcommands]
-        vault=swh.vault.cli:cli
+        vault=swh.vault.cli:vault
+        [swh.workers]
+        vault.worker=swh.vault:register
     ''',
     classifiers=[
         "Programming Language :: Python :: 3",
diff --git a/swh/vault/__init__.py b/swh/vault/__init__.py
--- a/swh/vault/__init__.py
+++ b/swh/vault/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2018  The Software Heritage developers
+# Copyright (C) 2018-2019  The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU Affero General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -38,3 +38,7 @@
         raise ValueError('Unknown storage class `%s`' % cls)
     logger.debug('Instantiating %s with %s' % (Vault, args))
     return Vault(**args)
+
+
+def register():
+    return {'tasks': '%s.cooking_tasks' % __name__}
diff --git a/swh/vault/api/server.py b/swh/vault/api/server.py
--- a/swh/vault/api/server.py
+++ b/swh/vault/api/server.py
@@ -224,7 +224,9 @@
     return get_vault('local', args)
 
 
-def make_app_from_configfile(config_file=DEFAULT_CONFIG_PATH, **kwargs):
+def make_app_from_configfile(config_file=None, **kwargs):
+    if config_file is None:
+        config_file = DEFAULT_CONFIG_PATH
     config_file = os.environ.get('SWH_CONFIG_FILENAME', config_file)
     if os.path.isfile(config_file):
         cfg = config.read(config_file, DEFAULT_CONFIG)
diff --git a/swh/vault/cli.py b/swh/vault/cli.py
--- a/swh/vault/cli.py
+++ b/swh/vault/cli.py
@@ -1,15 +1,32 @@
+import os
 import logging
 
 import click
-import aiohttp
 
-from swh.vault.api.server import make_app_from_configfile
+from swh.core.config import SWH_CONFIG_DIRECTORIES, SWH_CONFIG_EXTENSIONS
+from swh.core.cli import CONTEXT_SETTINGS, AliasedGroup
 
+from swh.vault.api.server import make_app_from_configfile, DEFAULT_CONFIG_PATH
 
-CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
+CFG_HELP = """Software Heritage Vault RPC server.
 
+If the configuration file is not set, the default config file search will
+be used; first the SWH_CONFIG_FILENAME environment variable will be
+checked, then the config file will be searched in:
 
-@click.command(name='vault', context_settings=CONTEXT_SETTINGS)
+%s""" % ('\n\n'.join('- %s(%s)' % (
+    os.path.join(d, DEFAULT_CONFIG_PATH), '|'.join(SWH_CONFIG_EXTENSIONS))
+                     for d in SWH_CONFIG_DIRECTORIES))
+
+@click.group(name='vault', context_settings=CONTEXT_SETTINGS,
+             cls=AliasedGroup)
+@click.pass_context
+def vault(ctx):
+    '''Software Heritage Vault tools.'''
+    pass
+
+
+@vault.command(name='rpc-serve', help=CFG_HELP)
 @click.option('--config-file', '-C', default=None,
               type=click.Path(exists=True, dir_okay=False,),
               help="Configuration file.")
@@ -21,10 +38,8 @@
 @click.option('--debug/--no-debug', default=True,
               help="Indicates if the server should run in debug mode")
 @click.pass_context
-def cli(ctx, config_file, no_stdout, host, port, debug):
-    """Software Heritage Vault API server
-
-    """
+def serve(ctx, config_file, no_stdout, host, port, debug):
+    import aiohttp
     from swh.scheduler.celery_backend.config import setup_log_handler
 
     ctx.ensure_object(dict)
@@ -42,9 +57,12 @@
     aiohttp.web.run_app(app, host=host, port=int(port))
 
 
+vault.add_alias(serve, 'serve')
+
+
 def main():
     logging.basicConfig()
-    return cli(auto_envvar_prefix='SWH_VAULT')
+    return serve(auto_envvar_prefix='SWH_VAULT')
 
 
 if __name__ == '__main__':