{"tools":[{"name":"search_premises","title":"Search commercial premises","description":"Find shops, restaurant premises, offices, warehouses and other commercial premises for rent or sale anywhere in Spain. Describe the site in plain words in any language (brief), send criteria as data, or both (criteria override the brief). Returns exact counts (matching, all criteria stated, some not stated), the criteria as understood, and the best results: each with its data, what was met and what its text does not state, the sentence that matched, its coordinates (exact, or snapped to the centre of a ~500 m cell and marked approximate when the agency hides the address; none when it has no pin), a fit verdict read from its text, location figures when your account has location access (footfall, residents, nearby places, and in `location` the footfall split by weekday/weekend, time of day and where the activity comes from live, plus residents by age, households by income and spending power, each null when not stated or unknown, never 0 for unknown; `location_sources` gives each figure's unit, source and vintage, and when it was computed), and the agency's own listing link. Our fit verdict is one input: every raw figure is there for your own scoring. Up to 200 results a page (50 with a publishable key). `next_cursor` gets the next page: send it as `cursor` (alone, with `limit` if you like); the order is fixed when the search runs and stays the same for its 24 hours, so pages never repeat or skip a premises. `page` gives offset, limit and the total ranked. The read-through (`check`) runs only for pages of up to 50. Keep search_id to refine. Keywords only, no model: send just criteria.keywords and/or exclude_keywords (plus any data criteria) with no brief and check: false, e.g. {\"criteria\": {\"operation\": \"rent\", \"cities\": [\"madrid\"], \"keywords\": [[\"salida de humos\", \"sortida de fums\"], [\"esquina\", \"chaflán\"]], \"exclude_keywords\": [\"se traspasa\"]}, \"check\": false}; each keyword group met carries the sentence that matched (evidence) and the phrase it holds (matched).","inputSchema":{"type":"object","additionalProperties":false,"properties":{"brief":{"type":"string","description":"The site brief in plain words, e.g. \"burger restaurant, corner unit 120-250 m², smoke outlet, busy street, Madrid, rent under 8,000 a month\"."},"criteria":{"type":"object","additionalProperties":false,"description":"Criteria as data. Hard criteria (operation, cities, types, price, area) exclude properties outside them; the rest exclude only properties that state the opposite, and each result says which were met and which the property does not state.","properties":{"operation":{"type":"string","enum":["rent","sale","either"]},"cities":{"type":"array","items":{"type":"string"},"description":"Spanish towns or cities by name or slug (\"valencia\", \"Palma\"). Leave out for all of Spain."},"provinces":{"type":"array","items":{"type":"string","enum":["a-coruna","alava","albacete","alicante","almeria","asturias","avila","badajoz","barcelona","burgos","caceres","cadiz","cantabria","castellon","ceuta","ciudad-real","cordoba","cuenca","girona","granada","guadalajara","guipuzcoa","huelva","huesca","islas-baleares","jaen","la-rioja","las-palmas","leon","lleida","lugo","madrid","malaga","melilla","murcia","navarra","ourense","palencia","pontevedra","salamanca","santa-cruz-de-tenerife","segovia","sevilla","soria","tarragona","teruel","toledo","valencia","valladolid","vizcaya","zamora","zaragoza"]},"description":"Provinces; a property must be in one of them."},"districts":{"type":"array","items":{"type":"string"},"description":"Named districts or neighbourhoods in the cities (Centro, Malasaña, Chamberí, Eixample, Gràcia, Poblenou...). A property outside them is out; one that does not state its district stays, marked not stated."},"types":{"type":"array","items":{"type":"string","enum":["hotel","retail","warehouse","industrial","office","other_commercial"]}},"area_min":{"type":"number"},"area_max":{"type":"number"},"price_min":{"type":"number","description":"EUR: a month for rent, the total for a sale; applies to each operation without its own rent_/sale_ limit."},"price_max":{"type":"number"},"rent_price_min":{"type":"number","description":"EUR a month; compared only with rents."},"rent_price_max":{"type":"number","description":"EUR a month; compared only with rents. With sale_price_max, operation \"either\" keeps a property whose rent or sale price fits its own limit."},"sale_price_min":{"type":"number","description":"EUR total; compared only with sale prices."},"sale_price_max":{"type":"number"},"price_m2_min":{"type":"number","description":"EUR per m² of the property's area (a month for rent); a property with no stated area is \"not stated\"."},"price_m2_max":{"type":"number"},"rent_price_m2_min":{"type":"number"},"rent_price_m2_max":{"type":"number"},"sale_price_m2_min":{"type":"number"},"sale_price_m2_max":{"type":"number"},"street_level":{"type":"boolean"},"frontage_min_m":{"type":"number","description":"Facade length (fachada) in metres."},"frontage_max_m":{"type":"number"},"floors_min":{"type":"number","description":"Number of floors (plantas) the premises has."},"floors_max":{"type":"number"},"ceiling_min_m":{"type":"number"},"smoke_extraction":{"type":"boolean"},"corner":{"type":"boolean"},"shop_window":{"type":"boolean"},"open_plan":{"type":"boolean"},"step_free":{"type":"boolean"},"loading_access":{"type":"boolean"},"licence":{"type":"string","enum":["food_service","retail","office","gym","none"]},"licence_activities":{"type":"array","items":{"type":"string"},"description":"Activities its licence sentence must name, in Spanish or Catalan: cafetería, panadería, restaurante..."},"transfer_price_min":{"type":"number","description":"Transfer fee (traspaso) in EUR; met when its stated range overlaps."},"transfer_price_max":{"type":"number"},"business_transfer":{"type":"boolean","description":"true: only business transfers (traspasos); false: none."},"business_types":{"type":"array","items":{"type":"string"},"description":"Uses its text says it suits, in English: restaurant, cafe, gym..."},"keywords":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Groups of phrases; a property meets a group when its text holds any phrase. Write phrases as Spanish agencies do."},"exclude_keywords":{"type":"array","items":{"type":"string"},"description":"Leave out properties whose text holds any of these."},"footfall_min":{"type":"number","description":"Minimum footfall index within a 5-minute walk (an index of pedestrian activity that compares places; not a head count). Needs location data access."},"pop_walk10_min":{"type":"number","description":"Residents within a 10-minute walk. Needs location data access."},"pop_drive10_min":{"type":"number","description":"Residents within a 10-minute drive. Needs location data access."},"transit_min":{"type":"number","description":"Stations and stops within a 5-minute walk. Needs location data access."},"competitors_max":{"type":"array","description":"At most this many places of a kind within a 5-minute walk (gyms: 10). Needs location data access.","items":{"type":"object","properties":{"kind":{"type":"string","enum":["restaurants","fast_food","cafes","shops","supermarkets","gyms"]},"max":{"type":"number"}},"required":["kind","max"]}},"own_stores_away_m":{"type":"number","description":"No store from your own list (upload it with PUT /v1/stores) within this many metres of the premises, straight-line, 1-1,000. Needs an exact pin."},"competitors_near_max":{"type":"array","description":"At most `max` businesses of a segment (or of the named `chains`) within `within_m` straight-line metres (1-1,000), from Overture Maps places. A property with an approximate pin gets no verdict.","items":{"type":"object","properties":{"segment":{"type":"string","enum":["gym","burger","fast_food","coffee","bakery","pharmacy","supermarket","fashion","pizza"]},"within_m":{"type":"number"},"max":{"type":"number"},"chains":{"type":"array","items":{"type":"string"},"description":"Only these brands count (rivals or your own), e.g. Burger King, Basic-Fit. Matched on Overture brand and name."}},"required":["segment","within_m","max"]}},"spending_per_resident_min":{"type":"number","description":"Spending power a resident a year (EUR) within a 10-minute walk. Needs location data access."},"high_income_share_min":{"type":"number","description":"% of households within a 10-minute walk with net income above 40,162 EUR a year. Needs location data access."},"age_shares_min":{"type":"array","description":"Minimum % of residents within a 10-minute walk in an age band. Needs location data access.","items":{"type":"object","properties":{"band":{"type":"string","enum":["0_14","15_29","30_44","45_59","60p"]},"min_pct":{"type":"number"}},"required":["band","min_pct"]}},"meaning":{"type":"string","description":"A wish no field holds, in any language; ranks results, never filters."},"sort":{"type":"string","enum":["best","price_asc","price_desc","area_desc","footfall_desc","supply_gap"],"description":"supply_gap ranks where residents per similar place is highest (residents within a 10-minute walk / (places within gap_radius_m, 600 m by default, + 1)); needs gap_segment or one competitors_near_max segment. Needs location data access; unscored properties go last."},"gap_segment":{"type":"string","enum":["gym","burger","fast_food","coffee","bakery","pharmacy","supermarket","fashion","pizza"],"description":"The business kind the supply_gap sort counts."},"gap_radius_m":{"type":"integer","enum":[300,600],"description":"Radius in metres in which the supply_gap sort counts similar places: 600 (default) or 300 (about a 5-minute walk). Only with sort supply_gap."}}},"limit":{"type":"integer","minimum":1,"maximum":200,"default":10,"description":"Results a page, up to 200; above 50 check is off."},"cursor":{"type":"string","description":"next_cursor from an earlier answer: returns that search's next page, same criteria and order. Send without brief, criteria or change."},"check":{"type":"boolean","default":true,"description":"Read the top results' text against the brief (adds a few seconds). Off above 50 results a page and on later pages."},"insights":{"type":"boolean","default":false,"description":"Add `insights`, charts as data over every match, each with a one-sentence answer, its count, scope, source and date: per criterion how many matches meet it, leave it unsaid or contradict it (and how many would state everything without it); with one price limit, what it reaches among premises of this kind and place before the limit, else what the matches ask per m²; and where the matches are by district or town. Asking prices; each unit counted once."}}}},{"name":"refine_search","title":"Refine a search","description":"Change part of an earlier search in plain words (\"bigger, at least 200 m²\", \"Barcelona too\", \"drop the corner\") and run it again, as a new search with its own search_id and pages. Uses the search_id from search_premises; searches are kept 24 hours. Results as search_premises gives them, location figures with `location_sources`. Up to 200 results a page (50 with a publishable key). `next_cursor` gets the next page: send it as `cursor` (alone, with `limit` if you like); the order is fixed when the search runs and stays the same for its 24 hours, so pages never repeat or skip a premises. `page` gives offset, limit and the total ranked. The read-through (`check`) runs only for pages of up to 50.","inputSchema":{"type":"object","additionalProperties":false,"required":["search_id"],"properties":{"search_id":{"type":"string"},"change":{"type":"string","description":"What to change, in plain words. Required unless cursor is sent."},"limit":{"type":"integer","minimum":1,"maximum":200,"default":10,"description":"Results a page, up to 200; above 50 check is off."},"cursor":{"type":"string","description":"next_cursor from an earlier answer: returns that search's next page, same criteria and order. Send without brief, criteria or change."},"check":{"type":"boolean","default":true},"insights":{"type":"boolean","default":false,"description":"Add `insights`, charts as data over every match, each with a one-sentence answer, its count, scope, source and date: per criterion how many matches meet it, leave it unsaid or contradict it (and how many would state everything without it); with one price limit, what it reaches among premises of this kind and place before the limit, else what the matches ask per m²; and where the matches are by district or town. Asking prices; each unit counted once."}}}},{"name":"get_premises","title":"Get one premises","description":"One premises in full by the id a search returned: its data, facts read from its text with the sentence each came from (fact_sources), its coordinates (exact, or approximate: snapped to a ~500 m cell), location figures (with location access), an excerpt, up to 8 photos (`photos`: Casafari thumbnail URLs; search results carry the first 4, and `photo_source` names the advertiser and page they come from), and the agency's own listing link (`agency_links` lists every agency's own page for the premises, never a portal's, earliest first). `energy` is the energy certificate as the ad advertises it, unverified: not checked against the official register (rating and emissions rating A to G, kWh/m² and kg CO2/m² a year, each null when not stated; null until read); `energy.official` is the regional register's certificate, only when it is matched on this unit and declares commercial use, with the register and the attribution its licence asks for (else null). `status` says whether it is still on the market. `timeline` gives when it was first listed (`listed_since`, `days_listed`) and, per live operation, the first and current asking price, the number of price cuts, the change in percent and the asking-price periods (`history`); null fields are not stated.","inputSchema":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string"},"insights":{"type":"boolean","default":false,"description":"Add `insights`, charts as data, each with a one-sentence answer, its count, scope, source and date: its asking price per m² against comparable premises nearby (same type, operation and district, half to twice its size), footfall by part of the day and where its location figures rank in the city (location access only), straight-line distances to businesses of each kind within 1 km (Overture Maps), other premises on the market within 500 m, and the monthly average asking price per m² of its type in its town over three years with the change in a year (Casafari Area Insights); `prices_here`, what active properties of its type ask per m² for rent and for sale in its district (then town, then province: the first with 10 priced units), quartiles from 10 and medians from 5, the town's rows beside it and medians by size band; `supply_flow`, from Claro's nightly count (`market_daily`, since 8 Oct 2026): units of its type and operation on the market in its town (or province) on the latest day, properties that came on and left over 30 days, and the median asking price per m² at both ends, with a note when fewer than 7 days are recorded; and `time_on_market`, the average days on the market by asking price band of properties of its type within 1 km (Casafari Area Insights; the ~500 m cell's centre when the address is hidden); and `similar`: up to six other active premises of the same type and operation, half to twice its size, within 1.5 km (from the ~500 m cell's centre for a hidden address), else its district, else its town, nearest first then closest in asking price per m², each with its id, one Casafari thumbnail and the agency's own listing page only (never a portal or a private seller). Asking prices, not agreed ones; each unit counted once. Also adds `nearby`, the map's layers: businesses of the tracked kinds within 500 m (Overture Maps; exact addresses only) and other premises on the market within 500 m as points, nearest first (a hidden address as the centre of its ~500 m cell), and the area a 5-minute walk reaches as GeoJSON MultiPolygon coordinates (location access and an exact address only). Asking prices, not agreed ones; each unit counted once. Also adds `nearby`, the map's layers: businesses of the tracked kinds within 500 m (Overture Maps; exact addresses only) and other premises on the market within 500 m as points, nearest first (a hidden address as the centre of its ~500 m cell), and the area a 5-minute walk reaches as GeoJSON MultiPolygon coordinates (location access and an exact address only). With location access and an exact address, `location_detail`: figures in groups (reach, residents, visitors, health_education, transport_parking, offices_hotels, retail_food), each with a stable key, label, value, unit, scope, source, date and a percentile in the city for figures stored for every property; the 10 nearest named places per kind with walking minutes (OpenStreetMap through Targomo); and the 10-minute walk. A figure Targomo does not have for the point is left out, never 0. With location access, `scorecard`: every location figure held for the premises (the stored location row, `location_detail`, `footfall_detail` and `access`), grouped as `location_detail` is, each with its scope, source and date and, for figures stored for every property, its percentile among premises of its type in the city (`city`) and in its district when 50 or more are measured there (`district`): the share with a lower figure, each unit once. Live figures carry no percentile and a note saying so; a 0 footfall or population is unknown and never ranked. `strongest` and `weakest` name the five row keys with the highest and lowest city percentiles."},"segments":{"type":"array","items":{"type":"string","enum":["gym","burger","fast_food","coffee","bakery","pharmacy","supermarket","fashion","pizza"]},"description":"Business kinds to list first in the distances chart (the brief's competitors)."},"assessment":{"type":"boolean","default":false,"description":"With insights: add `site_assessment` first, a site assessment written by Gemini from this premises' own figures only (its data, its facts with their quotes, the market and competition charts, and with location access the location figures and ranks): 3 to 5 summary sentences, strengths and watch-outs, and a verdict (strong, fair, weak, not_assessable) for quick-service restaurants, coffee and bakery, clinic and pharmacy, fitness, fashion and retail, and supermarket and convenience, each reason with the keys of the figures it rests on. Every number is checked against those figures and a sentence that fails is dropped (counted in `notes`); a missing figure is not stated, never a weakness. `scope` is with_location or listing_only. Stored per premises and inputs; the first request for new inputs waits for the model."}}}},{"name":"compare_premises","title":"Compare premises","description":"2 to 10 premises side by side, by the ids a search returned.","inputSchema":{"type":"object","additionalProperties":false,"required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":10}}}},{"name":"market_snapshot","title":"What premises ask in a place","description":"What commercial premises of a kind ask in a place anywhere in Spain, from every active property of that kind and place (each unit counted once): the asking price per m² as a distribution with its median and middle half, by size band, by district or town, and for one town or province the monthly average over three years with the change in a year, the properties on the market and their days on the market (Casafari Area Insights). Ask in plain words (question: \"what does retail rent for in Chamberí?\") or send criteria as data (place, types, operation, optional size range); other criteria are ignored. Asking prices, not agreed ones; at least 10 properties or no figures. Returns the criteria as understood and `insights`: charts as data, each with a one-sentence answer, its count, scope, source and date.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"question":{"type":"string","description":"The question in plain words, any language: \"what do offices rent for in Valencia?\""},"criteria":{"type":"object","additionalProperties":false,"description":"Criteria as data. Hard criteria (operation, cities, types, price, area) exclude properties outside them; the rest exclude only properties that state the opposite, and each result says which were met and which the property does not state.","properties":{"operation":{"type":"string","enum":["rent","sale","either"]},"cities":{"type":"array","items":{"type":"string"},"description":"Spanish towns or cities by name or slug (\"valencia\", \"Palma\"). Leave out for all of Spain."},"provinces":{"type":"array","items":{"type":"string","enum":["a-coruna","alava","albacete","alicante","almeria","asturias","avila","badajoz","barcelona","burgos","caceres","cadiz","cantabria","castellon","ceuta","ciudad-real","cordoba","cuenca","girona","granada","guadalajara","guipuzcoa","huelva","huesca","islas-baleares","jaen","la-rioja","las-palmas","leon","lleida","lugo","madrid","malaga","melilla","murcia","navarra","ourense","palencia","pontevedra","salamanca","santa-cruz-de-tenerife","segovia","sevilla","soria","tarragona","teruel","toledo","valencia","valladolid","vizcaya","zamora","zaragoza"]},"description":"Provinces; a property must be in one of them."},"districts":{"type":"array","items":{"type":"string"},"description":"Named districts or neighbourhoods in the cities (Centro, Malasaña, Chamberí, Eixample, Gràcia, Poblenou...). A property outside them is out; one that does not state its district stays, marked not stated."},"types":{"type":"array","items":{"type":"string","enum":["hotel","retail","warehouse","industrial","office","other_commercial"]}},"area_min":{"type":"number"},"area_max":{"type":"number"},"price_min":{"type":"number","description":"EUR: a month for rent, the total for a sale; applies to each operation without its own rent_/sale_ limit."},"price_max":{"type":"number"},"rent_price_min":{"type":"number","description":"EUR a month; compared only with rents."},"rent_price_max":{"type":"number","description":"EUR a month; compared only with rents. With sale_price_max, operation \"either\" keeps a property whose rent or sale price fits its own limit."},"sale_price_min":{"type":"number","description":"EUR total; compared only with sale prices."},"sale_price_max":{"type":"number"},"price_m2_min":{"type":"number","description":"EUR per m² of the property's area (a month for rent); a property with no stated area is \"not stated\"."},"price_m2_max":{"type":"number"},"rent_price_m2_min":{"type":"number"},"rent_price_m2_max":{"type":"number"},"sale_price_m2_min":{"type":"number"},"sale_price_m2_max":{"type":"number"},"street_level":{"type":"boolean"},"frontage_min_m":{"type":"number","description":"Facade length (fachada) in metres."},"frontage_max_m":{"type":"number"},"floors_min":{"type":"number","description":"Number of floors (plantas) the premises has."},"floors_max":{"type":"number"},"ceiling_min_m":{"type":"number"},"smoke_extraction":{"type":"boolean"},"corner":{"type":"boolean"},"shop_window":{"type":"boolean"},"open_plan":{"type":"boolean"},"step_free":{"type":"boolean"},"loading_access":{"type":"boolean"},"licence":{"type":"string","enum":["food_service","retail","office","gym","none"]},"licence_activities":{"type":"array","items":{"type":"string"},"description":"Activities its licence sentence must name, in Spanish or Catalan: cafetería, panadería, restaurante..."},"transfer_price_min":{"type":"number","description":"Transfer fee (traspaso) in EUR; met when its stated range overlaps."},"transfer_price_max":{"type":"number"},"business_transfer":{"type":"boolean","description":"true: only business transfers (traspasos); false: none."},"business_types":{"type":"array","items":{"type":"string"},"description":"Uses its text says it suits, in English: restaurant, cafe, gym..."},"keywords":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Groups of phrases; a property meets a group when its text holds any phrase. Write phrases as Spanish agencies do."},"exclude_keywords":{"type":"array","items":{"type":"string"},"description":"Leave out properties whose text holds any of these."},"footfall_min":{"type":"number","description":"Minimum footfall index within a 5-minute walk (an index of pedestrian activity that compares places; not a head count). Needs location data access."},"pop_walk10_min":{"type":"number","description":"Residents within a 10-minute walk. Needs location data access."},"pop_drive10_min":{"type":"number","description":"Residents within a 10-minute drive. Needs location data access."},"transit_min":{"type":"number","description":"Stations and stops within a 5-minute walk. Needs location data access."},"competitors_max":{"type":"array","description":"At most this many places of a kind within a 5-minute walk (gyms: 10). Needs location data access.","items":{"type":"object","properties":{"kind":{"type":"string","enum":["restaurants","fast_food","cafes","shops","supermarkets","gyms"]},"max":{"type":"number"}},"required":["kind","max"]}},"own_stores_away_m":{"type":"number","description":"No store from your own list (upload it with PUT /v1/stores) within this many metres of the premises, straight-line, 1-1,000. Needs an exact pin."},"competitors_near_max":{"type":"array","description":"At most `max` businesses of a segment (or of the named `chains`) within `within_m` straight-line metres (1-1,000), from Overture Maps places. A property with an approximate pin gets no verdict.","items":{"type":"object","properties":{"segment":{"type":"string","enum":["gym","burger","fast_food","coffee","bakery","pharmacy","supermarket","fashion","pizza"]},"within_m":{"type":"number"},"max":{"type":"number"},"chains":{"type":"array","items":{"type":"string"},"description":"Only these brands count (rivals or your own), e.g. Burger King, Basic-Fit. Matched on Overture brand and name."}},"required":["segment","within_m","max"]}},"spending_per_resident_min":{"type":"number","description":"Spending power a resident a year (EUR) within a 10-minute walk. Needs location data access."},"high_income_share_min":{"type":"number","description":"% of households within a 10-minute walk with net income above 40,162 EUR a year. Needs location data access."},"age_shares_min":{"type":"array","description":"Minimum % of residents within a 10-minute walk in an age band. Needs location data access.","items":{"type":"object","properties":{"band":{"type":"string","enum":["0_14","15_29","30_44","45_59","60p"]},"min_pct":{"type":"number"}},"required":["band","min_pct"]}},"meaning":{"type":"string","description":"A wish no field holds, in any language; ranks results, never filters."},"sort":{"type":"string","enum":["best","price_asc","price_desc","area_desc","footfall_desc","supply_gap"],"description":"supply_gap ranks where residents per similar place is highest (residents within a 10-minute walk / (places within gap_radius_m, 600 m by default, + 1)); needs gap_segment or one competitors_near_max segment. Needs location data access; unscored properties go last."},"gap_segment":{"type":"string","enum":["gym","burger","fast_food","coffee","bakery","pharmacy","supermarket","fashion","pizza"],"description":"The business kind the supply_gap sort counts."},"gap_radius_m":{"type":"integer","enum":[300,600],"description":"Radius in metres in which the supply_gap sort counts similar places: 600 (default) or 300 (about a 5-minute walk). Only with sort supply_gap."}}}}}},{"name":"explain_location","title":"Location figures","description":"Footfall index (an index of pedestrian activity within a 5-minute walk that compares places with each other; not a head count, never people or visitors a day; split into weekday and weekend averages, morning/lunch/afternoon/evening and local/commuter/tourist shares of the index), residents within a 10-minute walk and drive (by age band 0-14, 15-29, 30-44, 45-59, 60+, with households, households per net income quintile and total spending power within a 10-minute walk), and nearby restaurants, fast food, cafes, shops, supermarkets, gyms and transit stops, for a premises id or any point (lat, lon) in Spain. Needs location data access on your account; a point that is not a premises is a live call on your account's location key (about 31 Targomo operations per point). A figure Targomo has no data for is null, never 0.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"}}}},{"name":"brief_from_file","title":"Read a brief from a file","description":"The premises requirements a file states (a site brief, a location profile, a requirements sheet): a PDF, a photo or scan (JPG, PNG, WebP, HEIC), a Word, Excel or PowerPoint file (or OpenDocument), or text, sent as base64 in `content_base64` with its `media_type` and, best, its `filename`. Up to 10 MB. Accepted: .pdf,.jpg,.jpeg,.png,.webp,.heic,.heif,.txt,.md,.csv,.tsv,.html,.htm,.rtf,.json,.xml,.docx,.xlsx,.pptx,.odt,.ods,.odp. Returns `brief` (the requirements in plain words), `requirements` (each with the file's own words as `quote`) and `quotes_checked` (true for Office and text files, where a requirement whose quote is not in the text is dropped; false for PDFs and images). Show the brief to the user to check, then pass it to search_premises; nothing is searched here. The file is not stored.","inputSchema":{"type":"object","additionalProperties":false,"required":["content_base64","media_type"],"properties":{"content_base64":{"type":"string","description":"The file's bytes, base64."},"media_type":{"type":"string","description":"The file's media type, e.g. application/pdf, image/jpeg, text/plain, application/vnd.openxmlformats-officedocument.wordprocessingml.document."},"filename":{"type":"string","description":"The file's name with its extension, e.g. perfil.docx."}}}},{"name":"search_plots","title":"Search commercial plots (Germany)","description":"Find plots of land for sale or rent in Germany for a commercial building, from Casafari's property graph. Plots only, never premises: counts and results come from a separate set, one result per plot however many agencies advertise it (the others in also_listed_by). Criteria are data: Länder (regions), municipalities, postcodes, plot type, operation, plot area, sale price and price per m², keywords in the property's own words, and `commercial_use`, how far the property's own text says a commercial building can go on the plot. Levels: zoned_commercial (GE, GI, MK, MU stated), zoned_mixed_or_special (MI, SO, MD stated: check the plan), commercial_use_stated (commercial use stated as allowed or suitable, no class: read the quote), building_land_use_not_stated, residential_only_stated, zoned_leisure_special (SO for recreation), not_building_land_stated, not_stated. The default is the first three; send \"all\" or any list to widen it. Each result gives its level with the quote it rests on and, for a stated class, zoning_source (a Flächennutzungsplan is not binding), the facts read from the text (zoning class, serviced, B-Plan, §34/§35, building permit, GRZ, GFZ), an excerpt and the agency's link. The level is what the property's text says, not a zoning check; coordinates are approximate.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"criteria":{"type":"object","additionalProperties":false,"properties":{"regions":{"type":"array","items":{"type":"string"},"description":"Länder by name or slug: \"Bayern\", \"nordrhein-westfalen\"."},"municipalities":{"type":"array","items":{"type":"string"},"description":"Towns or cities as the property's data names them: \"München\", \"Leipzig\"."},"zipcodes":{"type":"array","items":{"type":"string"},"description":"Postcodes or their first digits: \"80331\", \"04\"."},"plot_types":{"type":"array","items":{"type":"string","enum":["building_plot","rural_plot"]},"description":"building_plot (Grundstück) or rural_plot (agricultural, forest and other land)."},"operation":{"type":"string","enum":["sale","rent","either"]},"plot_area_min":{"type":"number","description":"m²; a plot that states no area is out."},"plot_area_max":{"type":"number"},"sale_price_min":{"type":"number","description":"EUR total."},"sale_price_max":{"type":"number"},"sale_price_m2_max":{"type":"number","description":"EUR per m² of plot area."},"commercial_use":{"oneOf":[{"type":"string","enum":["all"]},{"type":"array","items":{"type":"string","enum":["zoned_commercial","zoned_mixed_or_special","commercial_use_stated","building_land_use_not_stated","residential_only_stated","zoned_leisure_special","not_building_land_stated","not_stated"]}}],"description":"Levels to keep; default zoned_commercial, zoned_mixed_or_special, commercial_use_stated."},"serviced":{"type":"boolean","description":"true: drop plots whose text says they are not serviced (unerschlossen); plots that do not say stay."},"keywords":{"type":"array","items":{"type":"string"},"description":"Words or phrases the property's text must contain, all of them: \"Gleisanschluss\", \"Autobahn\"."}}},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20},"offset":{"type":"integer","minimum":0,"default":0,"description":"Results to skip, for the next page."},"sort":{"type":"string","enum":["commercial_use","newest","price_asc","area_desc","price_m2_asc"],"default":"commercial_use"}}}},{"name":"get_plot","title":"Get one plot","description":"One plot in full by the id search_plots returned: its data, commercial-use level, the facts read from its text with the quote each came from (fact_sources), an excerpt, the agency's link and the other agencies advertising it (also_listed_by).","inputSchema":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string"}}}}]}