Close Knit

London neighbourhoods and homes: crime, schools, prices, rents, commute, green space, sourced.

Sollte ich dies verwenden

Qualität und Sicherheit

A
Qualität der Beschreibung
99%
Vollständigkeit des Schemas
93%
Qualität der Benennung
98%
Risiko der Vergiftung
100%
Übereinstimmung der Berechtigungen
100%
Einhaltung des Protokolls
100%

Befunde (1)

  • LOWTool 'find_similar_areas' description lacks action verbin find_similar_areas

Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.

Kontextkosten

~14,439Tokens (Tool-Definitionen)
~5.2 KBTypische Antwortgröße
Erhebliche Auswirkung auf die Aufmerksamkeit (11.28% von 128k Kontext)

Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.

Installieren

Installation mit einem Klick

Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:

{
  "mcpServers": {
    "close-knit": {
      "url": "https://getcloseknit.com/mcp"
    }
  }
}

Remote-Endpunkte

https://getcloseknit.com/mcpstreamable-http

Was es kann

Tool-Inventar

Tools (24)

🟢 Nur lesen🟡 Schreiben🔴 Löschen⚪ Unbekannt
🟢find_areas(market, max_budget, target_budget, bedrooms, priorities, ...)

Shortlist London neighbourhoods for a household: budget, bedrooms, weighted priorities (crime, station access, price level, official deprivation decile, noise, disorder, energy rating, leasehold share) and optional stations/boroughs to live near. Returns ranked areas with score, factor values, a ballpark price for the bedroom count and budget fit, postcode districts and website links. Pass rejected areas in exclude_area_ids when refining after the user's feedback (LSOA, MSOA or borough ids).

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "market": {
      "default": "buy",
      "description": "Buying or renting.",
      "enum": [
        "buy",
        "rent"
      ],
      "title": "Market",
      "type": "string"
    },
    "max_budget": {
      "description": "Maximum price in £ (buy) or £ per month (rent).",
      "exclusiveMinimum": 0,
      "title": "Max Budget",
      "type": "integer"
    },
    "target_budget": {
      "anyOf": [
        {
          "exclusiveMinimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Comfortable price; defaults to max less 8% (the site's own rule: £650k max → £600k).",
      "title": "Target Budget"
    },
    "bedrooms": {
      "default": 2,
      "description": "Bedrooms needed (0 = studio).",
      "maximum": 8,
      "minimum": 0,
      "title": "Bedrooms",
      "type": "integer"
    },
    "priorities": {
      "description": "What matters, with importance 1-5 (criteria are ranked by importance, then in the order given; the order sets the weights). Translate the user's words: 'safe' → crime, 'near the tube' → station-access, 'good value' → market-level, 'quiet' → noise, 'no rough streets / graffiti' → disorder, 'low energy bills' → epc-share, 'freehold' → leasehold-share. must = only areas in London's better half for it.",
      "items": {
        "$ref": "#/$defs/PriorityInput"
      },
      "maxItems": 8,
      "title": "Priorities",
      "type": "array"
    },
    "ranges": {
      "description": "Any other map layer as a range with soft edges, e.g. gigabit broadband at 90% of homes or more: {layer: 'broadband-gigabit', scale: 'value', min: 90}. Bounds are percentiles within each area's region by default (London's areas among London's; min 90 = the region's top 10%); scale 'value' uses the layer's own unit. Only layers list_metrics shows.",
      "items": {
        "$ref": "#/$defs/RangeInput"
      },
      "maxItems": 8,
      "title": "Ranges",
      "type": "array"
    },
    "budget_importance": {
      "default": 5,
      "description": "Where the budget sits in the order (5 = first). Fit 1 up to target_budget, falling to 0 at max_budget.",
      "maximum": 5,
      "minimum": 1,
      "title": "Budget Importance",
      "type": "integer"
    },
    "budget_must": {
      "default": false,
      "description": "True = areas whose ballpark is over max_budget are out.",
      "title": "Budget Must",
      "type": "boolean"
    },
    "near_stations": {
      "description": "Live within walking distance of these stations (e.g. on the user's commute line).",
      "items": {
        "$ref": "#/$defs/StationZoneInput"
      },
      "maxItems": 3,
      "title": "Near Stations",
      "type": "array"
    },
    "boroughs": {
      "description": "Live in these boroughs (uk:borough:E09…, from search_places). Stations + boroughs ≤ 3.",
      "items": {
        "type": "string"
      },
      "maxItems": 3,
      "title": "Boroughs",
      "type": "array"
    },
    "only_in_zones": {
      "default": true,
      "description": "With stations/boroughs given: True = only areas inside them (a must Where criterion); False = ranked first in the order, the fit falling with distance outside (zone_soft_metres).",
      "title": "Only In Zones",
      "type": "boolean"
    },
    "zone_soft_metres": {
      "default": 1000,
      "description": "Outside the zones the fit falls to 0 over this distance (when only_in_zones is False).",
      "maximum": 5000,
      "minimum": 100,
      "title": "Zone Soft Metres",
      "type": "integer"
    },
    "exclude_area_ids": {
      "description": "Areas the user already rejected — LSOA, MSOA or borough geography ids (boroughs and MSOAs expand to their LSOAs) — so they are not suggested again.",
      "items": {
        "type": "string"
      },
      "maxItems": 100,
      "title": "Exclude Area Ids",
      "type": "array"
    },
    "include_over_budget": {
      "default": false,
      "description": "Keep areas whose typical home looks over budget.",
      "title": "Include Over Budget",
      "type": "boolean"
    },
    "places": {
      "description": "Where the household goes — work, a gym, a particular school, friends (pinned: latitude/longitude from search_places) or the nearest of a kind (category). Each becomes a criterion; must = hard limit.",
      "items": {
        "$ref": "#/$defs/PlaceInput"
      },
      "maxItems": 8,
      "title": "Places",
      "type": "array"
    },
    "liked_area_ids": {
      "description": "Areas the user liked: carried into the map link and highlighted there.",
      "items": {
        "type": "string"
      },
      "maxItems": 50,
      "title": "Liked Area Ids",
      "type": "array"
    },
    "property_type": {
      "default": "any",
      "description": "House or flat, for the price comparison on the brief page (sales of similar homes).",
      "enum": [
        "house",
        "flat",
        "any"
      ],
      "title": "Property Type",
      "type": "string"
    },
    "top_n": {
      "default": 8,
      "description": "How many areas to return.",
      "maximum": 20,
      "minimum": 1,
      "title": "Top N",
      "type": "integer"
    },
    "custom": {
      "description": "The user's own criteria from places on the map ('more cafés than kebab shops', 'near gyms'): a preset_id or a criterion, each scored by its percentile within the area's region (London for a London area). Describes places, never who lives there.",
      "items": {
        "$ref": "#/$defs/CustomChoiceInput"
      },
      "maxItems": 4,
      "title": "Custom",
      "type": "array"
    }
  },
  "required": [
    "max_budget"
  ],
  "$defs": {
    "CustomChoiceInput": {
      "additionalProperties": false,
      "properties": {
        "preset_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "A ready-made criterion from list_custom_presets, e.g. 'kebab-cafe'.",
          "title": "Preset Id"
        },
        "criterion": {
          "anyOf": [
            {
              "$ref": "#/$defs/CustomCriterionInput"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Or the user's own criterion."
        },
        "importance": {
          "default": 3,
          "description": "1 nice to have … 5 essential.",
          "maximum": 5,
          "minimum": 1,
          "title": "Importance",
          "type": "integer"
        },
        "direction": {
          "anyOf": [
            {
              "enum": [
                "higher",
                "lower"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "higher = more of it (more A for balance/share, closer for nearest); lower = less. Default: the preset's.",
          "title": "Direction"
        }
      },
      "title": "CustomChoiceInput",
      "type": "object"
    },
    "CustomCriterionInput": {
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "Short id, e.g. 'kebab-cafe'.",
          "pattern": "^[a-z0-9-]{1,24}$",
          "title": "Id",
          "type": "string"
        },
        "label": {
          "description": "Name the user will see: descriptive, no brand or value words, e.g. 'Kebab shops vs cafés'.",
          "maxLength": 60,
          "minLength": 1,
          "title": "Label",
          "type": "string"
        },
        "sets": {
          "additionalProperties": {
            "$ref": "#/$defs/CustomSetInput"
          },
          "description": "Sets of places: a (required), b for balance/share, c optional for count/density.",
          "propertyNames": {
            "enum": [
              "a",
              "b",
              "c"
            ]
          },
          "title": "Sets",
          "type": "object"
        },
        "formula": {
          "description": "Prefer nearest for 'is one close' (straight-line walk minutes from the area's centre to the nearest A, up to 5 km) and per_resident for 'how much is around' (places in any set per 1,000 residents; the City of London is left out). The rest are counted inside each neighbourhood's boundary (the area shape on the map, not walking distance): count / density (per km² of the area) of places in any set; share A/(A+B); variety = distinct cuisines/sports among A; balance (A-B)/(A+B+5) from -1 (more B) to +1 (more A), advanced: few places keep an area near 0.",
          "enum": [
            "count",
            "density",
            "per_resident",
            "balance",
            "share",
            "variety",
            "nearest"
          ],
          "title": "Formula",
          "type": "string"
        },
        "radiusMetres": {
          "default": 800,
          "description": "Kept for compatibility with saved criteria and share links (200-2000 m); no formula uses it, so leave the default.",
          "maximum": 2000,
          "minimum": 200,
          "title": "Radiusmetres",
          "type": "integer"
        }
      },
      "required": [
        "id",
        "label",
        "sets",
        "formula"
      ],
      "title": "CustomCriterionInput",
      "type": "object"
    },
    "CustomSetInput": {
      "additionalProperties": false,
      "properties": {
        "label": {
          "description": "What the places are, e.g. 'Kebab shops'.",
          "maxLength": 60,
          "minLength": 1,
          "title": "Label",
          "type": "string"
        },
        "any": {
          "description": "OR of matchers; a matcher ANDs OpenStreetMap tag tests over amenity, shop, leisure, tourism, sport, cuisine, healthcare, craft, office and brand: a value, a list of values, '*' (has the tag) or null (has no such tag). E.g. [{\"cuisine\": \"kebab\"}], [{\"amenity\": \"cafe\", \"brand\": null}] for independent cafés, [{\"cuisine\": \"specialty_coffee\"}] for coffee-led shops (specialty coffee, not a café with coffee on the menu; never a big chain), [{\"brand\": \"Greggs\"}]. religion/denomination are refused: places, not people.",
          "items": {
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "object"
          },
          "maxItems": 6,
          "minItems": 1,
          "title": "Any",
          "type": "array"
        }
      },
      "required": [
        "label",
        "any"
      ],
      "title": "CustomSetInput",
      "type": "object"
    },
    "PlaceInput": {
      "additionalProperties": false,
      "properties": {
        "label": {
          "description": "What the place is, e.g. 'Office', 'PureGym Angel', 'Any park'.",
          "maxLength": 60,
          "minLength": 1,
          "title": "Label",
          "type": "string"
        },
        "latitude": {
          "anyOf": [
            {
              "maximum": 90,
              "minimum": -90,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "A pinned place: its latitude (from search_places). For an address, `center` is its area's centre unless `centerPrecision` is `uprn`; never pin an LSOA centroid as the home.",
          "title": "Latitude"
        },
        "longitude": {
          "anyOf": [
            {
              "maximum": 180,
              "minimum": -180,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "A pinned place: its longitude.",
          "title": "Longitude"
        },
        "category": {
          "anyOf": [
            {
              "enum": [
                "park",
                "cafe",
                "supermarket",
                "convenience",
                "gp",
                "pharmacy",
                "pub",
                "restaurant",
                "gym",
                "pool",
                "sports_club",
                "step_free_station"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Instead of a point: the nearest place of this kind (pool = public pool; step_free_station = a station TfL lists with lift access, or any DLR station or tram stop).",
          "title": "Category"
        },
        "brand": {
          "anyOf": [
            {
              "maxLength": 40,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "With a category: only this brand, e.g. 'M&S', 'Waitrose', 'Lidl' (supermarket) or 'PureGym' (gym).",
          "title": "Brand"
        },
        "sport": {
          "anyOf": [
            {
              "maxLength": 30,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "With sports_club: the sport, e.g. 'tennis', 'football'.",
          "title": "Sport"
        },
        "top_school": {
          "anyOf": [
            {
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Instead of a point or category: near one of London's top N state schools (by published results), e.g. 10. Living nearby never guarantees a place: say so.",
          "title": "Top School"
        },
        "school_phase": {
          "default": "secondary",
          "description": "With top_school.",
          "enum": [
            "primary",
            "secondary"
          ],
          "title": "School Phase",
          "type": "string"
        },
        "school_rank_by": {
          "default": "results",
          "description": "With top_school: rank by published results (default) or by Progress 8 (secondary only: progress pupils make from their primary results, latest published year 2023/24).",
          "enum": [
            "results",
            "progress8"
          ],
          "title": "School Rank By",
          "type": "string"
        },
        "school": {
          "anyOf": [
            {
              "$ref": "#/$defs/SchoolPlaceInput"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Instead of top_school: the nearest school matching a filter (phase, Ofsted, type, intake, faith, one results measure ≥ a threshold), optionally within N metres; max_minutes still sets the trip."
        },
        "mode": {
          "anyOf": [
            {
              "enum": [
                "walk",
                "cycle",
                "transit",
                "car"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How they get there (default transit for a pin, walk for a kind). car = typical weekday-morning traffic, no parking or charges: say so.",
          "title": "Mode"
        },
        "max_minutes": {
          "default": 30,
          "description": "The longest trip they accept.",
          "maximum": 120,
          "minimum": 1,
          "title": "Max Minutes",
          "type": "integer"
        },
        "importance": {
          "default": 3,
          "description": "1 nice to have … 5 essential.",
          "maximum": 5,
          "minimum": 1,
          "title": "Importance",
          "type": "integer"
        },
        "must": {
          "default": false,
          "description": "True when an area beyond max_minutes is out of the question.",
          "title": "Must",
          "type": "boolean"
        }
      },
      "required": [
        "label"
      ],
      "title": "PlaceInput",
      "type": "object"
    },
    "PriorityInput": {
      "additionalProperties": false,
      "properties": {
        "factor": {
          "description": "crime = recorded crime rate; station-access = walk minutes to the nearest station; market-level = local £/m² price level; deprivation = official deprivation decile (IMD), 1 = most deprived; noise = share of homes at 55 dB+ from road, rail or aircraft; disorder = anti-social behaviour, criminal damage and public order per 1,000 residents; epc-share = share of homes rated EPC A-C (energy efficiency, running costs); leasehold-share = share of recent sales that were leasehold.",
          "enum": [
            "crime",
            "station-access",
            "market-level",
            "deprivation",
            "noise",
            "disorder",
            "epc-share",
            "leasehold-share"
          ],
          "title": "Factor",
          "type": "string"
        },
        "importance": {
          "description": "1 = nice to have … 5 = essential.",
          "maximum": 5,
          "minimum": 1,
          "title": "Importance",
          "type": "integer"
        },
        "direction": {
          "anyOf": [
            {
              "enum": [
                "higher",
                "lower"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Which end the household prefers. Default: lower crime, shorter walks, lower prices, a higher deprivation decile, less noise, less disorder, more homes rated A-C, fewer leasehold sales.",
          "title": "Direction"
        },
        "must": {
          "default": false,
          "description": "True = a filter: only areas in the better half of London for it (no weight). False = ranked by importance: the better half fits fully, the next quarter of London partly, the rest not at all.",
          "title": "Must",
          "type": "boolean"
        }
      },
      "required": [
        "factor",
        "importance"
      ],
      "title": "PriorityInput",
      "type": "object"
    },
    "RangeInput": {
      "additionalProperties": false,
      "properties": {
        "layer": {
          "description": "Any map layer from list_metrics (e.g. noise, crime, station-access, nature-score, price-per-square-metre, food-hygiene), or disorder, schools, epc-share, leasehold-share. Never a Census (census-*, student-share) layer.",
          "pattern": "^(custom:)?[a-z0-9][a-z0-9-]{0,59}$",
          "title": "Layer",
          "type": "string"
        },
        "scale": {
          "default": "percentile",
          "description": "percentile = bounds are percentiles of the value within each area's region (London's areas among London's), 0 = lowest, 100 = highest (e.g. max 30 = the lowest 30% for noise); value = the layer's own unit.",
          "enum": [
            "value",
            "percentile"
          ],
          "title": "Scale",
          "type": "string"
        },
        "min": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Lowest accepted value (or percentile).",
          "title": "Min"
        },
        "max": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Highest accepted value (or percentile).",
          "title": "Max"
        },
        "soft_min": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Below min the fit falls to 0 at soft_min (≤ min).",
          "title": "Soft Min"
        },
        "soft_max": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Above max the fit falls to 0 at soft_max (≥ max).",
          "title": "Soft Max"
        },
        "importance": {
          "default": 3,
          "description": "1 nice to have … 5 essential: sets its place in the order.",
          "maximum": 5,
          "minimum": 1,
          "title": "Importance",
          "type": "integer"
        },
        "must": {
          "default": false,
          "description": "True = a filter (no soft edge, no weight).",
          "title": "Must",
          "type": "boolean"
        }
      },
      "required": [
        "layer"
      ],
      "title": "RangeInput",
      "type": "object"
    },
    "SchoolFilterInput": {
      "additionalProperties": false,
      "properties": {
        "phases": {
          "anyOf": [
            {
              "items": {
                "enum": [
                  "primary",
                  "secondary",
                  "all-through",
                  "private"
                ],
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Phases kept (absent = all).",
          "title": "Phases"
        },
        "ofsted": {
          "anyOf": [
            {
              "items": {
                "enum": [
                  "outstanding",
                  "good",
                  "report-card",
                  "requires-improvement",
                  "inadequate",
                  "not-inspected"
                ],
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Ofsted standing kept, state schools only (absent = any).",
          "title": "Ofsted"
        },
        "establishments": {
          "anyOf": [
            {
              "items": {
                "enum": [
                  "academy",
                  "free",
                  "community",
                  "voluntary",
                  "foundation"
                ],
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Type of establishment (absent = any).",
          "title": "Establishments"
        },
        "gender": {
          "anyOf": [
            {
              "enum": [
                "mixed",
                "girls",
                "boys"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Intake (absent = any).",
          "title": "Gender"
        },
        "faith": {
          "anyOf": [
            {
              "enum": [
                "faith",
                "none"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Faith school or not (absent = any).",
          "title": "Faith"
        },
        "measure": {
          "anyOf": [
            {
              "$ref": "#/$defs/SchoolMeasureInput"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "One results measure and its threshold."
        },
        "a_level_only": {
          "default": false,
          "description": "Only sixth forms with a combined A-level rank.",
          "title": "A Level Only",
          "type": "boolean"
        }
      },
      "title": "SchoolFilterInput",
      "type": "object"
    },
    "SchoolMeasureInput": {
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "englandTopPercent = England top % (lower is better: at most the threshold); progress8, attainment8, grade5EngMaths (%), ks2RwmExpected (%) = at least the threshold; fsm6Share = free school meals % (at most). Latest published year per school; cohorts under 30 and suppressed cells have no value and never pass.",
          "enum": [
            "englandTopPercent",
            "progress8",
            "attainment8",
            "grade5EngMaths",
            "ks2RwmExpected",
            "fsm6Share"
          ],
          "title": "Id",
          "type": "string"
        },
        "threshold": {
          "description": "The threshold in the measure's own unit, e.g. 75 for KS2 RWM 75%.",
          "title": "Threshold",
          "type": "number"
        }
      },
      "required": [
        "id",
        "threshold"
      ],
      "title": "SchoolMeasureInput",
      "type": "object"
    },
    "SchoolPlaceInput": {
      "additionalProperties": false,
      "properties": {
        "filter": {
          "$ref": "#/$defs/SchoolFilterInput",
          "description": "Which schools count (the same filter as the map's Schools filter)."
        },
        "within": {
          "anyOf": [
            {
              "maximum": 10000,
              "minimum": 100,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Metres: only a matching school this close counts (straight line); beyond it the area has none.",
          "title": "Within"
        }
      },
      "required": [
        "filter"
      ],
      "title": "SchoolPlaceInput",
      "type": "object"
    },
    "StationZoneInput": {
      "additionalProperties": false,
      "properties": {
        "station_id": {
          "description": "Station id from search_places (osm:n…).",
          "pattern": "^osm:[nwr]\\d{1,15}$",
          "title": "Station Id",
          "type": "string"
        },
        "max_walk_minutes": {
          "default": 15,
          "description": "Walking time to the station (5-30).",
          "maximum": 30,
          "minimum": 5,
          "title": "Max Walk Minutes",
          "type": "integer"
        }
      },
      "required": [
        "station_id"
      ],
      "title": "StationZoneInput",
      "type": "object"
    }
  },
  "title": "find_areasArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "find_areasDictOutput"
}
🟢open_shared_search(link, top_n)

Open a search the user shared from the Close Knit site (a link with #profile=v1., v2. or v3.): their budget, priorities, places (gym, work, schools…), liked and ruled-out areas and private notes, re-ranked now with the same shortlist as find_areas. Use it when the user pastes such a link or says 'discuss my search'.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "link": {
      "description": "An Close Knit link the user shared (…#profile=v1.…, v2. or v3.), e.g. from 'Discuss with Claude' on the site.",
      "maxLength": 8000,
      "minLength": 20,
      "title": "Link",
      "type": "string"
    },
    "top_n": {
      "default": 8,
      "description": "How many areas to return.",
      "maximum": 20,
      "minimum": 1,
      "title": "Top N",
      "type": "integer"
    }
  },
  "required": [
    "link"
  ],
  "title": "open_shared_searchArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "open_shared_searchDictOutput"
}
🟢find_similar_areas(area_id, cheaper, bedrooms, top_n)

Neighbourhoods like one the user liked (crime, deprivation, income, price level and station access percentiles), optionally only cheaper ones: 'like this but cheaper / elsewhere'.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_id": {
      "description": "A neighbourhood (LSOA) the user liked.",
      "pattern": "^uk:lsoa:E\\d{8}$",
      "title": "Area Id",
      "type": "string"
    },
    "cheaper": {
      "default": false,
      "description": "Only areas with a lower £/m² price level.",
      "title": "Cheaper",
      "type": "boolean"
    },
    "bedrooms": {
      "anyOf": [
        {
          "maximum": 8,
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Adds a ballpark price for this size.",
      "title": "Bedrooms"
    },
    "top_n": {
      "default": 6,
      "description": "How many areas to return.",
      "maximum": 10,
      "minimum": 1,
      "title": "Top N",
      "type": "integer"
    }
  },
  "required": [
    "area_id"
  ],
  "title": "find_similar_areasArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "find_similar_areasDictOutput"
}
🟢get_area_overview(area_id, bedrooms)

One neighbourhood in detail for a decision: local market (sales, turnover, leasehold share, £/m² medians, growth), the borough's official UK HPI (hpi: average price by type, 1/5/10-year change vs London: quote this for how prices moved), £/m² price trend, crime with its offence mix (topTypes, a busy-centre note), road/rail noise, nearby state schools with their standing Ofsted grade plus independent schools (schools.independent), planning rules (home: conservation, Article 4, listed buildings, broadband), council tax bands and a typical bill (councilTax), the IMD decile (deprivation), a ballpark price for a bedroom count and website links.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_id": {
      "description": "Geography id, e.g. uk:lsoa:E01000951.",
      "pattern": "^uk:(lsoa|msoa|borough):[A-Z]\\d{8}$",
      "title": "Area Id",
      "type": "string"
    },
    "bedrooms": {
      "anyOf": [
        {
          "maximum": 8,
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Adds a ballpark price for this size.",
      "title": "Bedrooms"
    }
  },
  "required": [
    "area_id"
  ],
  "title": "get_area_overviewArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_area_overviewDictOutput"
}
🟢assess_listing(postcode, asking_price, market, rent_period, bedrooms, ...)

Check one listing the user found against local evidence: asking price vs the neighbourhood's recorded £/m² (with floor area or a bedroom-based ballpark), turnover, growth, the borough's official HPI, costs (stamp duty on the asking price, the borough's council tax by band), crime with its offence mix, noise, schools (state and independent counts), planning rules (home: conservation, Article 4, listed buildings), listed buildings recorded at or near the postcode (listedNearby), the IMD decile, and the questions to ask the agent (lease, service charge, EWS1, listing). Not a valuation.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "postcode": {
      "description": "Full postcode of the listing, e.g. W5 2NU.",
      "pattern": "^\\s*[A-Za-z]{1,2}\\d[A-Za-z\\d]?\\s*\\d[A-Za-z]{2}\\s*$",
      "title": "Postcode",
      "type": "string"
    },
    "asking_price": {
      "description": "£ (buy) or the rent in its rent_period (rent).",
      "exclusiveMinimum": 0,
      "title": "Asking Price",
      "type": "integer"
    },
    "market": {
      "default": "buy",
      "description": "For sale or to rent.",
      "enum": [
        "buy",
        "rent"
      ],
      "title": "Market",
      "type": "string"
    },
    "rent_period": {
      "default": "month",
      "description": "The rent's period: month = £ per calendar month, week = £ per week (converted ×52/12 for the comparison).",
      "enum": [
        "month",
        "week"
      ],
      "title": "Rent Period",
      "type": "string"
    },
    "bedrooms": {
      "anyOf": [
        {
          "maximum": 8,
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Bedrooms in the listing.",
      "title": "Bedrooms"
    },
    "floor_area_sqm": {
      "anyOf": [
        {
          "exclusiveMaximum": 2000,
          "exclusiveMinimum": 5,
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Floor area in m² if the listing states it.",
      "title": "Floor Area Sqm"
    },
    "floor_area_sqft": {
      "anyOf": [
        {
          "exclusiveMaximum": 22000,
          "exclusiveMinimum": 50,
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Floor area in sq ft if the listing states it; converted server-side (1 sq ft = 0.092903 m²).",
      "title": "Floor Area Sqft"
    },
    "property_type": {
      "anyOf": [
        {
          "enum": [
            "detached",
            "semi-detached",
            "terraced",
            "flat"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Property type if the listing states it; used for a same-type comparison.",
      "title": "Property Type"
    },
    "tenure": {
      "default": "unknown",
      "description": "Tenure if the listing states it; lease questions are hedged ('If leasehold') when unknown and skipped for freehold.",
      "enum": [
        "freehold",
        "leasehold",
        "share-of-freehold",
        "shared-ownership",
        "unknown"
      ],
      "title": "Tenure",
      "type": "string"
    },
    "share_percent": {
      "anyOf": [
        {
          "maximum": 100,
          "minimum": 1,
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Shared-ownership share for sale, e.g. 25: the asking price is compared as asking_price ÷ share against whole-home prices. Omit when the listing does not state it (the verdict stays unknown).",
      "title": "Share Percent"
    },
    "listing_url": {
      "anyOf": [
        {
          "maxLength": 500,
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Echoed back for citation only.",
      "title": "Listing Url"
    }
  },
  "required": [
    "postcode",
    "asking_price"
  ],
  "title": "assess_listingArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "assess_listingDictOutput"
}
🟢list_metrics(compact)

List every area metric the active release serves (id, unit, direction, available periods, legend, provenance, caveats), plus the My match factors (kind 'factor': disorder, epc-share, leasehold-share, schools) that get_area_metric and rank_areas_by_metric also read. Call first to learn valid metric_id/period values for the other area tools; compact=true returns only id, unit, direction and defaultPeriod. Sources carry licence and methodology links.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "compact": {
      "default": false,
      "description": "Only id, unit, direction and defaultPeriod per metric: a small reply when you just need valid metric_id/period values.",
      "title": "Compact",
      "type": "boolean"
    }
  },
  "title": "list_metricsArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "list_metricsDictOutput"
}
🟢search_areas(q, limit)

Resolve free text (area name, ONS code, postcode, street) to geography ids (uk:lsoa|msoa|borough:…) and, where recorded sales exist, address ids (uk:addr:…). Use the returned ids with get_area_metric, rank_areas_by_metric, get_address_history.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "q": {
      "description": "Free text: area name, ONS code (E01…), postcode, or street.",
      "minLength": 2,
      "title": "Q",
      "type": "string"
    },
    "limit": {
      "default": 10,
      "description": "Maximum results (1-25).",
      "maximum": 25,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    }
  },
  "required": [
    "q"
  ],
  "title": "search_areasArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "search_areasDictOutput"
}
🟢get_area_metric(area_id, metric_id, period)

Evidence-backed value of one metric for one area in one month: value, regional (londonPercentile: within the area's region, London for a London area; rankScope names it) and England percentiles, quality, sample size, category breakdown where available, plus up to 12 prior months as evidence rows. Units follow the metric (per 1,000 residents, GBP/m2). Confidence is high only for observed (not modelled) values. Some metrics are published for a wider area (income per MSOA; rent change and mobile coverage per borough): on a smaller area they return the enclosing area's value with quality 'fallback' and carrierGeographyId naming where it came from. Period defaults to the metric's latest. The find_areas factors disorder, epc-share, leasehold-share and schools are read the same way for one neighbourhood (latest value, period ignored), to verify or explain a find_areas result.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_id": {
      "description": "Geography id, e.g. uk:lsoa:E01000004.",
      "pattern": "^uk:(lsoa|msoa|borough):[A-Z]\\d{8}$",
      "title": "Area Id",
      "type": "string"
    },
    "metric_id": {
      "description": "Metric id from list_metrics, e.g. crime or price-per-square-metre.",
      "title": "Metric Id",
      "type": "string"
    },
    "period": {
      "anyOf": [
        {
          "pattern": "^\\d{4}-\\d{2}$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Month, YYYY-MM. Defaults to the metric's latest period (defaultPeriod in list_metrics).",
      "title": "Period"
    }
  },
  "required": [
    "area_id",
    "metric_id"
  ],
  "title": "get_area_metricArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_area_metricDictOutput"
}
🟢rank_areas_by_metric(metric_id, period, top_n, order, region)

Rank every served area (or one region's, region='North West') by one metric for one month and return the top N with rank, value, unit and quality. Tied values share a rank (competition ranking); each row carries tiedCount, the number of areas sharing its value. Use it to answer 'which areas have the lowest crime / highest GBP/m2' or 'the least deprived' (deprivation is the official IMD decile, 10 = least deprived: order desc), 'the highest household income' (income, GBP a year) or 'the most social renting' (social-renting, % of households; neutral, never call it better or worse). Areas with suppressed values are excluded. Census layers (census-*, student-share) describe residents and are refused: never rank areas by who lives there. The find_areas factors disorder, epc-share, leasehold-share and schools rank too (latest value, period ignored).

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "metric_id": {
      "description": "Metric id from list_metrics.",
      "title": "Metric Id",
      "type": "string"
    },
    "period": {
      "description": "Month, YYYY-MM.",
      "pattern": "^\\d{4}-\\d{2}$",
      "title": "Period",
      "type": "string"
    },
    "top_n": {
      "default": 10,
      "description": "How many areas to return (1-50).",
      "maximum": 50,
      "minimum": 1,
      "title": "Top N",
      "type": "integer"
    },
    "order": {
      "default": "desc",
      "description": "desc = highest value first.",
      "enum": [
        "asc",
        "desc"
      ],
      "title": "Order",
      "type": "string"
    },
    "region": {
      "anyOf": [
        {
          "maxLength": 40,
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Only areas of one English region: its code (E12000001-E12000009) or name, e.g. 'North West', 'London'. Omitted: every area Close Knit covers.",
      "title": "Region"
    }
  },
  "required": [
    "metric_id",
    "period"
  ],
  "title": "rank_areas_by_metricArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "rank_areas_by_metricDictOutput"
}
🟢get_address_history(address_id)

Recorded achieved sale prices for one address id (HM Land Registry Price Paid, GBP, with the EPC floor area where matched; no per-sale GBP/m2). These are historic transactions, never valuations or asking prices. listingLinks open the postcode on Rightmove (past listings and their photos), Zoopla and OnTheMarket: links only, Close Knit does not fetch or host listings.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "address_id": {
      "description": "Address id returned by search_areas (uk:addr:…).",
      "pattern": "^uk:addr:[0-9a-f]{12}$",
      "title": "Address Id",
      "type": "string"
    }
  },
  "required": [
    "address_id"
  ],
  "title": "get_address_historyArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_address_historyDictOutput"
}
🟢get_home_prices(property_ref)

One London home's recorded sales (date, price, HM Land Registry link) and prices in its area today: the middle half (25th-75th percentile) of same-type standard sales since three years back, each adjusted to the latest month by the local price index, with sample size and the area used (LSOA, else MSOA, else borough), and the coarse band its last sale fell in that year (top 10%, top quarter, upper middle, lower middle, bottom quarter, bottom 10%) with today's prices of that band in the area. Accepts a UPRN, an address id (uk:addr:…) from search_places, or an address fragment. Area statistics only: never say what the home is worth; describe the area. When a fragment matches several homes the tool returns their candidates instead of picking one: ask which home, or pass its addressId. Homes without a linked UPRN are reached by address id or fragment and carry uprn null. `facts` holds the home's type and tenure (Land Registry) and, where shown, energy-certificate facts (rating, potential rating, certificate date, built form, age band, rooms, floor level); null fields are not shown for this home; `withheld` lists features held back. Below 5 sales of the type nothing is shown. Hidden homes are not found.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "property_ref": {
      "description": "UPRN (digits), an address id (uk:addr:…) as returned by search_places, or an address fragment, e.g. '100a Baker Street EN1'.",
      "minLength": 3,
      "title": "Property Ref",
      "type": "string"
    }
  },
  "required": [
    "property_ref"
  ],
  "title": "get_home_pricesArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_home_pricesDictOutput"
}
🟢match_areas(profile, top_n)

Score every area against a household's ordered criteria (preference-profile.v2: budget, ranges on any map layer, places, where zones, own criteria; must = filter). Returns a match-pack.v2 with the best top_n (default 20, max 100) areas as a list with score, rank and percentile per area, its top 2 reasons and 2 weakest criteria, the bottom 10, and per-criterion components (value, fit, in/edge/out) as evidence for the listed areas only. Whole-coverage counts (scored, unscored, excluded, and excludedBy per unmet must) cover every area; mapUrl opens the full map for the search. Set analyticsConsent true only if the user agreed to store an anonymised profile summary; the tool works identically with false.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "profile": {
      "additionalProperties": true,
      "description": "preference-profile.v2 (preferred): {schemaVersion: 'preference-profile.v2', market buy|rent, targetBudget, maximumBudget, bedrooms, criteria: [...]} where criteria is ORDERED, most important first, each one of {kind: budget, must} (fit 1 at or under targetBudget, 0 at maximumBudget; must = within maximumBudget) | {kind: range, layer (a map layer id from list_metrics, e.g. crime, noise, air-no2, station-access, price-per-square-metre, or disorder, schools, epc-share, leasehold-share), scale value|percentile (percentile = percentile 0-100 of the value within the area's region, London's areas among London's, lowest first), min, max, softMin, softMax, must} | {kind: place, id, label, target, mode, targetMinutes, softMinutes, must} | {kind: where, zones (1-3: {kind: station, stationId, maxWalkMinutes 5-30} | {kind: borough, id} | {kind: lsoas, ids <= 50} | {kind: polygon, points}), softMetres (default 1000), must} | {kind: custom, criterion, direction, must}. A must criterion is a filter with no weight; the others weigh by their place in the list. preference-profile.v1 (factors with weights 0-5) is still accepted and migrated (weight order, Must kept).",
      "title": "Profile",
      "type": "object"
    },
    "top_n": {
      "default": 20,
      "description": "How many of the best-scored areas to list (1-100). values is that top-N list, not the whole map; scored, unscored, excluded and excludedBy count every area Close Knit covers. For the whole map use mapUrl.",
      "maximum": 100,
      "minimum": 1,
      "title": "Top N",
      "type": "integer"
    }
  },
  "required": [
    "profile"
  ],
  "title": "match_areasArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "match_areasDictOutput"
}
🟢get_market_depth(area_id)

Local market depth of one LSOA or MSOA from HM Land Registry Price Paid (standard category A sales only): sales in the last 12 months, turnover (% of EPC-linked homes that sold), the leasehold share OF SALES (not of homes), new-build and resale median GBP/m2 over 36 months with the new-build premium (each median needs 10 sales, the premium both), and the LSOA's GBP/m2 growth. Aggregates only: never a valuation, a listing or addresses.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_id": {
      "description": "LSOA or MSOA geography id, e.g. uk:lsoa:E01000004 (boroughs are unavailable).",
      "pattern": "^uk:(lsoa|msoa|borough):[A-Z]\\d{8}$",
      "title": "Area Id",
      "type": "string"
    }
  },
  "required": [
    "area_id"
  ],
  "title": "get_market_depthArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_market_depthDictOutput"
}
🟢get_nearby_sales_summary(address_id)

Counts and median GBP/m2 of other homes' recorded sales in the same building (postcode, house number or name, street) and on the same street (other buildings) as one address id, last 10 years. The median is withheld under 5 standard sales with an EPC floor area. Summary only: no sale rows and no addresses; homes with a privacy objection are left out.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "address_id": {
      "description": "Address id returned by search_areas (uk:addr:…).",
      "pattern": "^uk:addr:[0-9a-f]{12}$",
      "title": "Address Id",
      "type": "string"
    }
  },
  "required": [
    "address_id"
  ],
  "title": "get_nearby_sales_summaryArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_nearby_sales_summaryDictOutput"
}
🟢get_area_evidence_pack(area_id, address_id)

One cited evidence pack for an area: market depth (as get_market_depth), the latest recorded crime rate, road and rail noise shares, state schools within 1.5 km with their standing Ofsted grade, and, given an address_id inside the area, its building and street sale aggregates. Every block names its source release; not advice and not a valuation.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_id": {
      "description": "Geography id, e.g. uk:lsoa:E01000004.",
      "pattern": "^uk:(lsoa|msoa|borough):[A-Z]\\d{8}$",
      "title": "Area Id",
      "type": "string"
    },
    "address_id": {
      "anyOf": [
        {
          "pattern": "^uk:addr:[0-9a-f]{12}$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional address id (uk:addr:…) inside the area: adds its building and street sale aggregates.",
      "title": "Address Id"
    }
  },
  "required": [
    "area_id"
  ],
  "title": "get_area_evidence_packArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_area_evidence_packDictOutput"
}
🟢search_places(q, limit)

Resolve a place the user mentions (station, borough, neighbourhood, postcode, street) to ids. Station lookup forgives spelling (Kings Cross, St James Park, Elephant and Castle) and knows London codes and nicknames (KX, TCR, LST, E&C, ally pally). Returns stations (osm:…, with TfL modes, lines and zone; twin stations such as Hammersmith are listed apart) for find_areas.near_stations, boroughs (uk:borough:…) for find_areas.boroughs, areas and addresses for get_area_overview and assess_listing.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "q": {
      "description": "A station, borough, neighbourhood, postcode or street.",
      "minLength": 2,
      "title": "Q",
      "type": "string"
    },
    "limit": {
      "default": 5,
      "description": "Results per kind.",
      "maximum": 10,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    }
  },
  "required": [
    "q"
  ],
  "title": "search_placesArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "search_placesDictOutput"
}
🟢get_commute(area_id, places)

Door-to-door minutes from one neighbourhood to the user's places on a weekday morning, by public transport (R5 on TfL timetables), bike (at the speed Santander Cycles riders reach; checked against TfL), car (typical morning traffic, no parking) and walking, each with a range. Places within 1.5 km of a commute hub (King's Cross, Bank, Canary Wharf, Oxford Circus…) are routed through it; others in Greater London get a straight-line estimate (estimate: true); places outside Greater London, and every place from a neighbourhood outside London (the routing is London only), get no minutes (reason 'outside-london', or 'outside-coverage' where Close Knit covers England). Journeys over 120 minutes are not timed (minutes null, capped: true).

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_id": {
      "description": "The neighbourhood (LSOA) to travel from.",
      "pattern": "^uk:lsoa:E\\d{8}$",
      "title": "Area Id",
      "type": "string"
    },
    "places": {
      "description": "Pinned places (latitude/longitude) to reach.",
      "items": {
        "$ref": "#/$defs/PlaceInput"
      },
      "maxItems": 8,
      "minItems": 1,
      "title": "Places",
      "type": "array"
    }
  },
  "required": [
    "area_id",
    "places"
  ],
  "$defs": {
    "PlaceInput": {
      "additionalProperties": false,
      "properties": {
        "label": {
          "description": "What the place is, e.g. 'Office', 'PureGym Angel', 'Any park'.",
          "maxLength": 60,
          "minLength": 1,
          "title": "Label",
          "type": "string"
        },
        "latitude": {
          "anyOf": [
            {
              "maximum": 90,
              "minimum": -90,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "A pinned place: its latitude (from search_places). For an address, `center` is its area's centre unless `centerPrecision` is `uprn`; never pin an LSOA centroid as the home.",
          "title": "Latitude"
        },
        "longitude": {
          "anyOf": [
            {
              "maximum": 180,
              "minimum": -180,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "A pinned place: its longitude.",
          "title": "Longitude"
        },
        "category": {
          "anyOf": [
            {
              "enum": [
                "park",
                "cafe",
                "supermarket",
                "convenience",
                "gp",
                "pharmacy",
                "pub",
                "restaurant",
                "gym",
                "pool",
                "sports_club",
                "step_free_station"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Instead of a point: the nearest place of this kind (pool = public pool; step_free_station = a station TfL lists with lift access, or any DLR station or tram stop).",
          "title": "Category"
        },
        "brand": {
          "anyOf": [
            {
              "maxLength": 40,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "With a category: only this brand, e.g. 'M&S', 'Waitrose', 'Lidl' (supermarket) or 'PureGym' (gym).",
          "title": "Brand"
        },
        "sport": {
          "anyOf": [
            {
              "maxLength": 30,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "With sports_club: the sport, e.g. 'tennis', 'football'.",
          "title": "Sport"
        },
        "top_school": {
          "anyOf": [
            {
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Instead of a point or category: near one of London's top N state schools (by published results), e.g. 10. Living nearby never guarantees a place: say so.",
          "title": "Top School"
        },
        "school_phase": {
          "default": "secondary",
          "description": "With top_school.",
          "enum": [
            "primary",
            "secondary"
          ],
          "title": "School Phase",
          "type": "string"
        },
        "school_rank_by": {
          "default": "results",
          "description": "With top_school: rank by published results (default) or by Progress 8 (secondary only: progress pupils make from their primary results, latest published year 2023/24).",
          "enum": [
            "results",
            "progress8"
          ],
          "title": "School Rank By",
          "type": "string"
        },
        "school": {
          "anyOf": [
            {
              "$ref": "#/$defs/SchoolPlaceInput"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Instead of top_school: the nearest school matching a filter (phase, Ofsted, type, intake, faith, one results measure ≥ a threshold), optionally within N metres; max_minutes still sets the trip."
        },
        "mode": {
          "anyOf": [
            {
              "enum": [
                "walk",
                "cycle",
                "transit",
                "car"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How they get there (default transit for a pin, walk for a kind). car = typical weekday-morning traffic, no parking or charges: say so.",
          "title": "Mode"
        },
        "max_minutes": {
          "default": 30,
          "description": "The longest trip they accept.",
          "maximum": 120,
          "minimum": 1,
          "title": "Max Minutes",
          "type": "integer"
        },
        "importance": {
          "default": 3,
          "description": "1 nice to have … 5 essential.",
          "maximum": 5,
          "minimum": 1,
          "title": "Importance",
          "type": "integer"
        },
        "must": {
          "default": false,
          "description": "True when an area beyond max_minutes is out of the question.",
          "title": "Must",
          "type": "boolean"
        }
      },
      "required": [
        "label"
      ],
      "title": "PlaceInput",
      "type": "object"
    },
    "SchoolFilterInput": {
      "additionalProperties": false,
      "properties": {
        "phases": {
          "anyOf": [
            {
              "items": {
                "enum": [
                  "primary",
                  "secondary",
                  "all-through",
                  "private"
                ],
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Phases kept (absent = all).",
          "title": "Phases"
        },
        "ofsted": {
          "anyOf": [
            {
              "items": {
                "enum": [
                  "outstanding",
                  "good",
                  "report-card",
                  "requires-improvement",
                  "inadequate",
                  "not-inspected"
                ],
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Ofsted standing kept, state schools only (absent = any).",
          "title": "Ofsted"
        },
        "establishments": {
          "anyOf": [
            {
              "items": {
                "enum": [
                  "academy",
                  "free",
                  "community",
                  "voluntary",
                  "foundation"
                ],
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Type of establishment (absent = any).",
          "title": "Establishments"
        },
        "gender": {
          "anyOf": [
            {
              "enum": [
                "mixed",
                "girls",
                "boys"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Intake (absent = any).",
          "title": "Gender"
        },
        "faith": {
          "anyOf": [
            {
              "enum": [
                "faith",
                "none"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Faith school or not (absent = any).",
          "title": "Faith"
        },
        "measure": {
          "anyOf": [
            {
              "$ref": "#/$defs/SchoolMeasureInput"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "One results measure and its threshold."
        },
        "a_level_only": {
          "default": false,
          "description": "Only sixth forms with a combined A-level rank.",
          "title": "A Level Only",
          "type": "boolean"
        }
      },
      "title": "SchoolFilterInput",
      "type": "object"
    },
    "SchoolMeasureInput": {
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "englandTopPercent = England top % (lower is better: at most the threshold); progress8, attainment8, grade5EngMaths (%), ks2RwmExpected (%) = at least the threshold; fsm6Share = free school meals % (at most). Latest published year per school; cohorts under 30 and suppressed cells have no value and never pass.",
          "enum": [
            "englandTopPercent",
            "progress8",
            "attainment8",
            "grade5EngMaths",
            "ks2RwmExpected",
            "fsm6Share"
          ],
          "title": "Id",
          "type": "string"
        },
        "threshold": {
          "description": "The threshold in the measure's own unit, e.g. 75 for KS2 RWM 75%.",
          "title": "Threshold",
          "type": "number"
        }
      },
      "required": [
        "id",
        "threshold"
      ],
      "title": "SchoolMeasureInput",
      "type": "object"
    },
    "SchoolPlaceInput": {
      "additionalProperties": false,
      "properties": {
        "filter": {
          "$ref": "#/$defs/SchoolFilterInput",
          "description": "Which schools count (the same filter as the map's Schools filter)."
        },
        "within": {
          "anyOf": [
            {
              "maximum": 10000,
              "minimum": 100,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Metres: only a matching school this close counts (straight line); beyond it the area has none.",
          "title": "Within"
        }
      },
      "required": [
        "filter"
      ],
      "title": "SchoolPlaceInput",
      "type": "object"
    }
  },
  "title": "get_commuteArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_commuteDictOutput"
}
🟢get_flood_risk(area_id, uprn)

Flood bands for an area's land (rivers/sea, surface water) and, with a UPRN, that home's own bands. Bands show the likelihood for an area, not a specific property: send the user to the Environment Agency check for one address.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_id": {
      "description": "Geography id, e.g. uk:lsoa:E01000951.",
      "pattern": "^uk:(lsoa|msoa|borough):[A-Z]\\d{8}$",
      "title": "Area Id",
      "type": "string"
    },
    "uprn": {
      "anyOf": [
        {
          "pattern": "^[0-9]+$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "A home's UPRN for its own bands; without it, only the area's land bands.",
      "title": "Uprn"
    }
  },
  "required": [
    "area_id"
  ],
  "title": "get_flood_riskArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_flood_riskDictOutput"
}
🟢get_rent_levels(area_ids, bedrooms)

Median monthly rent by bedroom count for areas (the figure the site shows). Borough averages per LSOA; empty for a studio or before the rents are loaded.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_ids": {
      "description": "Geography ids, e.g. uk:lsoa:E01000951.",
      "items": {
        "type": "string"
      },
      "maxItems": 50,
      "minItems": 1,
      "title": "Area Ids",
      "type": "array"
    },
    "bedrooms": {
      "description": "Bedroom count; the site shows rents per bedroom count.",
      "maximum": 8,
      "minimum": 1,
      "title": "Bedrooms",
      "type": "integer"
    }
  },
  "required": [
    "area_ids",
    "bedrooms"
  ],
  "title": "get_rent_levelsArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_rent_levelsDictOutput"
}
🟢get_listing_search_links(area_ids, market, max_price, min_bedrooms, outcodes_per_area)

Pre-filtered searches on Rightmove, Zoopla, OnTheMarket (and OpenRent for rentals) for the postcode districts of shortlisted areas. Links only: open them on the user's behalf to read listings; Close Knit itself never fetches or stores listings.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "area_ids": {
      "description": "LSOA ids from find_areas.",
      "items": {
        "type": "string"
      },
      "maxItems": 10,
      "minItems": 1,
      "title": "Area Ids",
      "type": "array"
    },
    "market": {
      "default": "buy",
      "description": "Buying or renting.",
      "enum": [
        "buy",
        "rent"
      ],
      "title": "Market",
      "type": "string"
    },
    "max_price": {
      "description": "£ (buy) or £ per month (rent).",
      "exclusiveMinimum": 0,
      "title": "Max Price",
      "type": "integer"
    },
    "min_bedrooms": {
      "default": 0,
      "description": "Minimum bedrooms.",
      "maximum": 8,
      "minimum": 0,
      "title": "Min Bedrooms",
      "type": "integer"
    },
    "outcodes_per_area": {
      "default": 1,
      "description": "Postcode districts per area (busiest first).",
      "maximum": 3,
      "minimum": 1,
      "title": "Outcodes Per Area",
      "type": "integer"
    }
  },
  "required": [
    "area_ids",
    "max_price"
  ],
  "title": "get_listing_search_linksArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_listing_search_linksDictOutput"
}
🟢list_custom_presets

Ready-made custom criteria built from places on OpenStreetMap, with neutral descriptive names: kebab shops vs cafés, specialty coffee vs kebab shops, sandwich chains vs bakery chains, independent vs chain cafés, the nearest gym or sports centre, bars, pubs and clubs (more or fewer, per 1,000 residents), cinemas, theatres, museums and galleries, universities, the nearest playground or nursery, variety of cuisines, bakeries vs betting shops, takeaways, coworking, bike parking, the nearest EV charging point, the nearest market, the nearest dog park, vet or pet shop. Each has an id for evaluate_custom_criterion and find_areas(custom=[…]), a mapUrl (the map coloured by it) and a one-line definition. Use the names as given: no brand names or value words ('good', 'cheap') in what you tell the user.

Eingabe-Schema

{
  "type": "object",
  "properties": {},
  "title": "list_custom_presetsArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "list_custom_presetsDictOutput"
}
🟢evaluate_custom_criterion(preset_id, criterion, direction, area_ids, top_n)

Evaluate a criterion from places on the map for every London neighbourhood ('where are more cafés than kebab shops', 'most gyms in the area'), counting the places inside each neighbourhood's boundary: a preset_id or the user's own criterion (sets of OSM tag matchers and a formula). Returns the best and worst areas with place counts and London percentiles, the legend and a map link that shows it as a layer. Places, never people: religion or who lives there is refused.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "preset_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "A ready-made criterion from list_custom_presets.",
      "title": "Preset Id"
    },
    "criterion": {
      "anyOf": [
        {
          "$ref": "#/$defs/CustomCriterionInput"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Or the user's own criterion."
    },
    "direction": {
      "anyOf": [
        {
          "enum": [
            "higher",
            "lower"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Which end the user wants (for the top list and the map link).",
      "title": "Direction"
    },
    "area_ids": {
      "description": "Also report these areas (LSOA ids from search_places).",
      "items": {
        "pattern": "^uk:lsoa:E\\d{8}$",
        "type": "string"
      },
      "maxItems": 10,
      "title": "Area Ids",
      "type": "array"
    },
    "top_n": {
      "default": 5,
      "description": "How many top and bottom areas to list.",
      "maximum": 5,
      "minimum": 1,
      "title": "Top N",
      "type": "integer"
    }
  },
  "$defs": {
    "CustomCriterionInput": {
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "Short id, e.g. 'kebab-cafe'.",
          "pattern": "^[a-z0-9-]{1,24}$",
          "title": "Id",
          "type": "string"
        },
        "label": {
          "description": "Name the user will see: descriptive, no brand or value words, e.g. 'Kebab shops vs cafés'.",
          "maxLength": 60,
          "minLength": 1,
          "title": "Label",
          "type": "string"
        },
        "sets": {
          "additionalProperties": {
            "$ref": "#/$defs/CustomSetInput"
          },
          "description": "Sets of places: a (required), b for balance/share, c optional for count/density.",
          "propertyNames": {
            "enum": [
              "a",
              "b",
              "c"
            ]
          },
          "title": "Sets",
          "type": "object"
        },
        "formula": {
          "description": "Prefer nearest for 'is one close' (straight-line walk minutes from the area's centre to the nearest A, up to 5 km) and per_resident for 'how much is around' (places in any set per 1,000 residents; the City of London is left out). The rest are counted inside each neighbourhood's boundary (the area shape on the map, not walking distance): count / density (per km² of the area) of places in any set; share A/(A+B); variety = distinct cuisines/sports among A; balance (A-B)/(A+B+5) from -1 (more B) to +1 (more A), advanced: few places keep an area near 0.",
          "enum": [
            "count",
            "density",
            "per_resident",
            "balance",
            "share",
            "variety",
            "nearest"
          ],
          "title": "Formula",
          "type": "string"
        },
        "radiusMetres": {
          "default": 800,
          "description": "Kept for compatibility with saved criteria and share links (200-2000 m); no formula uses it, so leave the default.",
          "maximum": 2000,
          "minimum": 200,
          "title": "Radiusmetres",
          "type": "integer"
        }
      },
      "required": [
        "id",
        "label",
        "sets",
        "formula"
      ],
      "title": "CustomCriterionInput",
      "type": "object"
    },
    "CustomSetInput": {
      "additionalProperties": false,
      "properties": {
        "label": {
          "description": "What the places are, e.g. 'Kebab shops'.",
          "maxLength": 60,
          "minLength": 1,
          "title": "Label",
          "type": "string"
        },
        "any": {
          "description": "OR of matchers; a matcher ANDs OpenStreetMap tag tests over amenity, shop, leisure, tourism, sport, cuisine, healthcare, craft, office and brand: a value, a list of values, '*' (has the tag) or null (has no such tag). E.g. [{\"cuisine\": \"kebab\"}], [{\"amenity\": \"cafe\", \"brand\": null}] for independent cafés, [{\"cuisine\": \"specialty_coffee\"}] for coffee-led shops (specialty coffee, not a café with coffee on the menu; never a big chain), [{\"brand\": \"Greggs\"}]. religion/denomination are refused: places, not people.",
          "items": {
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "object"
          },
          "maxItems": 6,
          "minItems": 1,
          "title": "Any",
          "type": "array"
        }
      },
      "required": [
        "label",
        "any"
      ],
      "title": "CustomSetInput",
      "type": "object"
    }
  },
  "title": "evaluate_custom_criterionArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "evaluate_custom_criterionDictOutput"
}
🟢build_watch_spec(name, area_ids, market, max_price, min_bedrooms, ...)

Turn a finished search into a watch: portal searches per postcode district, filters, a state file path for de-duplication and a ready prompt for a scheduled task in the user's Claude that reports only new listings. Stateless: nothing is stored on Close Knit.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Short name, e.g. 'Ealing 2-bed'.",
      "maxLength": 60,
      "minLength": 2,
      "title": "Name",
      "type": "string"
    },
    "area_ids": {
      "description": "LSOA ids to watch.",
      "items": {
        "type": "string"
      },
      "maxItems": 10,
      "minItems": 1,
      "title": "Area Ids",
      "type": "array"
    },
    "market": {
      "default": "buy",
      "enum": [
        "buy",
        "rent"
      ],
      "title": "Market",
      "type": "string"
    },
    "max_price": {
      "description": "£ (buy) or £ per month (rent).",
      "exclusiveMinimum": 0,
      "title": "Max Price",
      "type": "integer"
    },
    "min_bedrooms": {
      "default": 0,
      "maximum": 8,
      "minimum": 0,
      "title": "Min Bedrooms",
      "type": "integer"
    },
    "must_haves": {
      "default": "",
      "description": "Free-text requirements the agent checks per listing.",
      "maxLength": 500,
      "title": "Must Haves",
      "type": "string"
    },
    "frequency": {
      "default": "daily",
      "enum": [
        "daily",
        "weekly"
      ],
      "title": "Frequency",
      "type": "string"
    }
  },
  "required": [
    "name",
    "area_ids",
    "max_price"
  ],
  "title": "build_watch_specArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "build_watch_specDictOutput"
}
🟡send_feedback(kind, message, rating, tools, client)

Send feedback about Close Knit to the team: a bug, missing or wrong data, an idea, or what worked. Call it only after the user agrees: show them the message first. Describe the product and what happened, never the person: no names, contact details, addresses, family, budget or other personal circumstances.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "kind": {
      "description": "bug = a tool failed or misbehaved; missing-data / wrong-data = an answer lacked or got a fact wrong; idea = something to add; praise = what worked well.",
      "enum": [
        "bug",
        "missing-data",
        "wrong-data",
        "idea",
        "praise",
        "other"
      ],
      "title": "Kind",
      "type": "string"
    },
    "message": {
      "description": "What happened or what would help, in a few sentences: the product, never the person. No names, contact details, addresses, family or money circumstances.",
      "maxLength": 2000,
      "minLength": 10,
      "title": "Message",
      "type": "string"
    },
    "rating": {
      "anyOf": [
        {
          "maximum": 5,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "How useful Close Knit was, 1-5, if the user said.",
      "title": "Rating"
    },
    "tools": {
      "description": "The Close Knit tools it is about, e.g. ['find_areas'].",
      "items": {
        "type": "string"
      },
      "maxItems": 10,
      "title": "Tools",
      "type": "array"
    },
    "client": {
      "anyOf": [
        {
          "maxLength": 60,
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "The AI client, e.g. 'claude.ai'.",
      "title": "Client"
    }
  },
  "required": [
    "kind",
    "message"
  ],
  "title": "send_feedbackArguments"
}

Ausgabe-Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "send_feedbackDictOutput"
}

Community

Diesen Server bewerten

Nachweis

Aktuelle Beobachtungen

verifiziertVersion nicht aufgezeichnet24 Tools