@@ -44,6 +44,11 @@ def _register_tools(self, mcp: fastmcp.FastMCP) -> None:
4444 name = "get_device" ,
4545 description = "Get device by ID." ,
4646 )
47+ mcp .tool (
48+ self ._get_latest_telemetry ,
49+ name = "get_latest_telemetry" ,
50+ description = "Get latest telemetry of multiple devices." ,
51+ )
4752
4853 async def _list_sites (self ) -> list :
4954 async with self ._new_http_api_client () as client :
@@ -87,6 +92,19 @@ async def _get_device(
8792 )
8893 return device .to_dto ()
8994
95+ async def _get_latest_telemetry (
96+ self , attributes_by_device : dict [str , list [str ]]
97+ ) -> dict [str , dict [str , str | int | float | None ]]:
98+ async with self ._new_http_api_client () as client :
99+ telemetry = await client .telemetry .latest (attributes_by_device )
100+ return {
101+ device : {
102+ attribute : datapoint .to_dto () if datapoint is not None else None # type: ignore
103+ for attribute , datapoint in attributes .items ()
104+ }
105+ for device , attributes in telemetry .items ()
106+ }
107+
90108 def _new_http_api_client (self ) -> AsyncContextManager [http .api .Client ]:
91109 # FIXME: Client instance gets created for each request.
92110 headers = fastmcp .server .dependencies .get_http_headers ()
0 commit comments