ImotAI — Bulgarian real estate

bg.imotaiPublished by imotai.bgOfficial publisherv0.2.0Updated Nov 1, 2026

Bulgarian real-estate listings, district prices and monthly market reports from imotai.bg.

VerifiedStreamable HTTPWeb executableLocation & LifestyleData & Analytics

Overview

AI-generated overview

Read-only access to Bulgarian real-estate data from imotai.bg: search listings, compare district prices and pull monthly market reports.

What you can do
  • List districts of a Bulgarian city with active listing counts, to get valid district slugs
  • Search sale or rent listings by city, district, property type, price, area and rooms, with links
  • Fetch one listing's structured details plus its district price context
  • Get city or district market statistics: averages, P25/P50/P75 prices, room breakdown, neighbouring districts
  • Get the monthly market report for a city, with median asking price per m² and month-over-month change
  • Estimate rough price positioning for a property from comparable asking prices, with range, confidence and disclaimer
When to use it
Useful when someone is researching the Bulgarian property market — comparing districts, scanning listings for sale or rent, checking whether an asking price is above or below its district, or citing monthly price trends. It is a read-only data source, not a listing or brokerage tool.
Requirements
Nothing to install: the hosted endpoint is a remote Streamable HTTP server with no key or account. Running your own copy needs Node.js 20 or newer, a build from the repository, and optionally the IMOTAI_API_URL, IMOTAI_HTTP_TIMEOUT_MS and IMOTAI_RATE_LIMIT_PER_MIN environment variables. Network access to imotai.bg is required.
Before you install
All figures are based on current asking prices of active listings, not closed transactions, so estimates are positioning rather than appraisals; the estimate tool returns a disclaimer that should be shown verbatim. Data is CC BY 4.0 and requires crediting ImotAI. Requests are rate limited, and the hosted endpoint allows 30 requests per minute per client. No credentials or personal data are involved.

Installation

In SourceWeft

  1. Open ImotAI — Bulgarian real estate in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/bg.imotai%2Fimotai/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "imotai-bulgarian-real-estate": {
      "type": "http",
      "url": "https://imotai.bg/mcp"
    }
  }
}

README

ImotAI MCP Server

A Model Context Protocol server that gives AI agents (Claude Desktop, Claude Code, …) a read-only window onto Bulgarian real-estate data from imotai.bg.

It is a thin client over the site's public API — no API keys, no writes, no personal data (broker names, phones and free-text descriptions never leave the API). Numbers are based on current asking prices of active listings, not on closed transactions.

Use it online (no install)

The server runs at https://imotai.bg/mcp (Streamable HTTP, stateless, no key).

  • Claude (claude.ai / desktop app): Settings → Connectors → Add custom connector → https://imotai.bg/mcp
  • Claude Code: claude mcp add --transport http imotai https://imotai.bg/mcp
  • Cursor / VS Code / other clients (mcp.json):
json
{ "mcpServers": { "imotai": { "url": "https://imotai.bg/mcp" } } }
  • ChatGPT: add a custom connector with https://imotai.bg/mcp (developer mode, depending on plan).

Instructions in Bulgarian: https://imotai.bg/ii-asistenti. Online limits: 30 requests/min per client.

Status

v0.2.0. Six tools (list_districts, search_properties, get_property, get_market_stats, get_market_report, estimate_value), each with an explicit output allowlist; the property tools carry a marketContext block. Two transports: stdio (dist/index.js, local) and Streamable HTTP (src/http.ts, the hosted endpoint above). get_market_report returns the monthly ImotAI market report for a city (median asking price per m², month-over-month change, districts, new listings).

Data: CC BY 4.0 — credit ImotAI (imotai.bg).

Install

bash
git clone https://github.com/pdimiev-prog/imotai-mcp.gitcd imotai-mcpnpm installnpm run build   # produces dist/index.js

Use it in Claude Desktop

