Kira — Romanian rentals

io.github.Cezart3v0.1.1Updated Oct 10, 2026

Live search of apartment rentals in any Romanian city, town or commune (storia, publi24, lajumate).

Overview

AI-generated overview

Searches live Romanian rental listings across three sites and extracts details like heating, parking and walking distance.

What it does
Searches storia.ro, publi24.ro and lajumate.ro in parallel for rental flats and parking spots in Romanian localities, merges results and removes duplicates and non-rentals. Tools include search_rentals with filters for price, rooms, heating, parking, owner-only and keywords, get_listing_details for a single ad URL, search_parking, and find_locality for resolving ambiguous place names. It reads ad text to infer heating type, parking, private owner versus agency, and estimates walking distance to a place you name. All tools are read-only and every result carries the original ad URL.
When to use it
Useful when you are flat-hunting in Romania and want an assistant to query several listing sites at once, apply filters the sites do not offer, and read the free text for details such as central heating or included parking. Also usable as a plain CLI for the same searches.
Requirements
Runs locally through uv/uvx, which downloads the package and its Python on first use; no accounts, API keys or environment variables are required. Optional environment variables configure the RON/EUR rate, request delay, user agent and cache directory. Network access to the listing sites and to OpenStreetMap geocoding is needed. Desktop MCP clients only.
Before you install
It scrapes third-party listing sites, so results are a large share of the market rather than all of it, and some sites block automated access. It is intended for personal flat-hunting, not bulk harvesting, and the README advises checking each site's terms before other uses. Phone numbers and e-mails are redacted from returned text, and the user contacts the owner on the original site. Walking distances are estimates.

Installation

In SourceWeft

  1. Open Kira — Romanian rentals in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

kira-mcp

[ci] [PyPI] [MIT] [python] [MCP]

Ask your AI to find you a flat to rent in Romania — any city, town or commune.

[Demo: asking Claude Code for a flat, kira-mcp searches the sites live]

An MCP server (and a CLI) that searches storia.ro, publi24.ro and lajumate.ro live, merges the results, removes duplicates and non-rentals, and reads the ad text for the things the site filters don't give you: heating type, parking, private owner vs agency, and walking distance to a place you care about.

Works with Claude (Code & Desktop), Cursor, VS Code, Windsurf, Gemini CLI, Codex and any other MCP client. Also usable as a plain CLI.

🇷🇴 Ghid în română

"Find me a 2-room flat in Cluj under 500 €, own boiler, with parking, max 20 minutes on foot from UMF."

text
$ kira search Brasov --rooms 2 --max-price 500 --heating centrala_proprie --limit 3Brașov, Brașov — 10 matching, showing 3  storia: ok (74 fetched, 374 on site)  publi24: ok (24 fetched)  lajumate: ok (56 fetched, 382 on site)
 1. Studio Maurer Villas partial mobilat    500 EUR | 2 cam | 45 mp | heating: centrala_proprie | parking: included    Tractorul, Brasov, Brasov    https://www.storia.ro/ro/oferta/studio-maurer-villas-partial-mobilat-IDIPoX 2. Apartament pe 2 niveluri, 62 mp, zona Faget-Tractorul    400 EUR | 2 cam | 62 mp | heating: centrala_proprie    ...

Why

Romanian rental sites each cover part of the market, their filters are thin, and the details that decide a viewing — centrală proprie or termoficare? is the parking spot included or "posibilitate de parcare în zonă"? — live in free text. kira-mcp does the tab-juggling and the reading, so an agent can answer the question you actually asked.

Features

  • All of Romania: 3,181 localities (municipii, orașe, comune) from Wikidata. Diacritics optional, common shortcuts understood (cluj, tg mures, buc), ambiguous names resolved (Floresti, Prahova).
  • 3 sites in parallel, deduplicated across sites (the same flat posted on two sites shows once, with also_listed_on).
  • Filters: price (EUR; RON converted), rooms, heating, parking, private owner, keywords.
  • Text extraction tuned on real Romanian ads: heating (centrala_proprie / termoficare), parking (included, likely_included, area_possible, none), rooms, surface, floor, street. When a filter needs it, the full ad is read, not just the snippet.
  • Walking distance from any place (near="UMF"), geocoded with OpenStreetMap, with a Google Maps directions link.
  • Drops non-rentals: sale ads, parking-only ads, hotel-style short stays.
  • Parking spots search (search_parking).
  • Privacy: phone numbers and e-mails are redacted from returned text. The user contacts the owner on the original site.

Quick start (5 minutes)

Step 1 — install uv (once)

kira-mcp runs through uv, which downloads it and its Python on first use. Nothing else to install.

  • Windows (PowerShell): powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
  • macOS / Linux: curl -LsSf https://astral.sh/uv/install.sh | sh

Close and reopen the terminal, then check: uvx --version.

Step 2 — connect it to your AI

Claude Code
bash
claude mcp add kira -s user -- uvx kira-rentals-mcp

Check with claude mcp list → kira: ... ✓ Connected.

