Skip to main content
Glama

Search places

search_places
Read-onlyIdempotent

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, local authorities (uk:lad:…; London's boroughs) for find_areas.boroughs, areas (with ladId) and addresses for get (typed ids: uk:lsoa:…, pc:…, uprn:…) and assess_listing, and venues (a pool, gym or sports centre by name, with latitude/longitude to pin as a place). best is the likeliest meaning: a venue named exactly so, then a town, city or council named exactly so above a stop that only shares the name; 'Liverpool St' is the station. A street found only outside the town typed gives best null, reason town-mismatch and candidates with their towns: ask which. query is an alias of q.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "search_places"
  }
}

Input Schema

NameRequiredDescriptionDefault
qNo[search: contains] Any case: a station, borough, neighbourhood, street or venue (a pool, gym, sports centre). A full postcode matches exactly.
limitNo[paging] Results per kind.
queryNo[search: contains] Alias of q.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • removedInput schema / $defs
      Removed value: -{
      -  "RatePrevious": {
      -    "properties": {
      -      "bad": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[input value] What was wrong, missing or confusing.",
      -        "title": "Bad"
      -      },
      -      "call_id": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[id] The callId of the answer you are rating; leave it out when answers carry none.",
      -        "title": "Call Id"
      -      },
      -      "fix": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[input value] The change to the tool or its answer you would want.",
      -        "title": "Fix"
      -      },
      -      "good": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[input value] What was useful in the answer.",
      -        "title": "Good"
      -      },
      -      "rating": {
      -        "description": "[input value] 1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed.",
      -        "title": "Rating",
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "rating"
      -    ],
      -    "title": "RatePrevious",
      -    "type": "object"
      -  }
      -}
    • removedInput schema / properties / intent
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "[input value] Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances.",
      -  "title": "Intent"
      -}
    • removedInput schema / properties / rate_previous
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "$ref": "#/$defs/RatePrevious"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "[input value] Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
      -}
  2. Changed10 schema fields changed
    • changedInput schema / $defs / RatePrevious / properties / bad / description
      Previous value: -"What was wrong, missing or confusing."New value: +"[input value] What was wrong, missing or confusing."
    • changedInput schema / $defs / RatePrevious / properties / call_id / description
      Previous value: -"The callId of the answer you are rating; leave it out when answers carry none."New value: +"[id] The callId of the answer you are rating; leave it out when answers carry none."
    • changedInput schema / $defs / RatePrevious / properties / fix / description
      Previous value: -"The change to the tool or its answer you would want."New value: +"[input value] The change to the tool or its answer you would want."
    • changedInput schema / $defs / RatePrevious / properties / good / description
      Previous value: -"What was useful in the answer."New value: +"[input value] What was useful in the answer."
    • changedInput schema / $defs / RatePrevious / properties / rating / description
      Previous value: -"1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed."New value: +"[input value] 1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed."
    • changedInput schema / properties / intent / description
      Previous value: -"Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances."New value: +"[input value] Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances."
    • changedInput schema / properties / limit / description
      Previous value: -"Results per kind."New value: +"[paging] Results per kind."
    • changedInput schema / properties / q / description
      Previous value: -"A station, borough, neighbourhood, postcode, street or venue (a pool, gym, sports centre)."New value: +"[search: contains] Any case: a station, borough, neighbourhood, street or venue (a pool, gym, sports centre). A full postcode matches exactly."
    • changedInput schema / properties / query / description
      Previous value: -"Alias of q."New value: +"[search: contains] Alias of q."
    • changedInput schema / properties / rate_previous / description
      Previous value: -"Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."New value: +"[input value] Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
  3. Changed6 schema fields changed
    • addedInput schema / $defs / RatePrevious / properties / call_id / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / $defs / RatePrevious / properties / call_id / default
      Added value: +null
    • changedInput schema / $defs / RatePrevious / properties / call_id / description
      Previous value: -"The callId of the answer you are rating."New value: +"The callId of the answer you are rating; leave it out when answers carry none."
    • removedInput schema / $defs / RatePrevious / properties / call_id / type
      Removed value: -"string"
    • changedInput schema / $defs / RatePrevious / required
      Previous value: -[
      -  "call_id",
      -  "rating"
      -]New value: +[
      +  "rating"
      +]
    • changedInput schema / properties / rate_previous / description
      Previous value: -"Optional: your rating of an earlier Close Knit answer, by the callId it carried. Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."New value: +"Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
  4. Changed7 schema fields changed
    • addedInput schema / properties / q / anyOf
      Added value: +[
      +  {
      +    "maxLength": 120,
      +    "minLength": 2,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / q / default
      Added value: +null
    • changedInput schema / properties / q / description
      Previous value: -"A station, borough, neighbourhood, postcode or street."New value: +"A station, borough, neighbourhood, postcode, street or venue (a pool, gym, sports centre)."
    • removedInput schema / properties / q / minLength
      Removed value: -2
    • removedInput schema / properties / q / type
      Removed value: -"string"
    • addedInput schema / properties / query
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 120,
      +      "minLength": 2,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Alias of q.",
      +  "title": "Query"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "q"
      -]
  5. Changed3 schema fields changed
    • addedInput schema / $defs
      Added value: +{
      +  "RatePrevious": {
      +    "properties": {
      +      "bad": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "What was wrong, missing or confusing.",
      +        "title": "Bad"
      +      },
      +      "call_id": {
      +        "description": "The callId of the answer you are rating.",
      +        "title": "Call Id",
      +        "type": "string"
      +      },
      +      "fix": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The change to the tool or its answer you would want.",
      +        "title": "Fix"
      +      },
      +      "good": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "What was useful in the answer.",
      +        "title": "Good"
      +      },
      +      "rating": {
      +        "description": "1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed.",
      +        "title": "Rating",
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "call_id",
      +      "rating"
      +    ],
      +    "title": "RatePrevious",
      +    "type": "object"
      +  }
      +}
    • addedInput schema / properties / intent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances.",
      +  "title": "Intent"
      +}
    • addedInput schema / properties / rate_previous
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/RatePrevious"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Optional: your rating of an earlier Close Knit answer, by the callId it carried. Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
      +}
  6. First observed

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare read-only/idempotent/non-destructive; the description adds substantial behavior beyond that: fuzzy spelling tolerance, London code and nickname knowledge (KX, TCR, E&C, ally pally), exact-postcode matching, twin stations listed separately, and the ranking rule for 'best' (exact venue, then exact town/council, above a name-sharing stop). It also discloses the failure mode (best null with reason 'town-mismatch' plus candidates) and the expected agent follow-up, which is unusually complete for a lookup tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, and every clause carries information, but the body is a single dense block of semicolon-chained clauses with heavy namespace shorthand (osm:…, uk:lad:…, pc:…) that is slow to parse. It earns its length on content but loses points on readability and structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a fuzzy multi-kind resolver with an output schema and full annotation coverage, the description covers return kinds, ranking, and the main ambiguity path. The gaps are minor: the reference to an implicit 'town typed' with no corresponding parameter, and no mention of how limit shapes the per-kind result set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so q/query/limit are already documented, and 'query is an alias of q' merely repeats the schema's own 'Alias of q'. The description adds no syntax or format detail for limit or paging, and it refers to 'the town typed' even though no town parameter exists in the schema, which is a small semantic mismatch rather than added clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Resolve a place the user mentions ... to ids') and enumerates the entity kinds handled (station, borough, neighbourhood, postcode, street, venue) along with the id namespaces returned (osm:, uk:lad:, uk:lsoa:, pc:, uprn:). It also names the downstream consumers (find_areas.near_stations, find_areas.boroughs, get, assess_listing), which lets an agent separate it from get_places/search_areas without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is clear through routing: results are typed for find_areas.near_stations, find_areas.boroughs, get and assess_listing, and the description explicitly handles the ambiguous case ('A street found only outside the town typed gives best null ... ask which'). It does not state when to prefer a sibling such as get_places or search_areas instead, so it stops short of explicit alternatives/exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.