{"name":"io.github.useternai/usetern-dev","slug":"useternai-usetern-dev","title":"Tern EV-Charging Analytics (dev)","description":"EV-charging site analytics: utilization, demand, peak saturation and corridor benchmarks.","url":"https://mcp.market/server/useternai-usetern-dev","rating":null,"grade":"C","score":64,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":null,"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://usetern.ai","version":"0.1.0","remotes":[{"type":"streamable-http","url":"https://tern-mcp-dev-537572042041.europe-west4.run.app/mcp","headers":[{"description":"Your Tern API key (sk_...), issued by Tern. Required for every analytics tool; the handshake works without it.","isRequired":true,"isSecret":true,"name":"X-API-Key"}]}],"packages":[],"tools":[{"name":"aggregate_charging_utilization","description":"Station-level utilization aggregated over a GeoJSON area and a date window of at most 92 days, optionally filtered to a capacity band (default 150 kW = HPC; pass 100 for fast charging). The reply is one row per station, so it reads an area without pulling any station's daily rows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"country_iso3":{"description":"ISO-3166 alpha-3 scope, e.g. NOR.","maxLength":3,"minLength":3,"title":"Country Iso3","type":"string"},"geometry":{"description":"GeoJSON Polygon/MultiPolygon as a JSON string.","title":"Geometry","type":"string"},"date_from":{"description":"YYYY-MM-DD (required).","title":"Date From","type":"string"},"date_to":{"description":"YYYY-MM-DD (required; window <= 92 days, >= date_from).","title":"Date To","type":"string"},"min_capacity_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"kW floor (default 150 = HPC; pass 100 for fast-charging).","title":"Min Capacity Kw"},"max_capacity_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Max Capacity Kw"}},"required":["country_iso3","geometry","date_from","date_to"],"title":"aggregate_charging_utilizationArguments"}},{"name":"aggregate_evse_utilization","description":"EVSE-level utilization aggregated over a GeoJSON area and a date window of at most 92 days, optionally filtered to a capacity band. The per-connector counterpart of aggregate_charging_utilization.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"country_iso3":{"description":"ISO-3166 alpha-3 scope, e.g. NOR.","maxLength":3,"minLength":3,"title":"Country Iso3","type":"string"},"geometry":{"description":"GeoJSON Polygon/MultiPolygon as a JSON string.","title":"Geometry","type":"string"},"date_from":{"description":"YYYY-MM-DD (required).","title":"Date From","type":"string"},"date_to":{"description":"YYYY-MM-DD (required; window <= 92 days, >= date_from).","title":"Date To","type":"string"},"min_capacity_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"kW floor (default 150 = HPC; pass 100 for fast-charging).","title":"Min Capacity Kw"},"max_capacity_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Max Capacity Kw"}},"required":["country_iso3","geometry","date_from","date_to"],"title":"aggregate_evse_utilizationArguments"}},{"name":"area_benchmark","description":"How hard is each EVSE at this site working compared with the area around it?\n\nReads the area_benchmark claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/AreaBenchmarkParams"}},"required":["params"],"$defs":{"AreaBenchmarkParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"aggregate_params":{"$ref":"#/$defs/EvseAggregateParams"}},"required":["site_id","observation_params","aggregate_params"],"title":"AreaBenchmarkParams","type":"object"},"CapacityBand":{"additionalProperties":false,"properties":{"min_capacity_kw":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"title":"Min Capacity Kw"},"max_capacity_kw":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"title":"Max Capacity Kw"}},"title":"CapacityBand","type":"object"},"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EvseAggregateParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"geometry":{"minLength":1,"title":"Geometry","type":"string"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityBand","default":{"min_capacity_kw":null,"max_capacity_kw":null}}},"required":["country_iso3","geometry","date_range"],"title":"EvseAggregateParams","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"area_benchmarkArguments"}},{"name":"avg_session_minutes","description":"How long does a session at this site actually last?\n\nReads the avg_session_minutes claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/AvgSessionMinutesParams"}},"required":["params"],"$defs":{"AvgSessionMinutesParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"station_id":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Station Id"}},"required":["site_id","observation_params"],"title":"AvgSessionMinutesParams","type":"object"},"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"avg_session_minutesArguments"}},{"name":"busy_evse_hours","description":"How many EVSE-hours at this station carried charging on the drilled day, and how many of its EVSEs were charging at once in the busiest hour?\n\nReads the busy_evse_hours claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/BusyEvseHoursParams"}},"required":["params"],"$defs":{"BusyEvseHoursParams":{"additionalProperties":false,"properties":{"observation_params":{"$ref":"#/$defs/EvseHourlyParams"},"date_range":{"$ref":"#/$defs/DateRange"},"site_id":{"minLength":1,"title":"Site Id","type":"string"},"station_id":{"minLength":1,"title":"Station Id","type":"string"},"peak_window":{"$ref":"#/$defs/PeakWindow","default":{"from_hour":6,"until_hour":23}}},"required":["observation_params","date_range","site_id","station_id"],"title":"BusyEvseHoursParams","type":"object"},"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateList":{"additionalProperties":false,"properties":{"dates":{"items":{"type":"string"},"minLength":1,"title":"Dates","type":"array"}},"required":["dates"],"title":"DateList","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EvseHourlyParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Date"},"dates":{"anyOf":[{"$ref":"#/$defs/DateList"},{"type":"null"}],"default":null},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids"],"title":"EvseHourlyParams","type":"object"},"PeakWindow":{"additionalProperties":false,"properties":{"from_hour":{"default":6,"maximum":23,"minimum":0,"title":"From Hour","type":"integer"},"until_hour":{"default":23,"maximum":24,"minimum":1,"title":"Until Hour","type":"integer"}},"title":"PeakWindow","type":"object"}},"title":"busy_evse_hoursArguments"}},{"name":"corridor_benchmark","description":"How does this site's demand per EVSE-day compare with the corridor drawn around it?\n\nReads the corridor_benchmark claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/CorridorBenchmarkParams"}},"required":["params"],"$defs":{"CapacityBand":{"additionalProperties":false,"properties":{"min_capacity_kw":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"title":"Min Capacity Kw"},"max_capacity_kw":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"title":"Max Capacity Kw"}},"title":"CapacityBand","type":"object"},"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"CorridorBenchmarkParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"station_id":{"minLength":1,"title":"Station Id","type":"string"},"aggregate_params":{"$ref":"#/$defs/EvseAggregateParams"}},"required":["site_id","observation_params","station_id","aggregate_params"],"title":"CorridorBenchmarkParams","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EvseAggregateParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"geometry":{"minLength":1,"title":"Geometry","type":"string"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityBand","default":{"min_capacity_kw":null,"max_capacity_kw":null}}},"required":["country_iso3","geometry","date_range"],"title":"EvseAggregateParams","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"corridor_benchmarkArguments"}},{"name":"corridor_comparison","description":"How does this site compare with the named stations around it — distance, EVSE count, max kW, and sessions per EVSE-day each?\n\nReads the corridor_comparison claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/CorridorComparisonParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"CorridorComparisonParams":{"additionalProperties":false,"properties":{"site_id":{"pattern":"^[0-9a-fA-F]{32}$","title":"Site Id","type":"string"},"location":{"$ref":"#/$defs/NearbyStationParams"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"}},"required":["site_id","location","observation_params"],"title":"CorridorComparisonParams","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"NearbyStationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"lat":{"maximum":90,"minimum":-90,"title":"Lat","type":"number"},"lng":{"maximum":180,"minimum":-180,"title":"Lng","type":"number"},"radius_km":{"exclusiveMinimum":0,"maximum":10,"title":"Radius Km","type":"number"},"limit":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"}},"required":["country_iso3","lat","lng","radius_km"],"title":"NearbyStationParams","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"corridor_comparisonArguments"}},{"name":"daily_spike","description":"Which days ran far above this site's normal, and by how much?\n\nReads the daily_spike claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/DailySpikeParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DailySpikeParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"factor":{"default":1.5,"exclusiveMinimum":0,"title":"Factor","type":"number"}},"required":["site_id","observation_params"],"title":"DailySpikeParams","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"daily_spikeArguments"}},{"name":"day_vs_similar","description":"Was one particular day unusual for the day of week it fell on?\n\nReads the day_vs_similar claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/DayVsSimilarParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"DayVsSimilarParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"station_id":{"minLength":1,"title":"Station Id","type":"string"},"target_date":{"title":"Target Date","type":"string"}},"required":["site_id","observation_params","station_id","target_date"],"title":"DayVsSimilarParams","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"day_vs_similarArguments"}},{"name":"demand_share_multiple","description":"How much of the area's demand does this one site take, said as a multiple of the mean station?\n\nReads the demand_share_multiple claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/DemandShareMultipleParams"}},"required":["params"],"$defs":{"CapacityBand":{"additionalProperties":false,"properties":{"min_capacity_kw":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"title":"Min Capacity Kw"},"max_capacity_kw":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"title":"Max Capacity Kw"}},"title":"CapacityBand","type":"object"},"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"DemandShareMultipleParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"aggregate_params":{"$ref":"#/$defs/StationAggregateParams"}},"required":["site_id","observation_params","aggregate_params"],"title":"DemandShareMultipleParams","type":"object"},"StationAggregateParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"geometry":{"minLength":1,"title":"Geometry","type":"string"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityBand","default":{"min_capacity_kw":null,"max_capacity_kw":null}}},"required":["country_iso3","geometry","date_range"],"title":"StationAggregateParams","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"demand_share_multipleArguments"}},{"name":"estate_coverage","description":"Which estate sites reported on every day of the window, which are partial or young, and how full is the window's final day?\n\nReads the estate_coverage claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/EstateCoverageParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EstateCoverageParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"estate":{"$ref":"#/$defs/EstateScope"}},"required":["site_id","estate"],"title":"EstateCoverageParams","type":"object"},"EstateScope":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"pattern":"^[0-9a-fA-F]{32}$","type":"string"},"maxLength":50,"minLength":2,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"EstateScope","type":"object"}},"title":"estate_coverageArguments"}},{"name":"estate_monthly_series","description":"Did demand per EVSE across the estate move month over month, and did each focus site move with it?\n\nReads the estate_monthly_series claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/EstateMonthlySeriesParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EstateMonthlySeriesParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"estate":{"$ref":"#/$defs/EstateScope"},"focus_station_ids":{"default":[],"items":{"pattern":"^[0-9a-fA-F]{32}$","type":"string"},"maxItems":6,"title":"Focus Station Ids","type":"array"}},"required":["site_id","estate"],"title":"EstateMonthlySeriesParams","type":"object"},"EstateScope":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"pattern":"^[0-9a-fA-F]{32}$","type":"string"},"maxLength":50,"minLength":2,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"EstateScope","type":"object"}},"title":"estate_monthly_seriesArguments"}},{"name":"hourly_spike","description":"When in the day does demand at this site peak?\n\nReads the hourly_spike claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/HourlySpikeParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateList":{"additionalProperties":false,"properties":{"dates":{"items":{"type":"string"},"minLength":1,"title":"Dates","type":"array"}},"required":["dates"],"title":"DateList","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EvseHourlyParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Date"},"dates":{"anyOf":[{"$ref":"#/$defs/DateList"},{"type":"null"}],"default":null},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids"],"title":"EvseHourlyParams","type":"object"},"HourlySpikeParams":{"additionalProperties":false,"properties":{"observation_params":{"$ref":"#/$defs/EvseHourlyParams"},"date_range":{"$ref":"#/$defs/DateRange"},"site_id":{"minLength":1,"title":"Site Id","type":"string"},"peak_window":{"$ref":"#/$defs/PeakWindow","default":{"from_hour":6,"until_hour":23}}},"required":["observation_params","date_range","site_id"],"title":"HourlySpikeParams","type":"object"},"PeakWindow":{"additionalProperties":false,"properties":{"from_hour":{"default":6,"maximum":23,"minimum":0,"title":"From Hour","type":"integer"},"until_hour":{"default":23,"maximum":24,"minimum":1,"title":"Until Hour","type":"integer"}},"title":"PeakWindow","type":"object"}},"title":"hourly_spikeArguments"}},{"name":"list_evses","description":"List the individual EVSEs (connectors) of up to 20 stations, with their capacity in kW. Stall counts and capacity bands come from here rather than from a station record.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"country_iso3":{"description":"ISO-3166 alpha-3 scope, e.g. NOR.","maxLength":3,"minLength":3,"title":"Country Iso3","type":"string"},"station_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"1-20 station ids (array or comma-separated).","title":"Station Ids"}},"required":["country_iso3","station_ids"],"title":"list_evsesArguments"}},{"name":"monthly_sessions_per_stall_day","description":"Is demand per EVSE rising or falling month over month?\n\nReads the monthly_sessions_per_stall_day claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/MonthlySessionsPerStallDayParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"MonthlySessionsPerStallDayParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"station_id":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Station Id"}},"required":["site_id","observation_params"],"title":"MonthlySessionsPerStallDayParams","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"monthly_sessions_per_stall_dayArguments"}},{"name":"nearby_charging_stations","description":"List the charging stations within a radius of a point, nearest first. The radius is in kilometres and at most 10; the reply is the API payload inline. This is how a site's competitors are found before any claim is read.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"country_iso3":{"description":"ISO-3166 alpha-3 scope, e.g. NOR.","maxLength":3,"minLength":3,"title":"Country Iso3","type":"string"},"lat":{"title":"Lat","type":"number"},"lng":{"title":"Lng","type":"number"},"radius_km":{"description":"km, > 0 and <= 10.","exclusiveMinimum":0,"maximum":10,"title":"Radius Km","type":"number"},"limit":{"anyOf":[{"maximum":50,"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"}},"required":["country_iso3","lat","lng","radius_km"],"title":"nearby_charging_stationsArguments"}},{"name":"peak_hour_co_saturation","description":"When the site reaches its busiest hour of the day, do the stations around it reach their own busiest hours at the same time?\n\nReads the peak_hour_co_saturation claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/PeakHourCoSaturationParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateList":{"additionalProperties":false,"properties":{"dates":{"items":{"type":"string"},"minLength":1,"title":"Dates","type":"array"}},"required":["dates"],"title":"DateList","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EvseHourlyParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Date"},"dates":{"anyOf":[{"$ref":"#/$defs/DateList"},{"type":"null"}],"default":null},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids"],"title":"EvseHourlyParams","type":"object"},"PeakHourCoSaturationParams":{"additionalProperties":false,"properties":{"observation_params":{"$ref":"#/$defs/EvseHourlyParams"},"date_range":{"$ref":"#/$defs/DateRange"},"site_id":{"pattern":"^[0-9a-fA-F]{32}$","title":"Site Id","type":"string"},"peak_window":{"$ref":"#/$defs/PeakWindow","default":{"from_hour":6,"until_hour":23}},"tolerance_hours":{"default":1,"maximum":6,"minimum":0,"title":"Tolerance Hours","type":"integer"}},"required":["observation_params","date_range","site_id"],"title":"PeakHourCoSaturationParams","type":"object"},"PeakWindow":{"additionalProperties":false,"properties":{"from_hour":{"default":6,"maximum":23,"minimum":0,"title":"From Hour","type":"integer"},"until_hour":{"default":23,"maximum":24,"minimum":1,"title":"Until Hour","type":"integer"}},"title":"PeakWindow","type":"object"}},"title":"peak_hour_co_saturationArguments"}},{"name":"poi_context","description":"What kind of place is this site sitting in?\n\nReads the poi_context claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.\n\nplaces carries the rows this claim reads, because they are transcribed by the caller rather than fetched.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/PoiContextParams"},"places":{"items":{"$ref":"#/$defs/PlaceRow"},"title":"Places","type":"array"}},"required":["params","places"],"$defs":{"PlaceRow":{"additionalProperties":true,"properties":{"name":{"minLength":1,"title":"Name","type":"string"},"station_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Station Id"},"kind":{"minLength":1,"title":"Kind","type":"string"},"dist_m":{"minimum":0,"title":"Dist M","type":"integer"},"lat":{"title":"Lat","type":"number"},"lon":{"title":"Lon","type":"number"},"place_ref":{"minLength":1,"title":"Place Ref","type":"string"},"source":{"enum":["google_places","chargefinder"],"title":"Source","type":"string"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Rating"},"reviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Reviews"},"co_located":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Co Located"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note"}},"required":["name","kind","dist_m","lat","lon","place_ref","source"],"title":"PlaceRow","type":"object"},"PoiContextParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"}},"required":["site_id"],"title":"PoiContextParams","type":"object"}},"title":"poi_contextArguments"}},{"name":"rank_gap","description":"Where does this site sit in its estate's ranking, and how far is it from the estate median and the estate leader?\n\nReads the rank_gap claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/RankGapParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EstateScope":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"pattern":"^[0-9a-fA-F]{32}$","type":"string"},"maxLength":50,"minLength":2,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"EstateScope","type":"object"},"RankGapParams":{"additionalProperties":false,"properties":{"site_id":{"pattern":"^[0-9a-fA-F]{32}$","title":"Site Id","type":"string"},"estate":{"$ref":"#/$defs/EstateScope"},"station_id":{"pattern":"^[0-9a-fA-F]{32}$","title":"Station Id","type":"string"}},"required":["site_id","estate","station_id"],"title":"RankGapParams","type":"object"}},"title":"rank_gapArguments"}},{"name":"road_context","description":"What road does this site sit on, and what class is it?\n\nReads the road_context claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/RoadContextParams"}},"required":["params"],"$defs":{"OvertureRoadsParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"radius_m":{"anyOf":[{"exclusiveMinimum":0,"maximum":10000,"type":"integer"},{"type":"null"}],"default":null,"title":"Radius M"}},"required":["country_iso3","station_ids"],"title":"OvertureRoadsParams","type":"object"},"RoadContextParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/OvertureRoadsParams"}},"required":["site_id","observation_params"],"title":"RoadContextParams","type":"object"}},"title":"road_contextArguments"}},{"name":"search_charging_stations","description":"Find charging stations in one country by structured filter — id, title, address, operator. The reply is the API payload inline: station ids, titles, addresses and operators, which is what the claim tools take as site_id and station_id.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"country_iso3":{"description":"ISO-3166 alpha-3 scope, e.g. NOR.","maxLength":3,"minLength":3,"title":"Country Iso3","type":"string"},"id":{"anyOf":[{"pattern":"^[0-9a-fA-F]{32}$","type":"string"},{"type":"null"}],"default":null,"description":"One 32-char hex station id.","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Address"},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Operator"},"limit":{"anyOf":[{"maximum":50,"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"}},"required":["country_iso3"],"title":"search_charging_stationsArguments"}},{"name":"sessions_per_stall_day","description":"How hard is each EVSE at this site working per day?\n\nReads the sessions_per_stall_day claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/SessionsPerStallDayParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"SessionsPerStallDayParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"station_id":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Station Id"}},"required":["site_id","observation_params"],"title":"SessionsPerStallDayParams","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"}},"title":"sessions_per_stall_dayArguments"}},{"name":"site_profile","description":"What is this site — how many EVSEs, and how close is the nearest station?\n\nReads the site_profile claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/SiteProfileParams"}},"required":["params"],"$defs":{"NearbyStationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"lat":{"maximum":90,"minimum":-90,"title":"Lat","type":"number"},"lng":{"maximum":180,"minimum":-180,"title":"Lng","type":"number"},"radius_km":{"exclusiveMinimum":0,"maximum":10,"title":"Radius Km","type":"number"},"limit":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"}},"required":["country_iso3","lat","lng","radius_km"],"title":"NearbyStationParams","type":"object"},"SiteProfileParams":{"additionalProperties":false,"properties":{"site_id":{"pattern":"^[0-9a-fA-F]{32}$","title":"Site Id","type":"string"},"location":{"$ref":"#/$defs/NearbyStationParams"}},"required":["site_id","location"],"title":"SiteProfileParams","type":"object"}},"title":"site_profileArguments"}},{"name":"site_ranking","description":"How do the estate's sites rank on sessions per EVSE-day over one window, and how far is the leader above the estate median?\n\nReads the site_ranking claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/SiteRankingParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"EstateScope":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"pattern":"^[0-9a-fA-F]{32}$","type":"string"},"maxLength":50,"minLength":2,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"EstateScope","type":"object"},"SiteRankingParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"estate":{"$ref":"#/$defs/EstateScope"}},"required":["site_id","estate"],"title":"SiteRankingParams","type":"object"}},"title":"site_rankingArguments"}},{"name":"total_charging_minutes","description":"How many minutes of charging did this site actually deliver over the window?\n\nReads the total_charging_minutes claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/TotalChargingMinutesParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"},"TotalChargingMinutesParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"station_id":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Station Id"}},"required":["site_id","observation_params"],"title":"TotalChargingMinutesParams","type":"object"}},"title":"total_charging_minutesArguments"}},{"name":"total_sessions","description":"How much charging demand did this site see over the window?\n\nReads the total_sessions claim for one site and returns only its result: the status the claim decided from its own observations (computed or insufficient), the typed result, and the display a deliverable would print. The observations behind it are pulled into a scratch directory that is deleted before the call returns, so the rows never enter the conversation and nothing is left on the server to read back later — this call is the whole reading.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"params":{"$ref":"#/$defs/TotalSessionsParams"}},"required":["params"],"$defs":{"CapacityRange":{"additionalProperties":false,"properties":{"min_capacity_kw":{"default":150,"title":"Min Capacity Kw","type":"number"},"max_capacity_kw":{"default":1000,"title":"Max Capacity Kw","type":"number"}},"title":"CapacityRange","type":"object"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"title":"Date From","type":"string"},"date_to":{"title":"Date To","type":"string"}},"required":["date_from","date_to"],"title":"DateRange","type":"object"},"StationUtilizationParams":{"additionalProperties":false,"properties":{"country_iso3":{"maxLength":3,"minLength":3,"pattern":"^[A-Za-z]{3}$","title":"Country Iso3","type":"string"},"station_ids":{"items":{"type":"string"},"maxLength":20,"minLength":1,"title":"Station Ids","type":"array"},"date_range":{"$ref":"#/$defs/DateRange"},"capacity":{"$ref":"#/$defs/CapacityRange","default":{"min_capacity_kw":"150.0","max_capacity_kw":"1000.0"}}},"required":["country_iso3","station_ids","date_range"],"title":"StationUtilizationParams","type":"object"},"TotalSessionsParams":{"additionalProperties":false,"properties":{"site_id":{"minLength":1,"title":"Site Id","type":"string"},"observation_params":{"$ref":"#/$defs/StationUtilizationParams"},"station_id":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Station Id"}},"required":["site_id","observation_params"],"title":"TotalSessionsParams","type":"object"}},"title":"total_sessionsArguments"}}],"scan":{"score":64,"grade":"C","scanned_at":"2026-09-19T09:55:35.129Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T09:55:35.080Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1133ms"]},"poisoning":{"score":15,"max":15,"notes":["26 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://tern-mcp-dev-537572042041.europe-west4.run.app/mcp","reachable":true,"authRequired":false,"latencyMs":1133,"serverInfo":{"name":"tern-mcp","version":"1.30.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://usetern.ai/favicon.png","source":"site","width":64,"height":64},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}