diff --git a/examples/background_training_example.py b/examples/background_training_example.py index 48089260..7e57656a 100644 --- a/examples/background_training_example.py +++ b/examples/background_training_example.py @@ -51,7 +51,7 @@ def main(): print("✅ Training started!") print(f" Job ID: {job_id}") print(f" Estimator: {job_result['estimator']}") - print(f" Dataset: {job_result['data_source']}") + print(f" Dataset: {job_result.get('data_source') or job_result.get('dataset', 'unknown')}") print(f" Horizon: {job_result['horizon']}") # Step 3: Monitor progress diff --git a/src/sktime_mcp/tools/fit_predict.py b/src/sktime_mcp/tools/fit_predict.py index ef8f1b46..3f3dc8fa 100644 --- a/src/sktime_mcp/tools/fit_predict.py +++ b/src/sktime_mcp/tools/fit_predict.py @@ -217,6 +217,14 @@ def fit_predict_async_tool( loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) + # If the event loop is not running (e.g. when called from a plain script + # rather than from within the MCP server), start it in a background thread + # so that run_coroutine_threadsafe has a live loop to schedule work on. + if not loop.is_running(): + import threading + thread = threading.Thread(target=loop.run_forever, daemon=True) + thread.start() + coro = executor.fit_predict_async( estimator_handle, dataset=dataset,