@@ -145,6 +145,19 @@ def known_sites() -> List[str]:
145145 return get_registry_sites () or DEFAULT_SITES
146146
147147
148+ def _missing_db_error (db : Any , name : str ) -> Optional [ErrorResult ]:
149+ """Return an error when the database itself is absent or unreachable, so a
150+ missing database is not reported as an unknown key."""
151+ if db is not None and db .check ():
152+ return None
153+ return ErrorResult (
154+ error = (
155+ f"database '{ name } ' does not exist or is unreachable in this "
156+ "environment; the data is unavailable, do not retry with other arguments"
157+ )
158+ )
159+
160+
148161def _is_known_site (site_name : str ) -> bool :
149162 return site_name in known_sites ()
150163
@@ -224,7 +237,7 @@ def asset_ids(site_name: str) -> Union[AssetsResult, ErrorResult]:
224237 )
225238 except Exception as e :
226239 logger .error (f"asset_ids failed: { e } " )
227- return ErrorResult (error = str (e ))
240+ return _missing_db_error ( asset_db , ASSET_DBNAME ) or ErrorResult (error = str (e ))
228241
229242
230243@mcp .tool (title = "Get Asset Detail" )
@@ -265,7 +278,9 @@ def asset_detail(site_name: str, asset_id: str) -> Union[AssetDetail, ErrorResul
265278 )
266279 docs = res .get ("docs" , [])
267280 if not docs :
268- return ErrorResult (error = f"unknown asset_id { asset_id } at site { site_name } " )
281+ return _missing_db_error (asset_db , ASSET_DBNAME ) or ErrorResult (
282+ error = f"unknown asset_id { asset_id } at site { site_name } "
283+ )
269284
270285 doc = docs [0 ]
271286 sensors = list (doc .get ("sensors" ) or [])
@@ -295,7 +310,7 @@ def asset_detail(site_name: str, asset_id: str) -> Union[AssetDetail, ErrorResul
295310 )
296311 except Exception as e :
297312 logger .error (f"asset_detail failed: { e } " )
298- return ErrorResult (error = str (e ))
313+ return _missing_db_error ( asset_db , ASSET_DBNAME ) or ErrorResult (error = str (e ))
299314
300315
301316@mcp .tool (title = "List Measured Sensors" )
@@ -322,7 +337,9 @@ def measured_sensors(
322337
323338 sensor_list = get_sensor_list (asset_id )
324339 if not sensor_list :
325- return ErrorResult (error = f"unknown asset_id { asset_id } or no sensors found" )
340+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
341+ error = f"unknown asset_id { asset_id } or no sensors found"
342+ )
326343
327344 return SensorsResult (
328345 site_name = site_name ,
@@ -366,7 +383,9 @@ def installed_sensors(
366383 )
367384 docs = res .get ("docs" , [])
368385 if not docs :
369- return ErrorResult (error = f"unknown asset_id { asset_id } at site { site_name } " )
386+ return _missing_db_error (asset_db , ASSET_DBNAME ) or ErrorResult (
387+ error = f"unknown asset_id { asset_id } at site { site_name } "
388+ )
370389 names = list (docs [0 ].get ("sensors" ) or [])
371390 return SensorsResult (
372391 site_name = site_name ,
@@ -377,7 +396,7 @@ def installed_sensors(
377396 )
378397 except Exception as e :
379398 logger .error (f"installed_sensors failed: { e } " )
380- return ErrorResult (error = str (e ))
399+ return _missing_db_error ( asset_db , ASSET_DBNAME ) or ErrorResult (error = str (e ))
381400
382401
383402@mcp .tool (title = "List Assets" )
@@ -435,7 +454,7 @@ def assets(
435454 )
436455 except Exception as e :
437456 logger .error (f"assets failed: { e } " )
438- return ErrorResult (error = str (e ))
457+ return _missing_db_error ( asset_db , ASSET_DBNAME ) or ErrorResult (error = str (e ))
439458
440459
441460@mcp .tool (title = "Find Assets By Sensors" )
@@ -606,7 +625,7 @@ def stream_extent(
606625 total_records += 1
607626
608627 if total_records == 0 :
609- return ErrorResult (
628+ return _missing_db_error ( iot_db , IOT_DBNAME ) or ErrorResult (
610629 error = f"no records for asset_id { asset_id } "
611630 + (f", sensor { sensor } " if sensor else "" )
612631 )
@@ -638,7 +657,9 @@ def stream_extent(
638657 return ErrorResult (error = str (e ))
639658 except Exception as e :
640659 logger .error (f"stream_extent failed: { e } " )
641- return ErrorResult (error = "unable to inspect telemetry stream extent" )
660+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
661+ error = "unable to inspect telemetry stream extent"
662+ )
642663
643664
644665@mcp .tool (title = "Get Sensor History" )
@@ -704,7 +725,9 @@ def history(
704725 )
705726 available_sensors = get_sensor_list (asset_id )
706727 if not available_sensors :
707- return ErrorResult (error = f"unknown asset_id { asset_id } or no sensors found" )
728+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
729+ error = f"unknown asset_id { asset_id } or no sensors found"
730+ )
708731 unknown = [
709732 sensor for sensor in selected_sensors if sensor not in available_sensors
710733 ]
@@ -763,7 +786,9 @@ def history(
763786 return ErrorResult (error = str (e ))
764787 except Exception as e :
765788 logger .error (f"history failed: { e } " )
766- return ErrorResult (error = "unable to retrieve telemetry history" )
789+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
790+ error = "unable to retrieve telemetry history"
791+ )
767792
768793 next_cursor = None
769794 if has_more :
@@ -828,7 +853,9 @@ def latest_reading(
828853 if sensor is not None :
829854 available_sensors = get_sensor_list (asset_id )
830855 if not available_sensors :
831- return ErrorResult (error = f"unknown asset_id { asset_id } or no sensors found" )
856+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
857+ error = f"unknown asset_id { asset_id } or no sensors found"
858+ )
832859 if sensor not in available_sensors :
833860 return ErrorResult (error = f"unknown sensor { sensor } for asset_id { asset_id } " )
834861
@@ -856,10 +883,12 @@ def latest_reading(
856883 return ErrorResult (error = str (e ))
857884 except Exception as e :
858885 logger .error (f"latest_reading failed: { e } " )
859- return ErrorResult (error = "unable to retrieve latest telemetry reading" )
886+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
887+ error = "unable to retrieve latest telemetry reading"
888+ )
860889
861890 if latest_doc is None or latest_timestamp is None or latest_datetime is None :
862- return ErrorResult (
891+ return _missing_db_error ( iot_db , IOT_DBNAME ) or ErrorResult (
863892 error = f"no records for asset_id { asset_id } "
864893 + (f", sensor { sensor } " if sensor else "" )
865894 )
@@ -930,10 +959,14 @@ def sensor_coverage(
930959 return ErrorResult (error = str (e ))
931960 except Exception as e :
932961 logger .error (f"sensor_coverage failed: { e } " )
933- return ErrorResult (error = "unable to calculate sensor coverage" )
962+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
963+ error = "unable to calculate sensor coverage"
964+ )
934965
935966 if docs_scanned == 0 :
936- return ErrorResult (error = f"unknown asset_id { asset_id } or no records found" )
967+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
968+ error = f"unknown asset_id { asset_id } or no records found"
969+ )
937970
938971 sensors = [coverage [field ].result (field ) for field in sorted (coverage )]
939972 message = (
@@ -996,7 +1029,9 @@ def sensor_stats(
9961029
9971030 available_sensors = get_sensor_list (asset_id )
9981031 if not available_sensors :
999- return ErrorResult (error = f"unknown asset_id { asset_id } or no sensors found" )
1032+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
1033+ error = f"unknown asset_id { asset_id } or no sensors found"
1034+ )
10001035 if sensor is not None and sensor not in available_sensors :
10011036 return ErrorResult (error = f"unknown sensor { sensor } for asset_id { asset_id } " )
10021037
@@ -1035,10 +1070,12 @@ def sensor_stats(
10351070 return ErrorResult (error = str (e ))
10361071 except Exception as e :
10371072 logger .error (f"sensor_stats failed: { e } " )
1038- return ErrorResult (error = "unable to calculate sensor statistics" )
1073+ return _missing_db_error (iot_db , IOT_DBNAME ) or ErrorResult (
1074+ error = "unable to calculate sensor statistics"
1075+ )
10391076
10401077 if records_in_window == 0 :
1041- return ErrorResult (
1078+ return _missing_db_error ( iot_db , IOT_DBNAME ) or ErrorResult (
10421079 error = f"no records for asset_id { asset_id } "
10431080 + (f", sensor { sensor } " if sensor else "" )
10441081 )
0 commit comments