diff --git a/webservice/webservice.py b/webservice/webservice.py
index 8375f31c4960566f647113a7a8f3eb20de1ce742..de19d5a2545ce55ef540d4cb016e908e3c0fefd8 100644
--- a/webservice/webservice.py
+++ b/webservice/webservice.py
@@ -49,25 +49,31 @@ async def init_job_db(config):
     return conn
 
 
-async def init_md_client(config):
-    """ Initialize an MDC client connection
+async def init_md_client(config: Dict[str, Dict[str, str]]) -> MetadataClient:
+    """Initialize an MDC client connection.
 
     :param config: the configuration parsed from the webservice YAML config
     :return: an MDC client connection
     """
-    # FIXME: this blocks the even loop, should use asyncio.Task
-    # FIXME: calls to this coro should be shielded
     # TODO: could the client be a global? This would recuce passing it around
-    mdconf = config['metadata-client']
-    client_conn = MetadataClient(client_id=mdconf['user-id'],
-                                 client_secret=mdconf['user-secret'],
-                                 user_email=mdconf['user-email'],
-                                 token_url=mdconf['token-url'],
-                                 refresh_url=mdconf['refresh-url'],
-                                 auth_url=mdconf['auth-url'],
-                                 scope=mdconf['scope'],
-                                 base_api_url=mdconf['base-api-url'])
-    return client_conn
+
+    # During MetadataClient initialisation, this object requests authentication from MyMDC
+    # As such, it is needed to run the initialisation in a thread.
+    def _init_client():
+        mdconf = config['metadata-client']
+        client_conn = MetadataClient(client_id=mdconf['user-id'],
+                                     client_secret=mdconf['user-secret'],
+                                     user_email=mdconf['user-email'],
+                                     token_url=mdconf['token-url'],
+                                     refresh_url=mdconf['refresh-url'],
+                                     auth_url=mdconf['auth-url'],
+                                     scope=mdconf['scope'],
+                                     base_api_url=mdconf['base-api-url'])
+        return client_conn
+
+    loop = get_event_loop()
+    client = await shield(loop.run_in_executor(None, _init_client))
+    return client
 
 
 def init_config_repo(config):