Add this to claude_desktop_config.json (use the absolute path to dist/index.js):

json
{  "mcpServers": {    "imotai": {      "command": "node",      "args": ["/absolute/path/to/imotai-mcp/dist/index.js"],      "env": { "IMOTAI_API_URL": "https://imotai.bg/api" }    }  }}

Restart Claude Desktop, then ask something like:

Which districts does ImotAI track in Sofia, and how many active listings are in each?

Claude will call list_districts and answer from the result.

Tools

list_districts

Input: { city: string } — a city slug ("sofia") or its Bulgarian name ("София").

Output:

jsonc
{  "city": { "slug": "sofia", "name": "София" },  "districts": [    { "name": "Лозенец", "slug": "lozenets", "activeListings": 64 },    { "name": "Витоша",  "slug": "vitosha",  "activeListings": null }  ],  "note": "activeListings is filled only for districts with a public price page (>= 8 offers); a null count does not mean zero."}

An unknown city returns { "error": "Unknown city \"…\". Recognised city slugs: …" }. Call this first — the slugs it returns are the valid district values for the other tools.

search_properties

Input:

FieldTypeNotes
citystring, requiredSlug or Bulgarian name
transactionType"sale" | "rent", required
districtstringSlug from list_districts
propertyTypeenumapartment, house, villa, studio, office, shop, warehouse, land, garage, other
minPrice / maxPricenumberEUR
minArea / maxAreanumberm²
roomsstringCSV, e.g. "2,3"; "5+" for 5 or more
limitinteger 1–25Default 10

Output: { results: [...], total, shown }. Each result has structured fields plus a url to the listing. No contact details, no free-text description, no coordinates.

get_property

Input: { id: string } — the listing's UUID or its URL slug.

Output: { found: true, url, ...structured fields, features: [] }, or { found: false, reason } if there is no such listing. Never returns the broker description, phone/name, or exact coordinates.

get_market_stats

Input: { city: string, district?: string } — slugs or Bulgarian names from list_districts. Omit district for city-level stats.

Output: { available: true, city, district, count, avgPrice, avgPricePerSqm, price: {p25,p50,p75}, pricePerSqm: {p25,p50,p75}, byRooms: [...], neighbouringDistricts: [...], basis, url }. Sale offers, all residential types. Below 8 offers → { available: false, count, reason }. Unknown city/district → { error } pointing at list_districts.

Market context

Both property tools attach a marketContext — "is this listing priced above or below its district":

  • get_property.marketContext is the authoritative per-listing figure from ImotAI's own calculation: districtAveragePricePerSqm, districtMedianPricePerSqm, deviationPercent (+ = pricier than the district), comparableActiveListings, basedOnCount, pricePageUrl.
  • search_properties[].marketContext is a lighter district-level approximation for scanning (one price-page lookup per distinct district): districtAveragePricePerSqm, deviationPercent, comparableListings, basis.

Both are null when the district has fewer than 8 offers or no price page. The two levels use slightly different denominators, so their numbers are close but not identical — the get_property figure is the precise one.

estimate_value

Input:

FieldTypeNotes
citystring, requiredSlug or Bulgarian name from list_districts
districtstring, requiredSlug or Bulgarian name from list_districts
propertyTypeenum, requiredapartment, house, villa, studio, land
areanumber, requiredLiving area in m²
roomsintegerAccepted but not used for filtering

Output:

