Skip to main content
Glama
chrischall

booli-mcp

by chrischall

Search Booli for-sale listings

booli_search_listings
Read-onlyIdempotent

Search active for-sale property listings on Booli by area or location, filtering by price, rooms, size, plot, type, and construction year. Review paginated results to compare homes.

Instructions

Search active for-sale property listings on booli.se. Scope by area_id (from booli_search_areas) or a free-text location, and filter by price, rooms, living area, plot, object type, construction year. Paginated by page; check total_count/pages. Read-only.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page (default 1).
sortNoSort key (default: newest published).
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim PropertySummary/detail projection; "full" returns Booli's whole GraphQL node.
area_idNoBooli area id from booli_search_areas. Provide this OR `location`.
locationNoFree-text place name (e.g. "Nacka", "Södermalm") resolved to its top Booli area. Ignored when `area_id` is set.
ascendingNoSort ascending (default false).
max_roomsNo
min_roomsNo
object_typeNoProperty type(s), comma-separated, from: Lägenhet, Villa, Kedjehus-Parhus-Radhus, Fritidshus, Gård, Tomt/Mark.
max_plot_areaNom²
min_plot_areaNom²
max_list_priceNoSEK
min_list_priceNoSEK
max_living_areaNom²
min_living_areaNom²
max_list_sqm_priceNoSEK/m²
min_list_sqm_priceNoSEK/m²
is_new_constructionNotrue = only new production; false = exclude new production.
max_construction_yearNo
min_construction_yearNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv2.0.0
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. Changed2 schema fields changedv1.3.1
    • removedInput schema / properties / compact
      Removed value: -{
      -  "description": "Return slim summary records (default true). Set false for full raw fields.",
      -  "type": "boolean"
      -}
    • addedInput schema / properties / view
      Added value: +{
      +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim PropertySummary/detail projection; \"full\" returns Booli's whole GraphQL node.",
      +  "enum": [
      +    "compact",
      +    "full"
      +  ],
      +  "type": "string"
      +}
  3. Changed13 schema fields changedv1.0.0
    • changedInput schema / properties / area_id / description
      Previous value: -"Booli area id(s) from booli_search_areas, comma-separated for several (e.g. \"76,16\")."New value: +"Booli area id from booli_search_areas. Provide this OR `location`."
    • addedInput schema / properties / ascending
      Added value: +{
      +  "description": "Sort ascending (default false).",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / bbox
      Removed value: -{
      -  "description": "Bounding box \"lat_lo,lng_lo,lat_hi,lng_hi\" (SW then NE corner).",
      -  "type": "string"
      -}
    • removedInput schema / properties / center
      Removed value: -{
      -  "description": "Coordinate \"lat,lng\" (e.g. \"59.34674,18.0603\"); use with `dim`.",
      -  "type": "string"
      -}
    • removedInput schema / properties / dim
      Removed value: -{
      -  "description": "Rectangle size in metres \"w,h\" (e.g. \"400,500\"), used with `center`.",
      -  "type": "string"
      -}
    • removedInput schema / properties / limit
      Removed value: -{
      -  "description": "Default 30, max 100.",
      -  "maximum": 100,
      -  "minimum": 1,
      -  "type": "integer"
      -}
    • addedInput schema / properties / location
      Added value: +{
      +  "description": "Free-text place name (e.g. \"Nacka\", \"Södermalm\") resolved to its top Booli area. Ignored when `area_id` is set.",
      +  "type": "string"
      +}
    • removedInput schema / properties / max_rent
      Removed value: -{
      -  "description": "SEK/month",
      -  "minimum": 0,
      -  "type": "number"
      -}
    • changedInput schema / properties / object_type / description
      Previous value: -"Property type(s), comma-separated, from: villa, lägenhet, gård, tomt-mark, fritidshus, parhus, radhus, kedjehus."New value: +"Property type(s), comma-separated, from: Lägenhet, Villa, Kedjehus-Parhus-Radhus, Fritidshus, Gård, Tomt/Mark."
    • removedInput schema / properties / offset
      Removed value: -{
      -  "description": "Pagination offset.",
      -  "maximum": 9007199254740991,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • addedInput schema / properties / page
      Added value: +{
      +  "description": "1-based page (default 1).",
      +  "maximum": 9007199254740991,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • removedInput schema / properties / q
      Removed value: -{
      -  "description": "Free-text area search (e.g. \"Nacka\", \"Södermalm\"). One of q / area_id / center / bbox scopes the search.",
      -  "type": "string"
      -}
    • addedInput schema / properties / sort
      Added value: +{
      +  "description": "Sort key (default: newest published).",
      +  "enum": [
      +    "published",
      +    "listPrice",
      +    "listSqmPrice",
      +    "rooms",
      +    "livingArea",
      +    "rent",
      +    "plotArea"
      +  ],
      +  "type": "string"
      +}
  4. First observedv0.0.0

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so safety is covered; the description still adds value by disclosing pagination behavior and the total_count/pages fields to inspect in the response, which matters because there is no output schema. 'Read-only' is redundant with the annotation but harmless.

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

Conciseness4/5

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

Roughly three sentences, front-loaded with the resource and scope, then filters, then pagination. Nearly every clause earns its place; only the trailing 'Read-only' is filler given the annotation already states it.

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 20-parameter, zero-required search tool with no output schema, the description covers scope, filter families, pagination, and response count fields. Sort/view semantics and input ranges are left to the schema, which is acceptable, but a note on defaults or result limits would complete it.

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 description coverage is 80%, so the schema already documents nearly every parameter, including the area_id-vs-location precedence and enum values. The description adds only a grouped summary of filter categories (price, rooms, living area, plot, object type, construction year), which is the baseline for a well-covered schema.

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 and resource with scope: 'Search active for-sale property listings on booli.se.' The word 'active' plus 'for-sale' implicitly separates it from booli_search_sold, and it names booli_search_areas as the source of area_id, so an agent can route correctly without opening schemas.

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?

Gives clear usage context: scope by area_id or free-text location, filter by the listed dimensions, paginate by page. It routes the agent to booli_search_areas for area IDs but never states when to prefer a sibling such as booli_market_stats or booli_get_listing; there are no explicit exclusions.

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