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 分