ImotAI — Bulgarian real estate

bg.imotai由 imotai.bg 發布官方發布者v0.2.0更新於 Nov 1, 2026

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

已驗證Streamable HTTP可網頁執行位置與生活資料與分析

概覽

AI 產生的概覽

唯讀存取 imotai.bg 的保加利亞房產資料:搜尋物件、比較各區價格並取得每月市場報告。

可以做什麼
  • 列出保加利亞某城市的各區及在售物件數量,以取得可用的區域名稱
  • 依城市、區域、物件類型、價格、面積與房間數搜尋出售或出租物件,並附連結
  • 取得單一物件的完整結構化資料及其所在區域的價格對照
  • 查詢城市或區域的市場統計:均價、P25/P50/P75 價格、依房間數分布、鄰近區域
  • 取得某城市的每月市場報告,含每平方公尺開價中位數與月增減幅
  • 依可比開價粗略估算物件價格定位,附區間、信心程度與免責聲明
適用情境
適合研究保加利亞房市時使用,例如比較各區、瀏覽出售或出租物件、判斷某開價高於或低於所在區域水準,或引用每月價格趨勢。它是唯讀資料來源,並非刊登或仲介工具。
執行需求
無需安裝:託管端點是遠端 Streamable HTTP 服務,不需要金鑰或帳號。自行架設需要 Node.js 20 以上版本、從程式碼倉庫建置,並可選用 IMOTAI_API_URL、IMOTAI_HTTP_TIMEOUT_MS 與 IMOTAI_RATE_LIMIT_PER_MIN 環境變數。需要能連線至 imotai.bg。
安裝前請注意
所有數字都基於在售物件的目前開價,而非成交紀錄,因此估算僅為價格定位而非鑑價;估算工具回傳的免責聲明應原文呈現。資料採 CC BY 4.0 授權,使用時須標註 ImotAI。請求有頻率限制,託管端點每個用戶端每分鐘 30 次。不涉及憑證或個人資料。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 ImotAI — Bulgarian real estate,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/bg.imotai%2Fimotai/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "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.

來源:README.md,提交 11f5b10

工具

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.

輸入參數city必填

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.

輸入參數city必填limitroomsmaxAreaminAreadistrictmaxPriceminPricepropertyTypetransactionType必填

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.

輸入參數id必填

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.

輸入參數city必填district

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.

輸入參數area必填city必填roomsdistrict必填propertyType必填

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.

輸入參數city必填month

版本歷史

1
  1. v0.2.0最新Nov 1, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分