propertyguru-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@propertyguru-mcpsearch for 3-bedroom condos for rent in Orchard, Singapore"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
propertyguru-mcp
Unofficial MCP (Model Context Protocol) server that exposes PropertyGuru Singapore & Malaysia listing search as MCP tools. No API key. No subscription. One HTTP request per query.
⚠️ Disclaimer
This project is not affiliated with, endorsed by, or connected to PropertyGuru Group in any way. It is an unofficial, community-maintained tool built for personal research and educational purposes.
PropertyGuru® and the PropertyGuru logo are trademarks of PropertyGuru Group.
This tool scrapes publicly available HTML that PropertyGuru renders server-side. Use of this tool may violate PropertyGuru's Terms of Service. Use at your own risk.
No warranty. The authors are not responsible for any consequences of using this tool.
If you are PropertyGuru and want this taken down, please open an issue and I will respond promptly.
Related MCP server: Apartment Sheets MCP
What data does it provide?
Each search_listings call returns up to 25 listings (one page) with the complete 48-field listingData as rendered by PropertyGuru itself. Highlights:
Category | Fields |
Price |
|
Area |
|
PSF |
|
Layout |
|
Tenure / Age | Freehold vs 99-year Leasehold; "Built: 2010" |
Address |
|
Public transit |
|
Photos |
|
Agent |
|
Status |
|
Posted |
|
Highlights |
|
URL | Direct link to the listing detail page |
No field pruning. Server returns the raw
listingDatastructure — the example below is the exact JSON a caller receives.
Demo
Real output of search_listings(region="sg", listing_type="rent", freetext="Orchard", bedrooms_min=3, price_min=3000000, price_max=5000000):
{
"count": 25,
"listings": [
{
"id": 25472440,
"price": { "value": 3499999, "pretty": "S$ 3,499,999", "type": { "text": "Negotiable" } },
"pricePerArea": { "localeStringValue": "S$ 1,868.66 psf" },
"area": { "localeStringValue": "1,873 sqft" },
"bedrooms": 3, "bathrooms": 3,
"localizedTitle": "Orchard Scotts",
"fullAddress": "251 Orchard Road",
"shortAddress": "Orchard / River Valley (D09-10)",
"mrt": { "nearbyText": "10 min (840 m) from NS21 Newton MRT Station" },
"mediaItems": [{ "icon": "images", "text": "18", "mediaType": "images" }],
"agent": { "name": "Edwin Phua", "license": "R057754I" },
"agency": { "name": "HUTTONS ASIA PTE. LTD." },
"url": "https://www.propertyguru.com.sg/listing/for-sale-orchard-scotts-25472440",
"postedOn": { "text": "11 Aug 2026", "unix": 1786419975 }
},
...
]
}How it works
PropertyGuru is a Next.js SSR site. When you visit a listing-search URL, the server embeds the complete result set as JSON at a well-known DOM id:
<script id="__NEXT_DATA__" type="application/json">{
"props": { "pageProps": { "pageData": { "data": {
"listingsData": [ { "listingData": { ... }, ... }, ... ]
} } } }
}</script>This MCP server:
Builds a filter URL using the same
minPrice/maxPrice/bedrooms[]/freetextparam spelling PropertyGuru's own frontend uses.Fetches the HTML page with a plain browser User-Agent.
Parses
__NEXT_DATA__(regex →json.loads).Returns the raw
listingDataarray as JSON to the caller.
Why no third-party API key: because we're not using PropertyGuru's paid partner APIs — we're reading the same HTML your browser would receive.
Tools
search_listings
The primary tool. Returns a page of full listings.
Param | Type | Required | Default | Description |
|
| ✅ |
| Singapore or Malaysia |
|
| ✅ |
| — |
| string | — | — | Free text: |
| string | — | — |
|
| int | — | — | When |
| int | — | — | Studio = |
| int | — | — | Local currency (SGD or MYR) |
| int | — | — | |
| enum | — | — |
|
| int ≤ 40 | — | 25 | Single page cap |
get_listing_count
Cheap probe returning only the count for a search (use to size a query before fetching).
Installation
# Clone and install
git clone https://github.com/kkukoo/propertyguru-mcp.git
cd propertyguru-mcp
# Option A: uv (recommended)
uv venv && uv pip install -e .
# Option B: plain pip
python -m venv .venv && ./.venv/bin/pip install -e .
# Run tests
python -m pytest tests/ -vAfter install, the MCP server is available three ways (all equivalent):
# 1. Console script
.venv/bin/propertyguru-mcp
# 2. Module invocation
.venv/bin/python -m propertyguru_mcp
# 3. Direct path (no install needed if you prefer running from source)
python src/propertyguru_mcp/server.pyThe server talks MCP over stdio (the default transport for MCP clients). It does not listen on any network port.
Hooking up to your MCP client
Below are working config snippets. Replace /path/to/propertyguru-mcp and the python interpreter with whatever you used in the install step.
Hermes Agent — ~/.hermes/config.yaml
mcp_servers:
propertyguru:
command: /path/to/propertyguru-mcp/.venv/bin/propertyguru-mcp
args: []
timeout: 60
connect_timeout: 30Reload via hermes gateway restart (from a shell outside Hermes) or /restart from inside the gateway chat.
Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"propertyguru": {
"command": "/path/to/propertyguru-mcp/.venv/bin/propertyguru-mcp",
"args": []
}
}
}Restart Claude Desktop after editing.
Cursor — ~/.cursor/mcp.json
{
"mcpServers": {
"propertyguru": {
"command": "/path/to/propertyguru-mcp/.venv/bin/propertyguru-mcp",
"args": []
}
}
}Cline (VS Code extension)
In Cline Settings → MCP, add:
{
"propertyguru": {
"command": "/path/to/propertyguru-mcp/.venv/bin/propertyguru-mcp",
"args": []
}
}Continue.dev
Edit ~/.continue/config.json:
{
"experimental": {
"modelContextProtocolServers": [{
"name": "propertyguru",
"transport": {
"type": "stdio",
"command": "/path/to/propertyguru-mcp/.venv/bin/propertyguru-mcp",
"args": []
}
}]
}
}Any OpenAI Agents SDK-compatible client
The standard MCP stdio pattern works:
from agents.mcp import MCPServerStdio
async with MCPServerStdio(
name="propertyguru",
params={
"command": "/path/to/propertyguru-mcp/.venv/bin/propertyguru-mcp",
"args": [],
},
) as server:
tools = await server.list_tools()Known limitations
Single-page responses (25 listings). PropertyGuru's
&page=Nquery-string is unreliable from non-browser User-Agents (Cloudflare blocks intermittently). Path-style/{region}/property-for-sale/2works but is untested in the server. If you need > 25 listings, run multiple freetexts / districts and merge client-side.Cloudflare. If PropertyGuru starts challenging this server's User-Agent or your IP, you'll get
HTTP 403errors. Workarounds: slow down request rate; route via a residential proxy; switch to a browser-based toolset (e.g. Hermesbrowser_exec).Field drift. PropertyGuru can reshape
__NEXT_DATA__any time. When it does,search_propertyguruwill raise and you'll need to re-trace the path (look at the live page's__NEXT_DATA__in browser DevTools).Singapore + Malaysia only. PropertyGuru has other regional sites (
propertyguru.co.id,.co.th) — PRs welcome.No autocomplete endpoint. There's a separate RapidAPI endpoint that does location autocomplete; if you want that here, it's a clean addition (file an issue or open a PR).
No detail endpoint. To get full listing descriptions / floor plans, you need one extra fetch per listing — not implemented yet.
Roadmap
Stable multi-page support (handle Cloudflare + path-style
/{n}pagination)autocomplete_locations(query)— returnobjectId/ district / MRT proximityget_listing_detail(listing_url)— full description, all photos, floor plansBuilt-in rate limiter (configurable requests/min) to stay polite to PropertyGuru
Optional thin server-side projection (e.g.
fields=summary) to save caller tokensIndonesia / Thailand region support
Contributing
See CONTRIBUTING.md. PRs welcome — especially for:
New regions (Indonesia/Thailand)
New endpoints (autocomplete, detail, project pages)
Tests for additional URL parameter combinations
Better Cloudflare resilience
Example usage for other MCP clients (Windsurf, Codex, OpenClaw, etc.)
License
MIT — see LICENSE.
Acknowledgements
Built with modelcontextprotocol/python-sdk. Inspired by the wider community's shared frustration that real-estate data is artificially locked down by a handful of aggregators.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityBmaintenanceUK property data MCP server for AI hosts (Claude, ChatGPT). Wraps Land Registry, Rightmove, EPC, rental yields, stamp duty, and Companies House into 13 tools.2MIT
- Alicense-qualityDmaintenanceLight-weight MCP server to save and manage apartment listings to a shared Google Sheet.MIT

Rentalot MCP Serverofficial
Alicense-qualityCmaintenanceMCP server for the Rentalot API. Manage rental properties, contacts, showings, conversations, and more from any AI assistant.131MIT- AlicenseAqualityDmaintenanceMCP server for querying Taiwan's real estate transaction registry via web scraping of the Ministry of the Interior's official portal. Enables natural language queries for real estate sales, rentals, and pre-sale housing data.11MIT
Related MCP Connectors
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
Singapore property & financial data APIs for AI agents. 27 MCP tools. x402 micropayments.
MCP server for Google search results via SERP API
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kkukoo/propertyguru-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server