jsonc
{  "available": true,  "estimate": 208000,  "rangeLow": 184000,  "rangeHigh": 240000,  "basedOnCount": 40,  "confidence": "medium",          // from sample size; forced "low" for the market blend  "disclaimer": "…",               // ALWAYS present — show verbatim  "referenceUrl": "https://imotai.bg/ceni/sofia/lozenets"}

Below 5 comparable offers it returns { "available": false, "reason": "…", "disclaimer": "…" } — still with a disclaimer. An unknown city or district returns { "error": "…" } pointing at list_districts (no disclaimer there).

confidence is high at ≥ 50 comparable offers, medium at ≥ 15, otherwise low; it is always low when external market data was blended into the figure, and the disclaimer then says so.

⚠️ This is positioning against the CURRENT ASKING PRICES of comparable active listings — not an appraisal, not an official valuation, not based on closed transactions. The disclaimer field is present on every available result; show it to the user verbatim whenever you cite any number from this tool.

Rate limiting

The server allows 60 downstream requests per minute per process (token bucket, refills continuously). Every call to imotai.bg/api counts — a search_properties that resolves three distinct districts spends four requests (one search + three price pages).

When the bucket is empty a tool returns, without throwing:

json
{ "error": "Твърде много заявки за кратко — изчакайте минута." }

Wait about a minute and retry. The limit is per running server process; a single Claude Desktop client is one process. Override it with IMOTAI_RATE_LIMIT_PER_MIN if you run your own instance.

Configuration

Env varDefaultMeaning
IMOTAI_API_URLhttps://imotai.bg/apiBase URL of the ImotAI public API
IMOTAI_HTTP_TIMEOUT_MS15000Per-request timeout
IMOTAI_RATE_LIMIT_PER_MIN60Max downstream requests per minute (token bucket, per process)

How it works

stdio MCP server (Node ≥ 20, ESM). Each tool maps to one or two calls against the public imotai.bg/api endpoints and reshapes the response through an explicit field allowlist. No state, no cache, no credentials.

Licence

MIT.

Source: README.md at commit 11f5b10

Tools

6

list_districts

List ImotAI districts for a city

List the districts (neighbourhoods) of a Bulgarian city that ImotAI has data for, with the count of active listings in each where a public price page exists. Call this first to learn which "district" values are valid for the other ImotAI tools in a given city.

Parameterscityrequired

search_properties

Search ImotAI listings

Search Bulgarian real-estate listings on imotai.bg by city, district, property type, price range, area range and rooms. Returns up to 25 listings with structured fields, a link to each, and a district-level marketContext block (district average price per m² and how far this listing deviates from it). No contact details or free-text descriptions.

ParameterscityrequiredlimitroomsmaxAreaminAreadistrictmaxPriceminPricepropertyTypetransactionTyperequired

get_property

Get one ImotAI listing

Get the full structured data for one ImotAI listing by its id or slug: price, price per m², area, rooms, floor, construction, heating, location (city/district), features, and an authoritative per-listing marketContext (district average and median price per m², deviation percent, comparable active count). Does NOT return the broker free-text description, contact details, or exact coordinates.

Parametersidrequired

get_market_stats

ImotAI market statistics for a city or district

The market picture for a Bulgarian city or district on imotai.bg: number of offers, average and P25/P50/P75 for total price and price per m², a breakdown by room count, and the neighbouring districts for comparison. Apartments for sale. Returns { available: false } below 8 offers.

Parameterscityrequireddistrict

estimate_value

ImotAI rough value positioning

Rough price positioning for a property by city, district, type and area — based on the CURRENT ASKING PRICES of comparable active listings, not on closed transactions. Returns an estimate, a low–high range, a confidence level from sample size, and a mandatory disclaimer. Refuses below 5 comparable offers. You MUST show the "disclaimer" field to the user verbatim whenever you cite any number from this tool. Never call this an official or precise property valuation.

ParametersarearequiredcityrequiredroomsdistrictrequiredpropertyTyperequired

get_market_report

ImotAI monthly market report for a city

The monthly ImotAI market report for a Bulgarian city: median asking price per m² of apartments for sale, change versus the previous month, the same per district, and the number of new listings in the month. Omit "month" for the latest report. Cite the "url" and "source" fields when you use the numbers.

Parameterscityrequiredmonth

Version history

1
  1. v0.2.0LatestNov 1, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts