MCLL Real Estate
MCLL (mcllrealestate.com) is a Thai real-estate firm. This skill lets an agent search
and read published sale and rent listings across Bangkok, Phuket, and the islands.
Everything here is read-only public data; no key or login is needed.
Pick the access method your runtime supports. MCP and REST return listings; Markdown
also renders the area, news, and development pages.
1. MCP server (prefer this)
Streamable-HTTP MCP endpoint: https://mcllrealestate.com/api/mcp
Server card: https://mcllrealestate.com/.well-known/mcp/server-card.json
Three tools:
search_listings: find listings. Args: type ("sale" | "rent", required),
locale (en/fr/th/zh, default en), and optional city, area,
propertyType (human names such as "Phuket" or "Condo"), bedrooms, minPrice,
maxPrice (THB), page. Returns { total, page, results: [{ id, title, url, transactionType, city, area, bedrooms, bathrooms, areaSqm, priceThb, image }] }.
Each result's url
ends in a slug you pass to get_listing.
get_listing: full detail of one listing. Args: type ("sale"|"rent"),
slug (from a search result), locale. Returns price, size, features, coordinates,
and a Markdown description.
execute: MCLL Code Mode. Args: code (JavaScript string). Runs server-side
in a Cloudflare Worker sandbox with global mcll.search(args) and mcll.get(args).
No open network, filesystem, environment variables, secrets, or writes. Use return
for the JSON-serializable result; top-level await works. Best for comparing,
ranking, or computing across many listings in one call.
Example execute code:
const { results } = await mcll.search({ type: "sale", city: "Bangkok", page: 1 });
const details = await Promise.all(
results.slice(0, 2).map((r) =>
mcll.get({ type: "sale", slug: r.url.split("/").pop(), locale: "en" }),
),
);
return details.filter((d) => d !== null).map((d) => ({
title: d.title,
url: d.url,
pricePerSqm: d.priceThb && d.areaSqm ? Math.round(d.priceThb / d.areaSqm) : null,
}));
2. REST API (no MCP client needed)
OpenAPI: https://mcllrealestate.com/api/openapi.json
- Search:
GET /api/listings?type=sale|rent&locale=en plus optional filters. Note
these filters take ids (UUIDs), not names: city, area, propertyType,
bedrooms, bathrooms, priceMin, priceMax, sizeMin, sizeMax, furnished,
features, sort, page. Returns { total, page, results }, where each result has
the same safe public projection as MCP search: absolute url, public image URL, price
fields, city/area names, and no admin-only fields. For name-based filtering such as
"condos in Phuket", use the MCP search_listings tool, which resolves names to ids
for you.
- Detail:
GET /api/listings/{type}/{slug}?locale=en returns one listing as JSON, with a
Markdown description. type is sale or rent; slug comes from a listing URL's
last path segment.
# Detail of a known listing (slug from its public URL):
curl -s "https://mcllrealestate.com/api/listings/sale/kamala-cliff-villa?locale=en"
# Search (sale listings, page 1):
curl -s "https://mcllrealestate.com/api/listings?type=sale&locale=en"
3. Markdown content negotiation
Send Accept: text/markdown to any listing, area, news, or development URL and MCLL
returns a Markdown rendition instead of HTML, with fewer tokens than parsing the page.
The home page returns a site overview. Areas, news, and developments are reachable
only this way; no MCP tool or REST endpoint covers them. Find their URLs in the
sitemap.
curl -s -H "Accept: text/markdown" \
"https://mcllrealestate.com/en/buy/villa/phuket/kamala/kamala-cliff-villa"
Index and static pages have no Markdown rendition and return HTML; use the search API for
those.
Typical workflow
- Use
execute when the user asks for comparison, ranking, or derived metrics
across multiple listings.
- Otherwise search for what the user wants (
search_listings, or GET /api/listings).
- Read the result list and pick the relevant listing(s) by
title, area, priceThb.
- Fetch details for the chosen listing(s) (
get_listing, the detail REST route, or
Markdown on the listing url).
- Answer the user with the listing's facts and link them to the public
url.
An empty search or missing detail means no matching public data is available. Say so;
do not infer that a missing listing has a price upon enquiry. mcll.get returns null
for a missing slug, so skip it when comparing results.
Discovery and conventions
- Sitemaps (every URL, per locale):
https://mcllrealestate.com/sitemap.xml.
- API catalog (machine index):
https://mcllrealestate.com/.well-known/api-catalog.
- Site guide for agents:
https://mcllrealestate.com/llms-full.txt.
- Locales:
en · fr · th · zh. Unpublished locales fall back to English.
- Prices are in THB;
priceOnRequest: true (or priceThb: null) means the price
is not public. Say "Price upon enquiry", never a number.
- Only published listings are returned; there is no auth and nothing is writable here.
1---2name: mcll-real-estate3description: Search and compare published MCLL properties for sale or rent in Thailand, or read MCLL area, news, and development pages.4license: MIT5---67# MCLL Real Estate89MCLL (mcllrealestate.com) is a Thai real-estate firm. This skill lets an agent search10and read published sale and rent listings across Bangkok, Phuket, and the islands.11Everything here is read-only public data; no key or login is needed.1213Pick the access method your runtime supports. MCP and REST return listings; Markdown14also renders the area, news, and development pages.1516## 1. MCP server (prefer this)1718Streamable-HTTP MCP endpoint: `https://mcllrealestate.com/api/mcp`19Server card: `https://mcllrealestate.com/.well-known/mcp/server-card.json`2021Three tools:2223- **`search_listings`**: find listings. Args: `type` (`"sale"` | `"rent"`, required),24 `locale` (`en`/`fr`/`th`/`zh`, default `en`), and optional `city`, `area`,25 `propertyType` (human names such as `"Phuket"` or `"Condo"`), `bedrooms`, `minPrice`,26 `maxPrice` (THB), `page`. Returns `{ total, page, results: [{ id, title, url,27 transactionType, city, area, bedrooms, bathrooms, areaSqm, priceThb, image }] }`.28 Each result's `url`29 ends in a `slug` you pass to `get_listing`.30- **`get_listing`**: full detail of one listing. Args: `type` (`"sale"`|`"rent"`),31 `slug` (from a search result), `locale`. Returns price, size, features, coordinates,32 and a Markdown `description`.33- **`execute`**: MCLL Code Mode. Args: `code` (JavaScript string). Runs server-side34 in a Cloudflare Worker sandbox with global `mcll.search(args)` and `mcll.get(args)`.35 No open network, filesystem, environment variables, secrets, or writes. Use `return`36 for the JSON-serializable result; top-level `await` works. Best for comparing,37 ranking, or computing across many listings in one call.3839Example `execute` code:4041```js42const { results } = await mcll.search({ type: "sale", city: "Bangkok", page: 1 });43const details = await Promise.all(44 results.slice(0, 2).map((r) =>45 mcll.get({ type: "sale", slug: r.url.split("/").pop(), locale: "en" }),46 ),47);4849return details.filter((d) => d !== null).map((d) => ({50 title: d.title,51 url: d.url,52 pricePerSqm: d.priceThb && d.areaSqm ? Math.round(d.priceThb / d.areaSqm) : null,53}));54```5556## 2. REST API (no MCP client needed)5758OpenAPI: `https://mcllrealestate.com/api/openapi.json`5960- **Search**: `GET /api/listings?type=sale|rent&locale=en` plus optional filters. Note61 these filters take **ids** (UUIDs), not names: `city`, `area`, `propertyType`,62 `bedrooms`, `bathrooms`, `priceMin`, `priceMax`, `sizeMin`, `sizeMax`, `furnished`,63 `features`, `sort`, `page`. Returns `{ total, page, results }`, where each result has64 the same safe public projection as MCP search: absolute `url`, public image URL, price65 fields, city/area names, and no admin-only fields. For name-based filtering such as66 "condos in Phuket", use the MCP `search_listings` tool, which resolves names to ids67 for you.68- **Detail**: `GET /api/listings/{type}/{slug}?locale=en` returns one listing as JSON, with a69 Markdown `description`. `type` is `sale` or `rent`; `slug` comes from a listing URL's70 last path segment.7172```bash73# Detail of a known listing (slug from its public URL):74curl -s "https://mcllrealestate.com/api/listings/sale/kamala-cliff-villa?locale=en"7576# Search (sale listings, page 1):77curl -s "https://mcllrealestate.com/api/listings?type=sale&locale=en"78```7980## 3. Markdown content negotiation8182Send `Accept: text/markdown` to any listing, area, news, or development URL and MCLL83returns a Markdown rendition instead of HTML, with fewer tokens than parsing the page.84The home page returns a site overview. Areas, news, and developments are reachable85only this way; no MCP tool or REST endpoint covers them. Find their URLs in the86sitemap.8788```bash89curl -s -H "Accept: text/markdown" \90 "https://mcllrealestate.com/en/buy/villa/phuket/kamala/kamala-cliff-villa"91```9293Index and static pages have no Markdown rendition and return HTML; use the search API for94those.9596## Typical workflow97981. Use **`execute`** when the user asks for comparison, ranking, or derived metrics99 across multiple listings.1002. Otherwise search for what the user wants (`search_listings`, or `GET /api/listings`).1013. Read the result list and pick the relevant listing(s) by `title`, `area`, `priceThb`.1024. Fetch details for the chosen listing(s) (`get_listing`, the detail REST route, or103 Markdown on the listing `url`).1045. Answer the user with the listing's facts and link them to the public `url`.105106An empty search or missing detail means no matching public data is available. Say so;107do not infer that a missing listing has a price upon enquiry. `mcll.get` returns `null`108for a missing slug, so skip it when comparing results.109110## Discovery and conventions111112- **Sitemaps** (every URL, per locale): `https://mcllrealestate.com/sitemap.xml`.113- **API catalog** (machine index): `https://mcllrealestate.com/.well-known/api-catalog`.114- **Site guide for agents**: `https://mcllrealestate.com/llms-full.txt`.115- **Locales**: `en` · `fr` · `th` · `zh`. Unpublished locales fall back to English.116- **Prices** are in **THB**; `priceOnRequest: true` (or `priceThb: null`) means the price117 is not public. Say "Price upon enquiry", never a number.118- Only **published** listings are returned; there is no auth and nothing is writable here.