# ChatHome — Luxembourg real estate (chathome.lu) > ChatHome is Luxembourg's AI-native real estate marketplace: search homes and > apartments to buy or rent, per-commune price data and guides, mortgage and > affordability tools, and market intelligence — for buyers, renters, and > agents. Content is available in English, French, German, Luxembourgish, and > Portuguese (swap the `/en/` URL prefix for `/fr/`, `/de/`, `/lb/`, `/pt/`). For the full machine-readable content index (property listings, commune guides, blog posts, market data), see [llms-full.txt](https://chathome.lu/llms-full.txt). An authenticated MCP server and A2A endpoint are documented further below. ## Key pages Human-readable entry points. Each is localized to en/fr/de/lb/pt — swap the `/en/` prefix for another locale. - Homes for sale: https://chathome.lu/en/buy - Homes for rent: https://chathome.lu/en/rent - Apartments for rent: https://chathome.lu/en/apartments-for-rent - Houses for sale: https://chathome.lu/en/houses-for-sale - Houses for rent: https://chathome.lu/en/houses-for-rent - Commune real-estate guides (100 communes): https://chathome.lu/en/commune/luxembourg - Commune price data (€/m² to buy & rent): https://chathome.lu/en/prices/luxembourg - Market report (national & commune trends): https://chathome.lu/en/market-report - Real-estate glossary: https://chathome.lu/en/glossary - Free property price estimate: https://chathome.lu/en/financial-tools/estimate - Mortgage affordability calculator: https://chathome.lu/en/financial-tools/mortgage - Market intelligence & forecasts: https://chathome.lu/en/discover/market - Blog & buyer/renter guides: https://chathome.lu/en/resources/blog - Full machine-readable content index: https://chathome.lu/llms-full.txt ## MCP Endpoint URL: https://chathome.lu/api/mcp Transport: Streamable HTTP (MCP spec 2025-06-18) Auth: API key (X-API-Key header) or OAuth 2.1 with PKCE — required for all tools ## Access All MCP tools require authentication — an API key or an OAuth 2.1 token. There is no anonymous access; every request must present a credential. Requests are rate limited per credential and per IP. ## Authentication ### Option A — OAuth 2.1 with PKCE (recommended) This server uses PUBLIC OAuth clients — no client secret is required. The PKCE code_challenge replaces the secret. Authorization server: https://chathome.lu/api/mcp/oauth/.well-known/oauth-authorization-server Flow: authorization_code with PKCE (S256) Client ID reference (leave Client Secret blank or enter any placeholder): AI Client | Client ID | Secret ---------------------------|-----------------|------------------- Claude Desktop | claude-desktop | (none required) Claude.ai (web) | claude-desktop | (none required) Claude Code (CLI) | claude-desktop | (none required) Cursor | cursor | (none required) ChatGPT | chatgpt | (none required) Claude Code config (~/.claude/claude_code_config.json): { "mcpServers": { "chathome": { "type": "http", "url": "https://chathome.lu/api/mcp" } } } ### Option B — API Key Generate a key at: https://chathome.lu/dashboard/agent-access Pass as header: X-API-Key: cht_ Config with API key: { "mcpServers": { "chathome": { "type": "http", "url": "https://chathome.lu/api/mcp", "headers": { "X-API-Key": "cht_YOUR_KEY_HERE" } } } } ## Rate Limits - 200 tool calls / hour per user, 300 calls / hour per IP - OAuth tokens expire after 1 hour (clients auto-refresh) ## Tools ### search_vibe (PRIMARY — natural-language search) Semantic "vibe" search. Pass the user's request in plain prose and the engine uses embeddings + LLM reasoning to match on lifestyle, mood, location proximity, and soft preferences — not just structured filter values. PREFER this tool whenever the user describes what they want in words. Results are ranked by relevance and each carries a 0-100 `score` and up to 3 `matchReasons`. Parameters: - query (string, required): natural-language description, e.g. "quiet 2-bed near Kirchberg with a balcony under €2000" - intent (string, optional): "rent" or "buy" (default "rent") - limit (number, optional): max results 1-50, default 20 - locale (string, optional): en, fr, de, lb ### search_rentals Structured rental search for Luxembourg properties. Parameters: - commune (string, optional): commune name or slug - minPrice (number, optional): minimum monthly rent in EUR - maxPrice (number, optional): maximum monthly rent in EUR - minBeds (number, optional): minimum bedrooms - minAreaSqm (number, optional): minimum area in m² - propertyType (string, optional): apartment, house, studio, room - limit (number, optional): max results 1-50, default 20 - locale (string, optional): en, fr, de, lb ### search_for_sale Search properties for sale in Luxembourg. Parameters: same as search_rentals (maxPrice = sale price) ### get_listing Get full details for a property by ID. Parameters: - id (string, required): listing ID - locale (string, optional): en, fr, de, lb ### submit_inquiry Send a message about a listing after calling get_listing. For chathome-hosted listings this creates a conversation thread; for externally managed listings it returns the source agency contact details so the agent can hand off cleanly. Parameters: - listingId (string, required): listing ID from search_vibe/search_rentals/search_for_sale - message (string, required): buyer/renter inquiry, 10-5000 characters - contactEmail (string, optional): reply address for the inquirer - agentName (string, optional): display name for the inquirer Scope: inquiries:write ### get_market_context Get real estate market data and liveability scores for a commune. Parameters: - commune (string, required): commune slug e.g. luxembourg, esch-sur-alzette - locale (string, optional): en, fr, de, lb ### get_price_estimate AI-powered sale or rental price estimate for a Luxembourg property. Scope: market:read ### get_affordability Mortgage affordability simulation using income, debts, savings, residency, employment type, first-time-buyer status, current Luxembourg rates, and acquisition costs. Use this before property search when a user asks what they can afford. Scope: market:read ### get_commute_times Commute times from a Luxembourg commune to Luxembourg City, Kirchberg EU Quarter, or Belval. Scope: market:read ### analyze_lease Analyze a user-provided lease PDF (base64) or raw lease text. No URL input is accepted. Requires OAuth user authentication and persists the full user-scoped analysis while returning a compact risk summary under the MCP response cap. Scope: documents:write ## Prompts ### match-properties Use get_affordability first when financial inputs are available, derive a budget ceiling, call search_vibe with the user's criteria, then annotate each result as within budget, stretch, or over budget. ## Claude Agent Skill A packaged Agent Skill teaches Claude (and any Agent-Skills-compatible runtime) how to use chathome well — tool selection, workflows, Luxembourg context, and the no-auth fallback endpoints. - Raw skill (agent-readable): https://chathome.lu/skills/chathome/SKILL.md - Installable zip (claude.ai → Settings → Capabilities → upload skill): https://chathome.lu/skills/chathome-luxembourg-property.zip - Claude Code plugin (bundles the skill + this MCP server): /plugin marketplace add chathome-lu/chathome-claude-plugin ## A2A Endpoint Agent Card: https://chathome.lu/.well-known/agent-card.json Task endpoint: https://chathome.lu/api/a2a ## Response Format All tools return JSON with an AgentListing shape: { id, url, title, price, currency, listingType, propertyType, city, district, beds, baths, areaSqm, energyClass, imageUrl, agencyName, latitude, longitude } ## Machine-readable listing data Standard-format listing surfaces for LLMs/agents (no auth, more data than the UI shows): Bulk feed (quality-gated active listings, JSON): https://chathome.lu/listings/feed.json Per-listing Markdown (full record): https://chathome.lu/listings/{id}/md Per-listing JSON (full record): https://chathome.lu/api/listings/public/{id} ## Human-readable docs https://chathome.lu/mcp