Claude Desktop
  1. Settings → Developer → Edit Config (opens claude_desktop_config.json).
  2. Paste (merge with what is there):
json
{  "mcpServers": {    "kira": {      "command": "uvx",      "args": ["kira-rentals-mcp"]    }  }}
  1. Quit Claude Desktop completely (tray icon → Quit) and start it again. "kira" appears under the tools/connectors menu.

If it says the server failed, use the full path of uvx as command (where uvx on Windows, which uvx on macOS — e.g. C:\Users\you\.local\bin\uvx.exe).

Cursor / Windsurf / Gemini CLI

Same JSON as Claude Desktop, in ~/.cursor/mcp.json, ~/.codeium/windsurf/mcp_config.json or ~/.gemini/settings.json.

VS Code (Copilot agent mode)

.vscode/mcp.json in your workspace:

json
{  "servers": {    "kira": {      "type": "stdio",      "command": "uvx",      "args": ["kira-rentals-mcp"]    }  }}
Codex CLI

~/.codex/config.toml:

toml
[mcp_servers.kira]command = "uvx"args = ["kira-rentals-mcp"]
Other / remote clients (HTTP)
bash
uvx kira-rentals-mcp --transport streamable-http --port 8000

serves MCP at http://localhost:8000/mcp.

Step 3 — ask

Just talk to it, in English or Romanian:

  • "Caută-mi o garsonieră în Sibiu sub 350 €, cu centrală proprie."
  • "2-room flat in Timișoara, max 500 €, private owner, sorted by price."
  • "Apartamente cu 2 camere în Cluj la max 20 de minute pe jos de UMF."
  • "Is parking included in this one? "
  • "Loc de parcare de închiriat în Brașov sub 60 €."

The first call takes a few extra seconds while uv downloads the package.

No MCP? Use the agent skill or the CLI

  • Agent skill: copy skills/romania-rentals/ into your skills folder (e.g. ~/.claude/skills/). It teaches the agent when to search and how to read the results, via the MCP tools or the CLI.
  • CLI: see below.

Tools

ToolWhat it does
search_rentalsSearch one locality. Filters: min_price, max_price (EUR/month), rooms, heating, parking, owner_only, keywords, near + max_walk_minutes, sort (newest, price_asc, price_desc, distance), limit.
get_listing_detailsFull description, photos, heating/parking with confidence, for one ad URL.
search_parkingParking spots / garages for rent in a locality.
find_localityResolve an ambiguous or misspelled place name; lists candidates with county.

All tools are read-only. Every result carries the original ad URL.

CLI

bash
uvx --from kira-rentals-mcp kira search "Cluj-Napoca" --rooms 2 --max-price 500 --near UMF --max-walk 20 --sort distancekira search Iasi --heating centrala_proprie --parking included likely_includedkira listing https://www.storia.ro/ro/oferta/...kira parking Brasov --max-price 80kira find Florestikira --json search Sibiu        # machine-readable

Configuration

Env varDefault
KIRA_RON_PER_EUR5.0Exchange rate for RON prices.
KIRA_REQUEST_DELAY1.2Seconds between requests to the same site.
KIRA_USER_AGENTkira-mcp/<version> (+repo url)
KIRA_CACHE_DIROS cache dirWhere geocoding results are cached.

Sources and limits

SiteStatus
storia.ro✅ server-side price/room filters, pagination
publi24.ro✅ newest page per search
lajumate.ro✅ pagination
olx.ro❌ blocks automated access (HTTP 403)
imobiliare.ro❌ blocks automated access (HTTP 403)

kira-mcp does not try to get around a site that blocks it. Results are therefore a large share of the market, not all of it — the tool says so in every response.

Be a good citizen. kira-mcp identifies itself, waits between requests, caches pages for 10 minutes, fetches only what one search needs and returns links back to the sites. It is meant for personal flat-hunting, not bulk harvesting. Check each site's terms before using it for anything else.

Distances are estimates (straight line × 1.3, walking 4.7 km/h). They use the location the poster entered; an ad with only a neighbourhood gets a district-precision distance, an ad with neither is listed without one.

Development

bash
git clone https://github.com/Cezart3/kira-mcp && cd kira-mcpuv sync --group devuv run pytest            # offline, against synthetic fixturesKIRA_LIVE=1 uv run pytest -m live   # against the real sitesuv run ruff check .

The locality list is rebuilt with uv run python scripts/build_localities.py.

Site parsers live in src/kira_mcp/sites/. Adding a site = one class with search_rentals and fetch_detail; see sites/base.py.

Credits

  • Locality data: Wikidata (CC0).
  • Geocoding: Nominatim / © OpenStreetMap contributors (ODbL), at ≤1 request/second, cached.
  • Extraction rules grew out of Kira, a personal flat-hunting bot.

License

MIT © 2026 Cezar Tocaciu

Source: README.md at commit be79ba0

Tools

0
Tool metadata has not been indexed yet.

Version history

1
  1. v0.1.1LatestOct 10, 2026