ImotAI MCP Server
You can query a read-only window into Bulgarian real-estate data from imotai.bg through MCP, without API keys or writes.
List districts for a city, with active-listing counts where public price pages exist.
Search sale or rent listings by city, district, property type, price, area, rooms, and limit (up to 25), with listing URLs and district market context.
Retrieve one listing’s structured details and authoritative market-context figures, without broker contact details, free-text descriptions, or exact coordinates.
Get city- or district-level market statistics: offer counts, average/P25/P50/P75 prices and price per m², room breakdown, and neighbouring districts; unavailable below 8 offers.
Estimate rough value positioning by city, district, property type, and area, with a range, confidence level, and mandatory disclaimer; refuses below 5 comparables.
Use results based on current asking prices, not official valuations or closed transactions.
The README also mentions a monthly market-report tool, but the supplied schema exposes only the five tools above.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ImotAI MCP Server How much do 2 and 3-bedroom apartments cost in Sofia's Lozenets district?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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/mcpClaude Code:
claude mcp add --transport http imotai https://imotai.bg/mcpCursor / VS Code / other clients (
mcp.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.
Related MCP server: MCP Immobilier France (DVF)
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
git clone https://github.com/pdimiev-prog/imotai-mcp.git
cd imotai-mcp
npm install
npm run build # produces dist/index.jsUse it in Claude Desktop
Add this to claude_desktop_config.json (use the absolute path to dist/index.js):
{
"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:
{
"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:
Field | Type | Notes |
| string, required | Slug or Bulgarian name |
|
| |
| string | Slug from |
| enum |
|
| number | EUR |
| number | m² |
| string | CSV, e.g. |
| integer 1–25 | Default 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.marketContextis the authoritative per-listing figure from ImotAI's own calculation:districtAveragePricePerSqm,districtMedianPricePerSqm,deviationPercent(+ = pricier than the district),comparableActiveListings,basedOnCount,pricePageUrl.search_properties[].marketContextis 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:
Field | Type | Notes |
| string, required | Slug or Bulgarian name from |
| string, required | Slug or Bulgarian name from |
| enum, required |
|
| number, required | Living area in m² |
| integer | Accepted but not used for filtering |
Output:
{
"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
disclaimerfield is present on everyavailableresult; 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:
{ "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 var | Default | Meaning |
|
| Base URL of the ImotAI public API |
|
| Per-request timeout |
|
| Max 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.
Available Tools
5 toolsestimate_valueImotAI rough value positioningAInspect
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.
Inputs: area (required), city (required), district (required), propertyType (required), +1 more.
get_market_statsImotAI market statistics for a city or districtAInspect
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. Sale offers, all residential types. Returns { available: false } below 8 offers.
Inputs: city (required), district.
get_propertyGet one ImotAI listingAInspect
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.
Inputs: id (required).
list_districtsList ImotAI districts for a cityAInspect
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.
Inputs: city (required).
search_propertiesSearch ImotAI listingsBInspect
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.
Inputs: city (required), transactionType (required), limit, rooms, +6 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool targets a distinct action and resource: searching listings, retrieving one listing, getting district-level market aggregates, estimating a specific property's value, and listing valid districts. The descriptions explicitly clarify boundaries (e.g., market_stats vs. estimate_value differ in scope and output), so an agent can reliably choose the right tool.
All tool names use a consistent verb_noun snake_case pattern: get_property, get_market_stats, estimate_value, list_districts, search_properties. There are no mixed conventions or vague verbs.
Five tools is well-scoped for a read-only real-estate data server, covering search, detail, market context, estimation, and district lookup. Each tool clearly earns its place without redundancy.
The surface covers the core workflows: search, property detail, market statistics, valuation estimate, and district enumeration. Minor gaps exist, such as no tool to list valid cities (needed as input to other tools) and no pagination beyond 25 search results, but these are workable.
Maintenance
Related MCP Connectors
Real estate data for AI agents: property lookup, comps, search, skip tracing, phone/address checks
Flat-rate US property/parcel search & CSV export for AI agents via MCP.
Real estate agency CRM: listings, clients, leads and viewings from your AI assistant (OAuth).
AI-native real estate discovery with structured property search and market intelligence.
Related MCP Servers
- FlicenseBqualityNot gradedmaintenanceEnables AI assistants to search and analyze Swedish real estate data from Booli.se using natural language queries. Supports property searches with comprehensive filtering options and location discovery through GraphQL API integration.31-
- FlicenseAqualityDmaintenanceProvides AI agents with real-time access to French real estate transaction data, price per square meter, and property estimates using official open DVF data, with no API key required.4-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to query and analyze Israeli real estate data from the Govmap API, including searching for property deals, market trends, and address autocomplete.MIT

BatchData MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables AI assistants and agents to query U.S. real estate data, including property lookups, comparables, property searches, skip tracing, phone/address verification, and investor buy boxes, through plain-language requests.1MIT