Tool tree
gradeNot graded
describe_capabilitiesAnswer
Start here. Returns what this page can do, which city it is currently searching, what data it has already loaded, and what it would need to fetch. Use it to orient before calling anything else, and to decide whether a request will be instant or will take a few seconds of loading.
View tool JSON
{
"name": "describe_capabilities",
"kind": "answer",
"impl": "imperative",
"description": "Start here. Returns what this page can do, which city it is currently searching, what data it has already loaded, and what it would need to fetch. Use it to orient before calling anything else, and to decide whether a request will be instant or will take a few seconds of loading.",
"inputSchema": {
"type": "object",
"properties": {}
}
}set_search_areaAction
Choose the city or district to search, by name ("San Francisco", "Mountain View, CA", "Zurich"). This builds the grid and loads the terrain, which takes a few seconds the first time and is instant afterwards. Everything else requires this to have been called.
View tool JSON
{
"name": "set_search_area",
"kind": "act",
"impl": "imperative",
"description": "Choose the city or district to search, by name (\"San Francisco\", \"Mountain View, CA\", \"Zurich\"). This builds the grid and loads the terrain, which takes a few seconds the first time and is instant afterwards. Everything else requires this to have been called.",
"inputSchema": {
"type": "object",
"required": [
"place"
],
"properties": {
"place": {
"type": "string",
"description": "City or district name"
}
}
}
}add_memberAction
Add a person to the household. Give the age for children — it decides whether a school requirement means a primary or a secondary school, and it changes how much a long walk actually costs them.
View tool JSON
{
"name": "add_member",
"kind": "act",
"impl": "imperative",
"description": "Add a person to the household. Give the age for children — it decides whether a school requirement means a primary or a secondary school, and it changes how much a long walk actually costs them.",
"inputSchema": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number",
"description": "Include for children; optional for adults"
}
}
}
}add_workplaceAction
Add somewhere a member commutes to, by address or place name ("Google Mountain View", "1 Hacker Way"). Give the mode they would actually use. Commute times are modelled from distance and mode rather than routed, and the page says so on screen.
View tool JSON
{
"name": "add_workplace",
"kind": "act",
"impl": "imperative",
"description": "Add somewhere a member commutes to, by address or place name (\"Google Mountain View\", \"1 Hacker Way\"). Give the mode they would actually use. Commute times are modelled from distance and mode rather than routed, and the page says so on screen.",
"inputSchema": {
"type": "object",
"required": [
"member",
"place",
"mode"
],
"properties": {
"member": {
"type": "string",
"description": "Member name"
},
"place": {
"type": "string",
"description": "Address or place name"
},
"mode": {
"type": "string",
"enum": [
"walk",
"drive",
"transit",
"bike"
]
},
"label": {
"type": "string",
"description": "Short name, e.g. \"Google MTV\""
}
}
}
}add_requirementAction
Add one requirement for one person. Three kinds: • amenity — within N minutes' walk of a place type, optionally only counting ones rated at least minRating. This is the main one: a high school rated 4+, a gym, a park, a supermarket. • commute — within N minutes of a workplace already added, by that member's mode. • grade — no street steeper than N percent. Use it for anyone whose knees, pushchair or bike make hills a real cost. ALWAYS pass rationale: the person's own reason in one sentence. It is not decoration — when requirements conflict you will read those reasons back to decide whose should bend, and a number cannot tell you that a limit is medical rather than a preference. Mark hardness "hard" for what genuinely cannot move and "soft" for a preference. The map redraws as soon as this returns; check feasibleKm2, and if it is 0 call diagnose_conflict before telling the user anything.
View tool JSON
{
"name": "add_requirement",
"kind": "act",
"impl": "imperative",
"description": "Add one requirement for one person. Three kinds:\n• amenity — within N minutes' walk of a place type, optionally only counting ones rated at least minRating. This is the main one: a high school rated 4+, a gym, a park, a supermarket.\n• commute — within N minutes of a workplace already added, by that member's mode.\n• grade — no street steeper than N percent. Use it for anyone whose knees, pushchair or bike make hills a real cost.\n\nALWAYS pass rationale: the person's own reason in one sentence. It is not decoration — when requirements conflict you will read those reasons back to decide whose should bend, and a number cannot tell you that a limit is medical rather than a preference. Mark hardness \"hard\" for what genuinely cannot move and \"soft\" for a preference. The map redraws as soon as this returns; check feasibleKm2, and if it is 0 call diagnose_conflict before telling the user anything.",
"inputSchema": {
"type": "object",
"required": [
"member",
"kind",
"threshold",
"rationale"
],
"properties": {
"member": {
"type": "string",
"description": "Member name"
},
"kind": {
"type": "string",
"enum": [
"amenity",
"commute",
"grade"
]
},
"amenityKind": {
"type": "string",
"enum": [
"secondary_school",
"primary_school",
"gym",
"park",
"supermarket",
"transit_station"
],
"description": "Required when kind is amenity"
},
"minRating": {
"type": "number",
"minimum": 1,
"maximum": 5,
"description": "Only count places rated at least this"
},
"workplaceId": {
"type": "string",
"description": "Required when kind is commute"
},
"mode": {
"type": "string",
"enum": [
"walk",
"drive",
"transit",
"bike"
],
"default": "walk"
},
"threshold": {
"type": "number",
"description": "Minutes, or percent for grade"
},
"hardness": {
"type": "string",
"enum": [
"hard",
"soft"
],
"default": "hard"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"default": 1
},
"rationale": {
"type": "string",
"description": "The person's own reason, one sentence"
}
}
}
}analyze_household_moveAction
Configure and solve a complete household move in one transactional call. Use this for a new relocation request instead of making many partial calls. It validates places and data, replaces the current scenario only if the analysis succeeds, and returns the feasible region or exact blockers and concessions.
View tool JSON
{
"name": "analyze_household_move",
"kind": "act",
"impl": "imperative",
"description": "Configure and solve a complete household move in one transactional call. Use this for a new relocation request instead of making many partial calls. It validates places and data, replaces the current scenario only if the analysis succeeds, and returns the feasible region or exact blockers and concessions.",
"inputSchema": {
"type": "object",
"required": [
"area",
"members",
"requirements"
],
"properties": {
"area": {
"type": "string",
"description": "City or district to search"
},
"members": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
}
}
}
},
"workplaces": {
"type": "array",
"items": {
"type": "object",
"required": [
"member",
"place",
"mode",
"label"
],
"properties": {
"member": {
"type": "string"
},
"place": {
"type": "string"
},
"label": {
"type": "string",
"description": "Unique label referenced by commute requirements"
},
"mode": {
"type": "string",
"enum": [
"walk",
"drive",
"transit",
"bike"
]
}
}
}
},
"requirements": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": [
"member",
"kind",
"threshold",
"rationale"
],
"properties": {
"member": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"amenity",
"commute",
"grade"
]
},
"amenityKind": {
"type": "string",
"enum": [
"secondary_school",
"primary_school",
"gym",
"park",
"supermarket",
"transit_station"
]
},
"minRating": {
"type": "number",
"minimum": 1,
"maximum": 5
},
"workplaceLabel": {
"type": "string"
},
"mode": {
"type": "string",
"enum": [
"walk",
"drive",
"transit",
"bike"
]
},
"threshold": {
"type": "number"
},
"hardness": {
"type": "string",
"enum": [
"hard",
"soft"
],
"default": "hard"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"default": 1
},
"rationale": {
"type": "string"
}
}
}
}
}
}
}update_requirementAction
Change a requirement — usually its threshold, to apply a concession the household has agreed to. Pass the exact threshold returned by relaxation_frontier rather than rounding it, or you will reopen a different region than the one you described.
View tool JSON
{
"name": "update_requirement",
"kind": "act",
"impl": "imperative",
"description": "Change a requirement — usually its threshold, to apply a concession the household has agreed to. Pass the exact threshold returned by relaxation_frontier rather than rounding it, or you will reopen a different region than the one you described.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"threshold": {
"type": "number"
},
"hardness": {
"type": "string",
"enum": [
"hard",
"soft"
]
},
"weight": {
"type": "number"
},
"rationale": {
"type": "string"
}
}
}
}remove_requirementAction
Drop a requirement entirely. Prefer update_requirement with a relaxed threshold — households rarely want to abandon a requirement, they want to know what bending it costs.
View tool JSON
{
"name": "remove_requirement",
"kind": "act",
"impl": "imperative",
"description": "Drop a requirement entirely. Prefer update_requirement with a relaxed threshold — households rarely want to abandon a requirement, they want to know what bending it costs.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
}
}
}get_stateAnswer
The full current state of the household and the map — and, importantly, anything a PERSON changed since your last turn. People edit this page directly: they drag a threshold, delete a requirement, pick one of your suggested concessions. Those edits are real and they are not yours. Call this at the start of every turn. If humanChanges is non-empty, read it before you say anything, because your last answer may describe a map that no longer exists.
View tool JSON
{
"name": "get_state",
"kind": "answer",
"impl": "imperative",
"description": "The full current state of the household and the map — and, importantly, anything a PERSON changed since your last turn. People edit this page directly: they drag a threshold, delete a requirement, pick one of your suggested concessions. Those edits are real and they are not yours. Call this at the start of every turn. If humanChanges is non-empty, read it before you say anything, because your last answer may describe a map that no longer exists.",
"inputSchema": {
"type": "object",
"properties": {}
}
}compute_regionAction
Recompute where every requirement holds at once, and return the area in km² plus the candidate places inside it. The region is drawn on the 3D map as a raised volume over the real city. An area of 0 is not an error — it is the interesting case, and diagnose_conflict explains it.
View tool JSON
{
"name": "compute_region",
"kind": "act",
"impl": "imperative",
"description": "Recompute where every requirement holds at once, and return the area in km² plus the candidate places inside it. The region is drawn on the 3D map as a raised volume over the real city. An area of 0 is not an error — it is the interesting case, and diagnose_conflict explains it.",
"inputSchema": {
"type": "object",
"properties": {}
}
}diagnose_conflictAction
When nowhere satisfies everything, find out exactly why. Tests removing each requirement in turn, and if no single removal reopens the map, every pair. Exhaustive and exact — this is measured off the grid, not estimated. Returns each blocking requirement with its owner, their stated rationale, and the km² that would reopen without it. Call this whenever feasibleKm2 is 0, before explaining anything, then call relaxation_frontier on each blocker to find out how far each would have to bend.
View tool JSON
{
"name": "diagnose_conflict",
"kind": "act",
"impl": "imperative",
"description": "When nowhere satisfies everything, find out exactly why. Tests removing each requirement in turn, and if no single removal reopens the map, every pair. Exhaustive and exact — this is measured off the grid, not estimated. Returns each blocking requirement with its owner, their stated rationale, and the km² that would reopen without it. Call this whenever feasibleKm2 is 0, before explaining anything, then call relaxation_frontier on each blocker to find out how far each would have to bend.",
"inputSchema": {
"type": "object",
"properties": {}
}
}relaxation_frontierAction
For one blocking requirement, how far would it have to bend, and what would that buy? Returns the exact smallest movement that reopens anywhere (minDelta), a curve of area against relaxation in unit steps, a recommended point, and the neighbourhood that reopens there. The page draws that region on the map as soon as you call this, so calling it for two blockers shows the household both futures side by side. Every number comes from the grid — never state one you did not receive here. Once you have two frontiers, do the part the solver cannot: weigh what each concession costs against the rationale each person gave. The cheapest concession in km² is not always the easiest one to live with, and saying so is the whole reason a person is talking to you rather than dragging a slider.
View tool JSON
{
"name": "relaxation_frontier",
"kind": "act",
"impl": "imperative",
"description": "For one blocking requirement, how far would it have to bend, and what would that buy? Returns the exact smallest movement that reopens anywhere (minDelta), a curve of area against relaxation in unit steps, a recommended point, and the neighbourhood that reopens there. The page draws that region on the map as soon as you call this, so calling it for two blockers shows the household both futures side by side. Every number comes from the grid — never state one you did not receive here. Once you have two frontiers, do the part the solver cannot: weigh what each concession costs against the rationale each person gave. The cheapest concession in km² is not always the easiest one to live with, and saying so is the whole reason a person is talking to you rather than dragging a slider.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Requirement id from diagnose_conflict"
}
}
}
}explain_addressAction
Test one specific address against every requirement — the listing someone found and wants checked. Returns pass or fail for each with the margin, and the nearest points that would have passed everything. Failing is the useful answer when you say by how much and how far away it works.
View tool JSON
{
"name": "explain_address",
"kind": "act",
"impl": "imperative",
"description": "Test one specific address against every requirement — the listing someone found and wants checked. Returns pass or fail for each with the margin, and the nearest points that would have passed everything. Failing is the useful answer when you say by how much and how far away it works.",
"inputSchema": {
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string"
}
}
}
}find_homesAnswer
Search for places to live inside the feasible region. Every result is somewhere that already satisfies every requirement, which is the point — it is a search that cannot return a home that fails someone. Returns buildings and complexes from Places, not rental listings; Google has no rental feed and the page does not pretend otherwise.
View tool JSON
{
"name": "find_homes",
"kind": "answer",
"impl": "imperative",
"description": "Search for places to live inside the feasible region. Every result is somewhere that already satisfies every requirement, which is the point — it is a search that cannot return a home that fails someone. Returns buildings and complexes from Places, not rental listings; Google has no rental feed and the page does not pretend otherwise.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"default": "apartments for rent"
},
"limit": {
"type": "number",
"default": 8
}
}
}
}present_tradeoff_tourAction
Guide the household through the alternatives currently drawn on the 3D map. In a conflict it visits each proposed concession; otherwise it visits the top feasible areas. Use this when the person should compare visible futures before choosing.
View tool JSON
{
"name": "present_tradeoff_tour",
"kind": "act",
"impl": "imperative",
"description": "Guide the household through the alternatives currently drawn on the 3D map. In a conflict it visits each proposed concession; otherwise it visits the top feasible areas. Use this when the person should compare visible futures before choosing.",
"inputSchema": {
"type": "object",
"properties": {
"view": {
"type": "string",
"enum": [
"auto",
"concessions",
"areas"
],
"default": "auto"
}
}
}
}select_areaAction
Choose one of the candidate areas the page is showing and open it. Use it when the household says which place they want to look at — "the second one", "the Bernal Heights one" — so the map highlights that region and its evidence card opens. Call compute_region or get_state first to see the areas and their labels. This changes what the person is looking at, so only call it when they have actually expressed a preference.
View tool JSON
{
"name": "select_area",
"kind": "act",
"impl": "imperative",
"description": "Choose one of the candidate areas the page is showing and open it. Use it when the household says which place they want to look at — \"the second one\", \"the Bernal Heights one\" — so the map highlights that region and its evidence card opens. Call compute_region or get_state first to see the areas and their labels. This changes what the person is looking at, so only call it when they have actually expressed a preference.",
"inputSchema": {
"type": "object",
"required": [
"area"
],
"properties": {
"area": {
"type": "string",
"description": "Area id from compute_region, or its neighbourhood name"
}
}
}
}accept_concessionAction
Apply one of the concessions offered by relaxation_frontier, on the household's instruction. This permanently loosens that requirement to the exact threshold that reopens the map, and the region resolves around it. Only call this when a person has actually chosen — the whole point of showing two futures is that the choice about whose requirement bends is theirs, not yours. If they have not said which, describe both and ask.
View tool JSON
{
"name": "accept_concession",
"kind": "act",
"impl": "imperative",
"description": "Apply one of the concessions offered by relaxation_frontier, on the household's instruction. This permanently loosens that requirement to the exact threshold that reopens the map, and the region resolves around it. Only call this when a person has actually chosen — the whole point of showing two futures is that the choice about whose requirement bends is theirs, not yours. If they have not said which, describe both and ask.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Requirement id from diagnose_conflict or relaxation_frontier"
}
}
}
}focus_mapAction
Point the camera. Use it to show the household what you are talking about — a candidate area, an address you just checked, or the whole search area. The map is photorealistic 3D, so flying somewhere shows the actual buildings and the actual hills, which is what people are really asking about when they ask what a neighbourhood is like.
View tool JSON
{
"name": "focus_map",
"kind": "act",
"impl": "imperative",
"description": "Point the camera. Use it to show the household what you are talking about — a candidate area, an address you just checked, or the whole search area. The map is photorealistic 3D, so flying somewhere shows the actual buildings and the actual hills, which is what people are really asking about when they ask what a neighbourhood is like.",
"inputSchema": {
"type": "object",
"properties": {
"lat": {
"type": "number"
},
"lng": {
"type": "number"
},
"address": {
"type": "string",
"description": "Alternative to lat/lng"
},
"zoom": {
"type": "string",
"enum": [
"city",
"district",
"street"
],
"default": "district"
}
}
}
}