How we opened North Cyprus real estate data to AI agents with a public MCP server
Ask ChatGPT or Claude for "a 2-bedroom flat for rent in Kyrenia under £1,000" and, until recently, you got a polite guess. Northern Cyprus (KKTC) has no MLS, listings are spread across dozens of agency sites, and most of
Ask ChatGPT or Claude for "a 2-bedroom flat for rent in Kyrenia under £1,000" and, until recently, you got a polite guess. Northern Cyprus (KKTC) has no MLS, listings are spread across dozens of agency sites, and most of them are not machine-readable.
We built Evlek, a real estate platform for Northern Cyprus, and from the start we treated AI assistants as a first-class client next to our web and mobile apps. This post explains how our public MCP server works, the decisions behind it, and what we learned along the way.
What the server does
The Evlek MCP server gives AI assistants read-only access to live sale and long-term rent listings, plus asking-price statistics, across six cities (Girne/Kyrenia, Lefkoşa/Nicosia, Gazimağusa/Famagusta, İskele, Güzelyurt and Lefke) and 100+ districts.
-
Endpoint:
https://evlek.app/api/mcp - Transport: Streamable HTTP, JSON-RPC 2.0
- Auth: none, no API key
- Limits: 60 requests/min per IP
It exposes eight tools, all read-only:
| Tool | What it does |
|---|---|
search_listings |
Structured search: transaction, city, district, type, bedrooms, price, area, amenities, distance to a university |
get_listing |
Full details by ID, listing number or evlek.app link |
compare_listings |
Side-by-side comparison of 2 to 4 listings |
market_stats |
Asking-price statistics by city or district |
list_locations |
Every known place with live listing counts |
convert_currency |
GBP, EUR, USD and TRY at stored daily rates |
search / fetch
|
Free-text search and detail in the format deep-research clients expect |
On top of the tools there are resources (per-city price indexes, district profiles) and two prompts for common scenarios, including student rentals.
Try it in two minutes
ChatGPT: Evlek is an approved ChatGPT app. Open Apps, search for "Evlek" and connect.
Claude: Settings → Connectors → Add custom connector, then paste https://evlek.app/api/mcp.
Claude Code:
claude mcp add --transport http evlek https://evlek.app/api/mcp
Cursor, VS Code and other remote-capable clients:
{
"mcpServers": {
"evlek": { "url": "https://evlek.app/api/mcp" }
}
}
Then ask things like:
- "Find 2-bedroom flats for rent in Girne under £1,500/month."
- "Compare Kyrenia and Famagusta: which has more active listings?"
- "Show rentals within 1 km of Near East University."
- "Convert £150,000 to EUR, USD and TRY."
Design decisions that mattered
1. Read-only, with no contact details
The server never returns phone numbers or emails. An assistant can find and compare homes, but contact happens on the listing page. That keeps agencies comfortable sharing data and keeps us out of the scraping-and-spam business.
2. Asking prices only, and we say so
Every response is framed as advertised asking prices and listing facts. The tool descriptions spell out that results are not a valuation, a forecast or investment advice. Models repeat whatever framing you give them, so we put the boundaries in the tool descriptions themselves rather than hoping the model infers them.
3. Place names are a real problem
The same town can be Girne, Kyrenia, Keryneia or Кирения depending on who is asking. We built a location registry with Turkish official names, English names and aliases, and the server resolves any of them. When a name is unknown, the server returns suggestions instead of an empty result, so the model can recover by itself.
list_locations exists mainly for the model: when it is unsure how a place is spelled, it can call it first and get back valid names with live counts.
4. One currency inside, four outside
The market quotes mostly in GBP, but buyers think in EUR, USD or TRY. The server normalizes everything to GBP and converts at a stored daily rate. Every response that converts a price includes the rate and its timestamp, so the assistant can show its working.
5. Never mix sale and rent
When a query does not specify a transaction, results come back as two separate groups, each with its own pagination cursor. compare_listings refuses to rank a rental against a sale, because a model asked to compare £900/month with £180,000 will happily produce a confident and meaningless answer.
6. Small pages and honest cursors
Tools return at most 10 listings per call, and each listing is a single readable line plus a structured card. Long result lists crowd the context window and make models skim. Cursors are opaque and tied to the same filters, so a model cannot page through a query it never ran.
7. Student housing as a first-class filter
Northern Cyprus has a large university population, so search_listings accepts a university code and a maximum distance (nearUniversity: { code: "NEU", maxMeters: 1000 }). "Somewhere near my campus" is one of the most natural things a student asks an assistant, so it deserved a real filter instead of a guess.
What we learned
- Tool descriptions are your API docs, your UX copy and your safety policy all at once. They deserve the same care as the product itself.
- Return a next step, not just an error. An unknown place or an unsupported amenity returns what to try instead, so the model can recover without asking the user.
- Design for the model's context window. Short, consistent result lines beat dumping full records.
- Directories lower the barrier. As an approved ChatGPT app, Evlek connects in one click instead of asking users to paste an endpoint URL.
Links
- Evlek: evlek.app
- MCP server page: evlek.app/mcp
- Public manifest, docs and examples: github.com/Evlek/evlek-mcp
If you are building an MCP server for a domain where the data is messy and local, I'm happy to compare notes in the comments.
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.