count_members_at_area
ChatGPTCounts how many members are at one area, without identities. Find the area by area_id or area_name, in one group or across every group when group_id is omitted. Returns {status: "ok", area, group_id, group_name, member_count, stale_count, undisclosed_count, note}. member_count is a floor: undisclosed_count members are at the area but chose not to be visible to assistants, and stale_count of the counted are not recently confirmed (last known there). Report the count as 'at least N' when either is non-zero, and say how many are not recently confirmed — never present those as there now. When the API provides no count (reason "count_unavailable") the answer is unknown, not zero.
list_areas
ChatGPTLists the named areas (places) of a group, or of every group when group_id is omitted. Names and IDs only: no coordinates, no counts. Use count_members_at_area for how many people are at an area. Returns {status: "ok", areas: [{area_id, name, group_id, group_name}]}.
list_groups
ChatGPTLists the PositionGuard groups the key holder belongs to, with their IDs. Call this first when you need a group_id for another tool, or when asked what groups exist. Returns {status: "ok", groups: [{group_id, name, group_type}]}.
where_is_member
ChatGPTReports whether one member is currently at a named area. Looks the member up by nickname (case-insensitive) in the given group, or in every group when group_id is omitted. Returns one of: {status: "at_area", area: {area_id, name}, inside_areas?, since?} — they are at that area now; {status: "last_known_at_area", area, inside_areas?, since?, position_fresh: false, last_confirmed_seconds_ago, note} — they were last confirmed at that area that long ago and have no newer position; relay the note, with the age; {status: "not_at_area"} — their presence is shared with assistants and they are not at any of the group's areas; {status: "unknown", reason} — see below. Returns unknown when the member hasn't shared their presence with assistants, or their location is stale (reason "not_disclosed" or "stale"), and with reason "no_such_member" when no member has that nickname — do not invent one. area is the most specific area they are in. inside_areas, when present, lists every area of the group they are in that is shared with assistants, most specific first (a home inside a city lists both): use it to answer whether they are in a larger area. An area missing from a member's inside_areas is not evidence that the member is outside it: members can hide individual areas from assistants, and nothing marks the omission. For an area that is not listed, the answer is unknown, not no. since is when they entered the area, not when their position was last confirmed; position_fresh and position_age_seconds, when present, say how recent the position is. Duration is not available when the reported area is not the API's current_area for the member, so no since is given for it: when since is absent, do not say how long they have been there. unknown means you don't know; it does not mean they're away. Say so. Never present an unknown as an absence, and never guess a location. A last-known result (last_known_at_area, or a name in last_known) must be relayed with its age — e.g. "last confirmed at Lake House 10 h ago" — never as where they are now.
who_is_at_area
ChatGPTLists the members at one area, by area_id or area_name, in one group or across every group when group_id is omitted. Lists only members who've chosen to be visible to assistants, in two lists that must never be merged: confirmed (a recent position inside the area) and last_known (last confirmed inside it last_confirmed_seconds_ago seconds ago, nothing newer). A member inside a smaller area within this one (a home inside a city) is listed here too. If undisclosed_note or count_note is present, others may be there too: report confirmed as "confirmed here", not as everyone. count_note compares everyone the server counts at the area, including members present but not disclosed to assistants, with the names listed; when it is present, never report the list as complete. members repeats confirmed for older clients. Returns {status: "ok", area, group_id, group_name, confirmed: [nickname…], last_known: [{nickname, last_confirmed_seconds_ago}…], members, last_known_note?, undisclosed_note?, count_note?} or {status: "unknown", reason: "no_such_area"}. A last-known result (last_known_at_area, or a name in last_known) must be relayed with its age — e.g. "last confirmed at Lake House 10 h ago" — never as where they are now.