Case study MCPOAuth 2.1Real estate

A remote MCP server with OAuth 2.1 and per-user permissions

How we connected Prediqta’s real estate data to Claude without writing a second backend or a second copy of the permission rules.

Bence Bial 2 min read

Claude Prediqta (MCP)

What is a renovated 65 m² flat on the 3rd floor of Pozsonyi út 38, Budapest, worth?

predict_apartment_price

{ "address": "Budapest, Pozsonyi út 38.",
  "coordinates_lat": 47.5207, "coordinates_lon": 19.0496,
  "area_size": 65, "condition": "RENOVATED", "floor": 3 }

valuation and 3 comparable sales, 0.9 s

Estimated value: 58.7 M HUF (54.1–63.9 M). The closest recent sales:

Pozsonyi út, 61 m² 56.2 M HUF
Tátra utca, 64 m² 57.5 M HUF
Victor Hugo utca, 68 m² 61.0 M HUF
The screens are illustrations of the systems; names and figures in them are made up.

Prediqta.ai is a real estate data and valuation platform that Bana Technologies co-owns. Its users work at real estate firms, and more and more of them do their analysis in Claude. So we built a remote MCP server: users connect their Prediqta account to Claude once, and Claude can then answer from Prediqta’s valuations and market data with that user’s permissions.

  1. Claudeuser signs in once
  2. MCP servertools filtered per user
  3. Prediqtaacts as that user
  4. Answerwith source and freshness
The web app and the assistant run the same queries and the same permission checks.

A protocol layer, not a second backend

The tempting shortcut is to write new queries for the assistant. We did the opposite: every tool calls the same code the web app uses. There is one implementation of every number, so an answer in Claude cannot disagree with the screen, and a fix in one place fixes both.

Reuse the permissions instead of copying them

The hardest part of exposing data to a new client is making sure nobody sees what they should not. A copy of the permission rules is a copy that will drift. The MCP server therefore acts as the signed-in user, and the platform’s existing checks decide every call. Prediqta’s own login acts as the OAuth 2.1 server, so users connect with the account they already have, and tools a user may not use do not even appear in their list.

Make failure say why

An empty answer is the most dangerous answer an assistant can get, because the model reads it as “there is nothing”. So the server never returns an empty list for “unknown”: missing data comes back with a reason, outdated data with a warning, and a permission problem as a clear error. The server instructions also say when Prediqta is the right source and when it is not, because users bring their own data and methods too.

What I would tell another team

Build the MCP server as a thin layer over what already works, let the existing system decide who sees what, and spend your effort on making every answer say where it came from and how fresh it is. That is what makes an assistant’s answer something a professional can rely on.

More write-ups

All posts