deweloperuch-mcp
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., "@deweloperuch-mcpFind 40–55 m² flats in Kraków's Podgórze under 800,000 PLN, cheapest per m² first."
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.
Ask an AI assistant about new-build apartments in Poland: asking prices with their history, real transaction prices and official statistics.
An unofficial MCP server and command-line tool over the public data of deweloperuch.pl: developers' asking prices (with price history), transaction prices from the Real Estate Price Register (RCN) and statistics of GUS and NBP. Thirteen read-only tools, usable from an MCP client such as Claude Desktop or Claude Code, or from the deweloperuch CLI.
Disclaimer. This is an independent project. It is not affiliated with, endorsed by or sponsored by deweloperuch.pl, GUS, NBP or the Register's publishers. The authors of deweloperuch.pl have agreed to the project's use of their service; the client identifies itself as
deweloperuch-mcp/<version>with a link to this repository.
It is read-only: it never creates or changes anything on the service.
It is a polite client: at most 1 request per second, one at a time, shared by all processes on your machine; responses are cached; after a 401, 403, 429 or a captcha/WAF challenge it stops sending requests until you clear the lock yourself.
Please respect the service. It is run by other people; ask narrow questions and do not build loops or bulk downloads on top of this tool.
Data accuracy is not guaranteed. Prices are asking or registered prices, not valuations or advice.
You are responsible for how you use the tool and the data, including the terms of the service.
What you can ask
Buying a flat: "Find flats of 40–55 m² in Kraków's Podgórze up to 800 000 PLN, cheapest per m² first." (The service has no filter by number of rooms; filter by area instead.)
Judging an offer's price: "Is this offer a good deal? Show its price history, the lowest price of the last 30 and 90 days, and whether the reduction looks suspicious."
Checking a developer: "What does this developer build, and how many offers are active in which cities?"
Market and transaction prices: "How do asking prices in Gdańsk compare with registered transaction prices over the last quarters?"
Valuation: "Roughly what is a 55 m² flat at this address worth, based on nearby transactions?"
Comparing cities: "Rank cities by transaction price per m², and show wages and unemployment next to them."
Related MCP server: korea-realty
Install
Pick the first option that fits you; they go from no terminal to expert. Supported systems: macOS, Linux and Windows 10 (1903+) / 11 with a local NTFS cache directory.
Windows is supported starting with 0.1.3, including the PyPI package and .mcpb extension. Releases up to 0.1.2 support macOS and Linux only.
Prefer a visual walkthrough? The install guide on the project's website (in Polish) shows the installation step by step and has a prompt that lets an AI agent install it for you.
1. Claude Desktop, no terminal
Download
deweloperuch-mcp-<version>.mcpbfrom the latest release.Double-click it, or drag it into Claude Desktop → Settings → Extensions → Install, then restart Claude Desktop.
You get: the 13 tools and 4 prompts in Claude Desktop. The extension uses the uv runtime (server.type is uv in its manifest), so the first start fetches Python and the dependencies and takes about a minute; you install nothing yourself. It has no command-line tool; if the server is ever stopped (STOP), see lifting a STOP without a checkout.
2. Any MCP client, with uv
You get: the same tools in Claude Desktop, Claude Code or any client that starts a stdio server. Nothing to clone.
Install uv once (macOS and Linux):
curl -LsSf https://astral.sh/uv/install.sh | shOn Windows, use PowerShell (uv installation):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Open a new terminal after installation so it sees uv on PATH.
Claude Code:
claude mcp add deweloperuch -- uvx deweloperuch-mcpClaude Desktop (claude_desktop_config.json; other clients use the same command and args):
{
"mcpServers": {
"deweloperuch": {
"command": "uvx",
"args": ["deweloperuch-mcp"]
}
}
}To run straight from GitHub instead of PyPI, use uvx --from git+https://github.com/MBratkowski/deweloperuch-mcp@v0.1.3 deweloperuch-mcp (@v0.1.3 pins the release; drop it to follow main). pip install deweloperuch-mcp works too.
If a Windows MCP client cannot find uvx, use the full executable path from (Get-Command uvx).Source as command. Escape backslashes in JSON, for example "C:\\Users\\YOUR_NAME\\.local\\bin\\uvx.exe". A source checkout instead uses "command": "uv" and "args": ["run", "--directory", "C:\\path\\to\\deweloperuch-mcp", "deweloperuch-mcp"].
3. Agent skill for the CLI
You get: an AI coding agent that knows how to use the deweloperuch CLI (which command to call, how to read the output, what to do on STOP), without an MCP server. The skill is called deweloperuch-cli; a new agent session loads it by itself.
npx skills add MBratkowski/deweloperuch-mcpThis uses the skills CLI (needs Node.js) and works with any agent it supports; you choose the agent. Without Node.js:
uvx --from deweloperuch-mcp deweloperuch skill installIt writes to ~/.claude/skills/deweloperuch-cli (Claude Code, for the user). Options: --project (this project's ./.claude/skills), --agent codex|cursor|gemini-cli|github-copilot, --dir PATH (writes PATH/deweloperuch-cli), --force (replace a different copy; without it a changed copy is never overwritten, and the installer never writes through symlinks). deweloperuch skill show prints the skill, deweloperuch skill path its folder. Details: docs/cli/commands/skill.md.
Claude Code plugin marketplace:
/plugin marketplace add MBratkowski/deweloperuch-mcp
/plugin install deweloperuch@deweloperuch-mcp4. The CLI on its own
You get: the deweloperuch command for your terminal and scripts; see docs/cli/README.md.
uvx --from deweloperuch-mcp deweloperuch --help # one-off, nothing installed
uv tool install deweloperuch-mcp # installs deweloperuch and deweloperuch-mcp
deweloperuch locations search krak5. From source (contributors)
Requirements: Python 3.11 or newer and uv.
git clone https://github.com/MBratkowski/deweloperuch-mcp.git
cd deweloperuch-mcp
uv sync
uv run deweloperuch --help # sends no requestsAs the client command use uv run --directory /path/to/deweloperuch-mcp deweloperuch-mcp (Claude Code: claude mcp add deweloperuch -- uv run --directory /path/to/deweloperuch-mcp deweloperuch-mcp). More: CONTRIBUTING.md and docs/mcp/README.md.
Troubleshooting
uvx: command not foundorspawn uvx ENOENT: install uv (option 2). Claude Desktop may not see your shellPATH, so put the full path fromwhich uvx(macOS/Linux) or(Get-Command uvx).Source(PowerShell) incommand.The server does not appear in Claude Desktop: quit and restart Claude Desktop after installing the extension or editing the config.
Windows with release 0.1.2 or earlier: update to 0.1.3 or newer. For a uv tool installation, run
uv tool upgrade deweloperuch-mcp; for pip, runpython -m pip install --upgrade deweloperuch-mcp; foruvx, runuvx --refresh deweloperuch-mcp --help. Replace an older.mcpbextension with the latest release.STOP / exit code 3: after a 401, 403, 429 or a captcha/WAF challenge the client stops sending requests in every process, so as not to burden the service. A 429 expires by itself after the pause (at least 60 s). The other causes last until you lift them, after checking the cause (
deweloperuch stop statusshows the state; an AI agent must not lift it). The MCP server stays halted until you restart it. Details and the command: docs/configuration.md.Where is the cache? Responses are cached in memory only. The limiter lock and the STOP record live in
~/.cache/deweloperuch-mcp($XDG_CACHE_HOME/deweloperuch-mcp). Do not delete that directory: it would also lift a STOP.
Tools
Overview, argument rules, errors and result sizes: docs/mcp/README.md.
Tool | Description |
Finds cities, districts and streets by a name fragment and returns | |
A page of developers' apartment offers in a city or the whole of Poland, with price, area, price-per-m², district, status and price-drop filters and sorting. | |
One offer with its full price history and price flags (lowest price in 30/90 days, suspicious reduction). | |
Investments of a city (averages, sorting, filter by developer) or by name across Poland. | |
An investment with its developer, average prices and a list of offers. | |
Finds developers by a name fragment and returns | |
A developer profile: summary, investments with active offers and cities. | |
Offer-market statistics of one city: counts, price, price per m² and area distributions, the largest developers. | |
Transaction prices (RCN) of a city by month or quarter. | |
A ranking of places or powiats by RCN transactions and price per m². | |
A building from the RCN with its units and transactions. | |
An approximate apartment value at a point from nearby RCN transactions. | |
Official GUS and NBP time series (dwellings, NBP prices, unemployment, wages, demography) for Poland, aggregates and 66 cities. |
Every tool rejects arguments that are not in its schema with an error that lists the allowed names. Tool descriptions, error messages and CLI output are in Polish, because the service and its users are Polish.
Prompts
Four ready-made prompts appear in Claude Desktop as commands. They send no requests themselves; they guide the model through the tools above. Arguments and details: docs/mcp/prompts.md.
Prompt | Description |
| Flats from developers in one city with a budget, area and district: a table of offers from the lowest price per m². |
| A price assessment of one offer: price history, comparison with the city market and with the valuation from nearby transactions. |
| A developer profile: where and how much it builds, its investments, active offers, prices and their changes. |
| A comparison of the flat market of several cities (at most 5) in one table: asking prices, RCN transaction prices, optionally wages and unemployment. |
CLI commands
Overview, output format and exit codes: docs/cli/README.md.
Command | Description |
Finds cities, districts and streets; returns the city slug. | |
Searches offers in a city or the whole of Poland with filters and sorting. | |
Shows an offer with its price history and price flags. | |
Searches investments of a city or by name. | |
Shows an investment with its developer and offers. | |
Finds developers by name; returns the developer slug. | |
Shows a developer profile. | |
Shows a building from the RCN with its units and transactions. | |
Estimates an apartment's value at a point. | |
Shows offer-market statistics of one city. | |
Shows RCN transaction prices of a city by month or quarter. | |
Shows a ranking of places or powiats by RCN transactions. | |
Shows GUS and NBP statistics of a location as a table of periods. | |
Shows the STOP lock shared by all processes (offline; exit code 3 when active). | |
Clears the STOP lock, after you have checked the cause. | |
Installs, prints or locates the |
How it works
deweloperuch.pl → api → models → usecases → consumers (CLI, MCP server)Layer | Role |
| Talks to the service: an HTTP transport with the shared limiter, cache and STOP lock; readers for its JSON API and page data; DTOs that map responses to models. |
| Plain frozen dataclasses (offers, investments, price history, statistics). No I/O. |
| One module per operation (for example |
| The CLI and the MCP server, both thin: they parse arguments, call a use case and present the result. |
The layers are wired in bootstrap.py; tooling/ holds non-business helpers (the skill installer) that only the CLI uses. Import-linter enforces the direction of imports. Design decisions and their reasons: docs/decisions.md. The service's data, endpoints and limits: docs/discovery/README.md. Configuration, the limiter and the STOP lock: docs/configuration.md.
Development
uv sync
make fast # ruff, ruff format --check, mypy, import-linter (a few seconds)
make check # fast + the offline tests + dead-code check + complexity and duplication reportsEvery make target is offline; the tests never open a network socket and run against real responses stored in docs/discovery/samples/ and tests/fixtures/.
Folder | Contents |
| Unit tests mirroring |
| Stored service responses against the DTOs and adapters. |
| Use cases with the real adapters over a mocked service. |
| Golden outputs of the CLI and MCP server ( |
| Layering and naming rules, repository-wide consistency (identity, published assets, metadata); no-network guarantees. |
| Test infrastructure (fakes, builders, checks), no tests. |
| The opt-in live suite, see below. |
After an intended output change, refresh the golden outputs with DEWELOPERUCH_UPDATE_GOLDEN=1 uv run pytest tests/characterization and review the diff (tests/golden/README.md).
Live end-to-end tests are off by default. They check the installed server, the CLI and the helper scripts against the real service, so they send real requests. Run them sparingly, only when a change needs it:
DEWELOPERUCH_LIVE=1 uv run pytest -m live tests/e2e -rs --maxfail=3Both the variable and -m live are required. Scenarios and request budget: tests/e2e/README.md. Contributing guide and release procedure: CONTRIBUTING.md.
Documentation
Document | Contents |
The project's landing page and user documentation in Polish, with a visual install guide | |
The MCP server: tools, prompts, client configuration, argument rules, errors, result sizes | |
The | |
Environment variables, files, the request limiter, the cache and the STOP lock | |
Map of the data layer: service architecture, access channels, key findings | |
Catalog of the service's | |
Pages as a data source: filters, sorting, pagination | |
Entities, identifiers, relations, value dictionaries | |
Trimmed response samples (the basis of the contract tests) | |
Capabilities, the requests behind them and the tool or command that exposes them | |
Known gaps and unverified assumptions about the service | |
Architecture decisions | |
Changes between versions |
Data sources and licences
deweloperuch.pl: the source of all offer, investment, developer and statistics data. Its terms apply to your use of the data.
RCN (Real Estate Price Register) transaction data, reached through the service. The service's authors publish raw RCN data as CC0 in their public repository.
GUS (Central Statistical Office) and NBP (National Bank of Poland) statistics, reached through the service. Name them as the source when you republish figures.
The code is licensed under the MIT licence. The licence covers code only; the samples and fixtures used for testing contain data from the sources above and are described in NOTICE. The project's icon is not covered by the MIT licence either: all rights reserved, used with permission of the deweloperuch.pl authors (see NOTICE).
Contributing
Issues and pull requests are welcome; please read CONTRIBUTING.md first, especially the polite-client rules. Security reports: SECURITY.md.
Available Tools
13 toolsestimate_property_valueWycena mieszkaniaARead-only
Szacuje wartość mieszkania o danym metrażu w punkcie (lat, lng) w Polsce na podstawie cen transakcyjnych z Rejestru Cen Nieruchomości (RCN) z okolicy. Wynik jest przybliżony: to porównanie z transakcjami w pobliżu, a nie operat szacunkowy. Użyj, gdy użytkownik pyta, ile może być warte mieszkanie albo czy jego cena jest rynkowa.
Zwraca estimated_value (PLN), price_per_m2, radius_m i period_months (skąd i z ilu miesięcy są transakcje), stats (liczba, mediana, średnia, min i max ceny za m²) oraz comparables: najbliższe transakcje porównawcze (adres, data, cena, metraż, cena za m², piętro, odległość, rynek), z comparables_total, comparables_omitted, truncated i hint. estimated_value=null znaczy, że serwis nie podał wyceny: przeczytaj hint.
Wymaga współrzędnych: narzędzie nie zamienia adresu na lat i lng. Weź je od użytkownika, z search_locations (ulica lub dzielnica: to punkt przybliżony, nie konkretny budynek) albo z get_investment (współrzędne inwestycji oferty). Każde wywołanie to zapytanie do serwisu: nie wyceniaj seriami wielu punktów.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Szerokość geograficzna punktu w Polsce w stopniach, np. 52.2297: pole lat z search_locations (ulica albo dzielnica, nie samo miasto) albo ze współrzędnych inwestycji w get_investment (dokładniejsze dla konkretnej oferty). | |
| lng | Yes | Długość geograficzna punktu w Polsce w stopniach, np. 21.0122: pole lng z search_locations (ulica albo dzielnica, nie samo miasto) albo ze współrzędnych inwestycji w get_investment (dokładniejsze dla konkretnej oferty). | |
| limit | No | Ile najbliższych transakcji porównawczych zwrócić, 0–50, domyślnie 10. Transakcja to ok. 210 znaków wyniku (50 to ok. 10,6 tys.); 0 = tylko wycena i statystyki. | |
| address | No | Opcjonalny opis adresu, np. Marszałkowska 100, Warszawa. Trafia do serwisu, ale nie wyznacza położenia: decydują lat i lng. | |
| area_m2 | Yes | Metraż mieszkania w m², 10–500, np. 48.5. |
Output Schema
| Name | Required | Description |
|---|---|---|
| lat | Yes | |
| lng | Yes | |
| hint | No | Co zrobić dalej. |
| stats | No | Statystyki cen za m² podane przez serwis. |
| area_m2 | Yes | Metraż podany w zapytaniu w m². |
| radius_m | No | Promień w metrach, z którego są transakcje porównawcze. |
| truncated | Yes | true: lista comparables jest niepełna (comparables_omitted > 0). |
| comparables | Yes | Transakcje porównawcze od najbliższych, najwyżej limit. |
| price_per_m2 | No | Szacowana cena za m² w PLN. |
| period_months | No | Z ilu ostatnich miesięcy są transakcje porównawcze. |
| estimated_value | Yes | Szacowana wartość mieszkania w PLN podana przez serwis: przybliżenie, nie operat szacunkowy. null: serwis nie podał wyceny. |
| comparables_total | Yes | Wszystkie transakcje porównawcze serwisu. |
| comparables_omitted | Yes | Transakcji pominiętych przez limit. |
| comparables_returned | Yes | Transakcji na liście comparables. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/openWorldHint already given, the description still adds real behavioral context: the result is approximate, each call is a live service query so batch estimation is discouraged, and estimated_value=null means the service gave no valuation so the agent must read hint. It also flags truncation/omission of comparables.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then usage trigger, then return semantics, then coordinate prerequisites. Some of the return-field enumeration partly duplicates the existing output schema, making it slightly longer than strictly necessary, but every paragraph carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the trigger, the coordinate prerequisite with sourcing options, the approximation caveat, the null-failure path, and the service-query cost constraint. Even though an output schema exists, the description's semantics (null meaning, truncation) close the remaining operational gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes beyond it by explaining that address is descriptive only and does not determine location (lat/lng govern), and that lat/lng should come from search_locations or get_investment, with the tradeoff that an investment's coordinates are more precise for a given offer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: estimates apartment value for a given area at a (lat,lng) point in Poland from RCN transaction prices. It also distinguishes itself from a formal appraisal ('to porównanie z transakcjami w pobliżu, a nie operat szacunkowy'), which no sibling could be confused with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger ('Użyj, gdy użytkownik pyta, ile może być warte mieszkanie albo czy jego cena jest rynkowa'), explicit prerequisite (requires coordinates, does not geocode), named alternatives for sourcing coordinates (search_locations, get_investment), and an explicit exclusion ('nie wyceniaj seriami wielu punktów').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_buildingBudynek z transakcjamiARead-only
Zwraca budynek z rejestru cen transakcyjnych (RCN): adres, miasto, współrzędne, średnie ceny podane przez serwis i lokale (mieszkania) z ich transakcjami: datą, ceną, ceną za m², rynkiem (pierwotny albo wtórny), rodzajem transakcji i stronami. To ceny, za które lokale sprzedano, a nie ceny ofertowe deweloperów. building_slug to ostatni człon adresu strony budynku z cenami transakcyjnymi na deweloperuch.pl, np. 23-marca-79c-sopot albo aleja-krakowska-279-warszawa; gdy go nie znasz, poproś użytkownika o link do tej strony. building_url to ta strona: podawaj ją użytkownikowi jako link. Kolejność: lokale od tego z najnowszą transakcją, transakcje każdego lokalu od najstarszej.
Ograniczenia: tylko budynki z mieszkaniami, nie domy. Zwraca najwyżej limit lokali (domyślnie 10); units_returned mówi, ile ich jest na liście, truncated i units_omitted, czy i ile pominięto, a units_total i transactions_total liczą cały budynek. Najnowsze miesiące bywają niepełne, bo rejestr spływa z opóźnieniem. include_trend=true dodaje średnią cenę za m² transakcji w okolicy budynku (promień radius_km) w ostatnich 12 kwartałach; to jedno zapytanie do serwisu więcej.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Najwięcej lokali w wyniku (tych z najnowszymi transakcjami), domyślnie 10, najwyżej 50; 0 = tylko podsumowanie budynku. Ile pominięto, mówi units_omitted. Wynik ma ok. 200 znaków na transakcję; lokal może mieć kilka transakcji, więc zwykle wystarcza domyślny limit. | |
| building_slug | Yes | Slug budynku, np. 23-marca-79c-sopot, ze strony budynku albo z comparables w estimate_property_value. | |
| include_trend | No | true: dołącz średnią cenę za m² transakcji w okolicy budynku w ostatnich 12 kwartałach (jedno zapytanie więcej). |
Output Schema
| Name | Required | Description |
|---|---|---|
| lat | No | Współrzędne budynku (WGS84). |
| lng | No | Współrzędne budynku (WGS84). |
| city | Yes | Miasto budynku. |
| name | Yes | Adres budynku wg rejestru cen. |
| units | Yes | Lokale od tego z najnowszą transakcją. |
| street | No | Ulica, tylko gdy inna niż name. |
| avg_price | No | Średnia cena transakcyjna lokalu w PLN, podana przez serwis. |
| city_slug | Yes | city_slug jak w search_locations. |
| truncated | Yes | true: lista units jest niepełna (units_omitted > 0). |
| avg_area_m2 | No | Średnia powierzchnia lokalu w m², podana przez serwis. |
| units_total | Yes | Wszystkie lokale budynku w rejestrze cen. |
| building_url | No | Strona budynku z cenami transakcyjnymi na deweloperuch.pl: podaj ją użytkownikowi jako link. |
| building_slug | Yes | Identyfikator do ponownego get_building. |
| units_omitted | Yes | Lokali pominiętych przez limit. |
| units_returned | Yes | Lokali na liście units. |
| avg_price_per_m2 | No | Średnia cena za m² w PLN, podana przez serwis. |
| transactions_total | Yes | Wszystkie transakcje lokali budynku. |
| neighbourhood_trend | No | Średnia cena za m² transakcji w okolicy budynku w kolejnych kwartałach; tylko przy include_trend=true. |
| last_transaction_date | No | Data najnowszej transakcji w budynku. |
| first_transaction_date | No | Data najstarszej transakcji w budynku. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, and the description adds real behavior beyond them: it restricts scope to apartments not houses, explains the pagination summary fields, warns that recent months may be incomplete due to registry lag, and notes include_trend costs an extra service query. Some of this describes return values already covered by the output schema, which slightly lowers the gain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the returned data, then the slug explanation, ordering, and constraints; every sentence carries information. It is somewhat long and repeats the limit parameter details already present in the schema, costing it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a lookup tool with an output schema, the description covers what an agent needs: data scope, ordering rules, truncation semantics, data-freshness caveats, the cost of the optional trend, and how to interpret/present building_url. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters fully. The description adds the origin of building_slug (last segment of the deweloperuch.pl building URL, with examples) and reinforces that building_url should be shown to the user, but largely mirrors schema content. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Zwraca budynek z rejestru cen transakcyjnych (RCN)') and enumerates the returned fields (adres, miasto, współrzędne, lokale z transakcjami). It distinguishes the data source from siblings by clarifying these are sale prices, not developer offer prices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditional guidance on obtaining the slug ('gdy go nie znasz, poproś użytkownika o link') and where to source it (estimate_property_value comparables), which is useful. However, it never explicitly says when to choose this tool over siblings like get_transaction_statistics or search_offers, leaving tool-level selection implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_developerProfil deweloperaARead-only
Zwraca profil dewelopera: nazwę, stronę www, podsumowanie jego aktywnych ofert (summary: active_offers, cities, avg_price, avg_area_m2, avg_price_per_m2), inwestycje z aktywnymi ofertami (najpierw te z największą liczbą aktywnych ofert: investment_slug, name, city, active_offers, total_offers razem z archiwalnymi, średnie aktywnych ofert, investment_url) i jego miasta (cities: inwestycje, aktywne oferty, średnia cena i cena za m²). Użyj, gdy pytanie dotyczy dewelopera: gdzie i ile buduje, w jakich cenach. developer_slug weź z search_developers (po nazwie) albo z pól developer_slug w search_offers, get_investment, get_offer. developer_url i investment_url to strony na deweloperuch.pl: podawaj je użytkownikowi jako linki.
city zawęża summary i investments do jednego miasta (city_slug z search_locations); domyślnie polska (cała Polska). cities zawsze obejmuje całą Polskę.
Ograniczenia: najwyżej limit inwestycji (domyślnie 20); investments_omitted i truncated mówią, ile pominięto. Pojedynczych ofert tu nie ma: oferty inwestycji daje get_investment.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | city_slug miasta z search_locations (np. krakow) albo polska (domyślnie: cała Polska). | polska |
| limit | No | Najwięcej inwestycji w wyniku (najpierw te z największą liczbą aktywnych ofert), 1–100, domyślnie 20. Inwestycja to ok. 350 znaków wyniku; zwykle wystarcza domyślne 20. | |
| developer_slug | Yes | developer_slug z search_developers (po nazwie) albo z pól developer_slug w search_offers, get_investment, get_offer, np. atal. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| cities | Yes | Wszystkie miasta dewelopera w Polsce, niezależnie od argumentu city (także przy city=warszawa). |
| summary | Yes | |
| city_slug | Yes | Zakres summary i investments: miasto albo polska. |
| developer | Yes | |
| truncated | Yes | true: lista investments jest niepełna. |
| investments | Yes | |
| developer_url | No | Profil dewelopera na deweloperuch.pl: podaj go użytkownikowi jako link. |
| investments_total | Yes | Wszystkie inwestycje z aktywnymi ofertami. |
| investments_omitted | Yes | Inwestycji pominiętych przez limit. |
| investments_returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds non-obvious semantics: city narrows summary and investments while cities always covers all of Poland, and truncation is disclosed via investments_omitted and truncated. It also instructs that developer_url/investment_url should be surfaced to the user, which is an output-handling behaviour not visible in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, then slug sourcing, then city/limit constraints, so the structure is sound. The long parenthetical enumerations of output fields are partly redundant with the output schema and inflate the text, but no paragraph is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only profile tool with an output schema, the description covers everything an agent needs: what sections return, how to obtain the required slug, how city and limit scope results, what truncation signals mean, and which sibling handles individual offers. Nothing required for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the ordering rule for limit (investments with most active offers first) and the subtle asymmetry that city does not scope the cities block. These are semantic constraints the schema fields alone do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Zwraca profil dewelopera') and enumerates the returned sections (summary, investments, cities) with their sub-fields, so the agent knows exactly what this tool produces. It is clearly separable from siblings like get_investment, which the description explicitly names as the place for individual offers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Użyj, gdy pytanie dotyczy dewelopera: gdzie i ile buduje, w jakich cenach') plus an exclusion ('Pojedynczych ofert tu nie ma: oferty inwestycji daje get_investment'). It also routes the agent to the right source for the required slug (search_developers, search_offers, get_investment, get_offer).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_government_statisticsStatystyki GUS i NBPARead-only
Zwraca oficjalne statystyki GUS i NBP jako szeregi czasowe dla Polski, agregatu miast albo miasta na prawach powiatu: mieszkania oddane do użytkowania i rozpoczęte (razem, wg form budownictwa, na wynajem), średnią powierzchnię mieszkań oddanych przez deweloperów, średnie ceny m² wg NBP (rynek pierwotny i wtórny, ceny ofertowe i transakcyjne), stopę bezrobocia, wynagrodzenia, demografię i ludność. Użyj jako kontekstu rynku; ofert i cen konkretnych mieszkań tu nie ma (search_offers).
Zwraca periods (od najstarszego) i series (series_id, label, unit, values wyrównane z periods; null = brak danych) oraz frequency, source, total, returned, truncated, available_from, note i stats_url (sekcja strony na deweloperuch.pl: podaj ją użytkownikowi jako link).
Ograniczenia: domyślnie ostatnie 12 okresów; truncated=true znaczy, że są starsze (zwiększ periods, najwyżej 120). nbp_prices: tylko 17 dużych miast i 3 agregaty, nie polska. Nie każdy zestaw jest dostępny dla każdej lokalizacji (błąd wskaże, co podać); dane GUS i NBP są publikowane z opóźnieniem, ostatni okres bywa sprzed kilku tygodni lub miesięcy. Przeczytaj note: ostatni okres bywa niepełny.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset | Yes | dwellings_quarterly: mieszkania oddane do użytkowania i rozpoczęte (razem, wg form budownictwa, na wynajem), kwartalnie; dwellings_monthly: to samo miesięcznie; average_area: średnia powierzchnia mieszkania oddanego przez deweloperów (m², rocznie); demography: urodzenia żywe, zgony, przyrost naturalny (dla Polski miesięcznie, dla miast rocznie); population: ludność, kobiety i mężczyźni (rocznie); unemployment: stopa bezrobocia rejestrowanego (%, miesięcznie); wages: przeciętne miesięczne wynagrodzenie brutto w PLN (dla Polski miesięcznie, dla miast rocznie, czasem z relacją do średniej krajowej); nbp_prices: średnie ceny m² wg NBP, rynek pierwotny i wtórny, ofertowe i transakcyjne (PLN/m², kwartalnie). Częstotliwość zwraca pole frequency. | |
| periods | No | Ile ostatnich okresów zwrócić (lat, kwartałów albo miesięcy), 1–120, domyślnie 12. Najszerszy zestaw (mieszkania, 15 szeregów) przy 120 miesiącach to ok. 10 tys. znaków. Dla trendów bierz dane roczne/kwartalne; miesięczne 120 okresów tylko, gdy użytkownik o to prosi. | |
| location | Yes | polska (cała Polska), agregat 7-miast, 10-miast albo 6-miast-bez-warszawy, albo jedno z 66 miast na prawach powiatu: nazwa małymi literami bez polskich znaków, z myślnikami zamiast spacji, np. warszawa, krakow, lodz, bielsko-biala, zielona-gora; Jastrzębie-Zdrój to jastrzebie. Dane są tylko dla 66 miast na prawach powiatu, a nie dla dzielnic i mniejszych miejscowości. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | Co zrobić dalej, gdy wynik jest obcięty. |
| note | No | Uwaga do danych, np. ostatni kwartał obejmuje tylko część miesięcy. |
| title | Yes | |
| total | Yes | Wszystkie okresy, które serwis ma dla tego zestawu. |
| series | Yes | |
| source | Yes | Źródło danych: GUS, NBP albo Eurostat. |
| dataset | Yes | |
| periods | Yes | Okresy od najstarszego: 2025 (rok), 2025-Q3 (kwartał) albo 2025-08 (miesiąc). |
| returned | Yes | Okresy w wyniku: ostatnie z nich. |
| frequency | Yes | year (lata), quarter (kwartały) albo month (miesiące). |
| stats_url | No | Link do sekcji z tymi danymi w serwisie: podaj go użytkownikowi. |
| truncated | Yes | true: są starsze okresy niż pokazane; co dalej, mówi hint. |
| location_name | Yes | |
| location_slug | Yes | |
| available_from | Yes | Najstarszy okres, jaki ma serwis. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint and openWorldHint, yet the description adds substantial behavioral detail: default 12 periods, truncated=true signalling older data, the 120-period cap, nbp_prices limited to 17 cities and 3 aggregates (not Poland), per-location dataset availability errors, publication lag, and a warning to read 'note' because the latest period may be incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but well-structured into three blocks (what it returns, return shape, limitations) with the core purpose front-loaded. Dense and mostly waste-free, though the return-field enumeration overlaps with the output schema and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with an output schema, the description covers the remaining gaps an agent needs: default/limit behavior, truncation, geographic coverage restrictions, data freshness/lag, and incomplete-period caveats. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: the tradeoff between period frequency and payload size, the availability constraint that not every dataset exists for every location, and the fact that errors indicate which argument to change. The dataset/location enumerations themselves stay in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a precise verb+resource ('Zwraca oficjalne statystyki GUS i NBP jako szeregi czasowe') and enumerates the covered domains and the geographic scopes. It explicitly carves out what it does NOT return ('ofert i cen konkretnych mieszkań tu nie ma (search_offers)'), so an agent can separate it from offer-level siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('Użyj jako kontekstu rynku') and an explicit exclusion pointing to search_offers for specific listings. However, it does not route against the obvious closest siblings get_market_statistics and get_transaction_statistics, leaving the agent to guess which statistics tool to pick in borderline cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_investmentInwestycja z ofertamiARead-only
Zwraca inwestycję (projekt deweloperski): miasto, ulicę, współrzędne, dewelopera, średnie ceny aktywnych ofert, liczbę ofert i listę ofert (najpierw aktywne, potem archiwalne). Użyj, gdy chcesz zobaczyć mieszkania jednego projektu. investment_slug daje search_investments, search_offers albo get_developer. investment_url i developer_url to strony inwestycji i dewelopera na deweloperuch.pl: podawaj je użytkownikowi jako linki.
Ograniczenia: zwraca najwyżej limit ofert (domyślnie 20); offers_returned mówi, ile ich jest na liście, truncated i offers_omitted, czy i ile pominięto. offers_total to liczba z serwisu, a pominięte oferty liczy offers_omitted. Przy dużej inwestycji nie zwiększaj limitu bez potrzeby; offers_omitted > 0 znaczy, że lista jest niepełna. include_history=true dodaje historię ceny każdej zwróconej oferty: wynik jest dłuższy i powstaje wolniej. Dla jednej oferty lepiej użyć get_offer.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Najwięcej ofert w wyniku (najpierw aktywne), domyślnie 20, 0 = tylko podsumowanie inwestycji. Ile pominięto, mówi offers_omitted. Każda oferta to ok. 300 znaków wyniku, z historią ceny kilkaset więcej. Maksimum 200 daje ok. 60 tys. znaków; zwykle wystarcza domyślne 20. | |
| include_history | No | true: dołącz historię ceny każdej zwróconej oferty (dłuższy wynik). | |
| investment_slug | Yes | investment_slug z search_investments, search_offers albo get_developer, np. smolna. |
Output Schema
| Name | Required | Description |
|---|---|---|
| lat | No | |
| lng | No | |
| city | Yes | |
| name | Yes | |
| offers | Yes | |
| status | Yes | active (aktualna) albo archived (wycofana). |
| street | No | |
| currency | No | |
| avg_price | No | Średnia cena aktywnych ofert w PLN. |
| city_slug | Yes | |
| developer | Yes | |
| truncated | Yes | true: lista offers jest niepełna (offers_omitted > 0). |
| avg_area_m2 | No | |
| offers_total | No | Wszystkie oferty inwestycji wg serwisu, także archiwalne; lista offers jest ucięta przez limit. |
| developer_url | No | Profil dewelopera na deweloperuch.pl: podaj go użytkownikowi jako link. |
| offers_active | No | |
| investment_url | No | Strona inwestycji na deweloperuch.pl: podaj ją użytkownikowi jako link. |
| offers_omitted | Yes | Ofert pominiętych przez limit. |
| investment_slug | Yes | |
| offers_returned | Yes | Ofert na liście offers. |
| avg_price_per_m2 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the operational burden and does so well: it explains the limit default, the truncation contract (offers_returned, truncated, offers_omitted, offers_total), warns not to raise the limit casually, and flags that include_history makes the result longer and slower. It loses a point because much of that field-level detail is already carried by the output schema rather than being purely additive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is strong and front-loaded: what it returns, then when to use it, then constraints and the sibling alternative. It is somewhat long for the payload it delivers, and the limit/default restatement duplicates the schema, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, yet the description still supplies the pieces the schema cannot: when to pick this over get_offer, how to source the slug, and how to interpret truncation. For a read-only three-parameter lookup, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, include_history and investment_slug with defaults, ranges and the slug's provenance. The description largely restates those (default 20, include_history extends the result) instead of adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Zwraca inwestycję (projekt deweloperski)') and enumerates the returned data: city, street, coordinates, developer, average active-offer prices, offer count and offer list. It explicitly separates itself from the sibling get_offer ('Dla jednej oferty lepiej użyć get_offer'), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('Użyj, gdy chcesz zobaczyć mieszkania jednego projektu'), names the alternative for the single-offer case, and states exactly where investment_slug originates (search_investments, search_offers, get_developer). It also tells the agent to surface investment_url/developer_url to the user as links, which is actionable guidance rather than description filler.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_statisticsStatystyki rynku miastaARead-only
Zwraca statystyki rynku ofert deweloperskich w jednym mieście: liczbę ofert, inwestycji i deweloperów, rozkład cen (PLN), cen za m² (PLN/m²) i metraży (m²) jako min, p25, median, p75 i max oraz największych deweloperów wg liczby ofert (developer_slug, offers, investments, median_price_per_m2, developer_url; developer_slug to identyfikator, a nazwę dewelopera daje get_developer). Opcjonalnie tylko oferty z zakresu ceny i metrażu. Użyj, gdy pytanie dotyczy rynku miasta (typowe ceny, kto ma najwięcej ofert), a nie konkretnych mieszkań (search_offers).
Ograniczenia: tylko aktywne oferty (bez archiwalnych) i tylko jedno miasto (city_slug z search_locations; polska nie działa). Liczby mogą się nieco różnić od total w search_offers. Pojedynczych ofert tu nie ma: list_url to lista tych ofert na deweloperuch.pl z tymi samymi filtrami, a developer_url profil dewelopera: podawaj je użytkownikowi jako linki.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | city_slug jednego miasta z search_locations, np. krakow (nie polska). | |
| area_max | No | Największy metraż w m². | |
| area_min | No | Najmniejszy metraż w m². | |
| price_max | No | Najwyższa cena oferty w PLN. | |
| price_min | No | Najniższa cena oferty w PLN. | |
| top_developers | No | Ilu największych deweloperów pokazać, 1–30, domyślnie 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| price | No | Ceny w PLN: min, kwartyle, mediana, max. |
| offers | Yes | Pasujące aktywne oferty. |
| area_m2 | No | Metraże w m². |
| list_url | No | Lista tych ofert na deweloperuch.pl (te same filtry ceny i metrażu): podaj ją użytkownikowi jako link. |
| city_slug | Yes | |
| truncated | Yes | true: deweloperów jest więcej niż w top_developers. |
| developers | Yes | Wszyscy deweloperzy z pasującymi ofertami. |
| investments | Yes | |
| price_per_m2 | No | Ceny za m² w PLN. |
| top_developers | Yes | Deweloperzy z największą liczbą pasujących ofert, malejąco. |
| developers_omitted | Yes | |
| developers_returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds substantial behavior beyond that: only active (non-archived) offers, exactly one city, counts that may diverge from search_offers totals, no individual offers, and guidance that list_url/developer_url should be surfaced as links. This is unusually rich scoping and output-behavior disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then usage, then limitations — a sensible order. It is dense and somewhat long, with a heavy parenthetical enumerating return fields that is partly redundant with the output schema, but every sentence still carries routing or constraint information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description still covers purpose, routing, filtering scope, data-source caveats, and exactly one city. For a 6-parameter read-only statistics tool, an agent has everything needed to invoke it and interpret constraints correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by clarifying that the price/area filters are optional and applied to offers, that city must be a city_slug from search_locations, and that 'polska' will not work — meaning not captured in the schema field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Zwraca statystyki rynku ofert deweloperskich w jednym mieście') and enumerates exactly what is returned: offer/investment/developer counts, price and price-per-m² distributions, area percentiles, and top developers. It explicitly distinguishes itself from search_offers ('a nie konkretnych mieszkań'), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('Użyj, gdy pytanie dotyczy rynku miasta... typowe ceny, kto ma najwięcej ofert') and names the alternative tool for the contrasting case ('a nie konkretnych mieszkań (search_offers)'). Limitations are also spelled out (active offers only, single city, counts may differ).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_offerOferta z historią cenyARead-only
Zwraca jedną ofertę z pełną historią ceny, inwestycją i deweloperem. Użyj, gdy chcesz zobaczyć, jak zmieniała się cena mieszkania. Wymaga offer_id i investment_slug (oba podaje search_offers albo get_investment): samo offer_id nie wystarcza.
Zwraca cenę, metraż, cenę za m², status (active albo archived), zmianę od pierwszej ceny, daty, price_history (date, kind: offer, archived albo restored, price) i price_flags. investment_url i developer_url to strony inwestycji i dewelopera na deweloperuch.pl: podawaj je użytkownikowi jako linki. Do listy ofert jednej inwestycji użyj get_investment.
price_flags (na dziś; ceny z offer i restored, wycofanie przerywa cenę; oferta archiwalna do dnia wycofania): lowest_price_30d i lowest_price_90d to najniższa cena obowiązująca w ostatnich 30 i 90 dniach, także ta sprzed okna; price_changes to liczba zmian ceny; largest_drop_pct i largest_rise_pct to największa pojedyncza obniżka i podwyżka w % poprzedniej ceny; suspicious_reduction=true, gdy ostatnia obniżka przyszła do 30 dni po podwyżce, a nowa cena nie jest niższa od najniższej z 30 dni przed nią („promocja” po podwyżce).
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | Yes | offer_id z search_offers albo get_investment. | |
| investment_slug | Yes | investment_slug inwestycji tej oferty, np. smolna (z search_investments, search_offers albo get_developer). |
Output Schema
| Name | Required | Description |
|---|---|---|
| city | Yes | |
| name | Yes | |
| price | No | Cena ofertowa w PLN (nie transakcyjna). |
| status | Yes | active (aktualna) albo archived (wycofana). |
| area_m2 | No | Metraż w m². |
| currency | No | |
| offer_id | Yes | |
| city_slug | Yes | |
| developer | Yes | |
| price_flags | No | Wnioski z historii ceny na dziś: ceny z offer i restored; wycofanie przerywa obowiązującą cenę. |
| price_per_m2 | No | Cena za m² w PLN (price / area_m2). |
| creation_date | No | |
| developer_url | No | Profil dewelopera na deweloperuch.pl: podaj go użytkownikowi jako link. |
| price_history | Yes | |
| investment_url | No | Strona inwestycji na deweloperuch.pl: podaj ją użytkownikowi jako link. |
| investment_name | Yes | |
| investment_slug | Yes | |
| last_event_date | No | |
| last_change_date | No | |
| price_change_since_start | No | Zmiana ceny od pierwszej zaobserwowanej, w PLN (ujemna = tańsza). |
| price_change_since_start_pct | No | Zmiana ceny od pierwszej zaobserwowanej, w procentach (ujemna = tańsza). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: the two-parameter prerequisite, the fields returned, the semantic meaning of price_flags, and the instruction to surface investment_url/developer_url as links. It does not cover pagination or error behavior, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded correctly: purpose, then when-to-use, then prerequisites, then return contents. The price_flags explanation is lengthy and partly overlaps what the output schema already carries, but it does encode semantics (e.g. the suspicious_reduction rule) that are not self-evident. Slightly verbose but each block earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool whose complexity lies in price-history interpretation, the description supplies the prerequisite, the alternative tool, the return shape, and the meaning of every flag. Even though an output schema exists, the semantic definitions of lowest_price_30d/90d and suspicious_reduction are necessary context an agent cannot infer from structure alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters and their sources. The description adds only the constraint that offer_id alone is not enough, which is a marginal increment over the schema's own parameter descriptions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: it returns one offer together with its full price history, investment, and developer. It explicitly distinguishes itself from the sibling get_investment by noting that listing offers for one investment is a different tool. An agent can tell exactly what it retrieves without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use case ("Użyj, gdy chcesz zobaczyć, jak zmieniała się cena mieszkania"), names the alternative for a related task (get_investment for offer lists), and states a hard prerequisite: both offer_id and investment_slug are required, with offer_id alone insufficient. Nothing about when/when-not is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_statisticsCeny transakcyjne w czasieARead-only
Zwraca ceny transakcyjne mieszkań w mieście z Rejestru Cen Nieruchomości (RCN) w kolejnych miesiącach albo kwartałach: liczbę transakcji i ceny za m². To ceny faktycznych sprzedaży, a nie ceny ofertowe deweloperów (search_offers, get_market_statistics) ani oficjalne ceny NBP (get_government_statistics).
granularity=month (domyślnie): mediana i średnia ceny za m², mediana metrażu i mediana ceny mieszkania. granularity=quarter: tylko średnia cena za m² i liczba transakcji, za to dłuższa historia. Miesiące i kwartały to różne statystyki: nie łącz ich w jeden wykres ani szereg.
Zwraca periods (od najstarszego; okres bez transakcji nie ma cen) oraz total, returned, truncated, available_from, hint, note i stats_url (link dla użytkownika).
Ograniczenia: tylko mieszkania i całe miasta (city_slug z search_locations; bez dzielnic, ulic i całej Polski). Domyślnie ostatnie 12 okresów; truncated=true znaczy, że są starsze (zwiększ periods, najwyżej 60). Najnowsze miesiące są niepełne, bo transakcje trafiają do RCN z kilkumiesięcznym opóźnieniem: mają zaniżoną liczbę transakcji i niepewne ceny, więc ich spadku nie traktuj jako trendu (przeczytaj note).
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | city_slug miasta z search_locations, np. warszawa, krakow, gdansk (małe litery bez polskich znaków). Statystyki są dla całych miast; dzielnice, ulice i cała Polska (polska) nie są obsługiwane. | |
| periods | No | Ile ostatnich okresów (miesięcy albo kwartałów) zwrócić, 1–60, domyślnie 12. 60 miesięcy to ok. 9 tys. znaków; dla trendu wieloletniego wybierz quarter zamiast wielu miesięcy. | |
| granularity | No | month (domyślnie): miesiące, z medianą i średnią ceny za m², medianą metrażu i medianą ceny mieszkania; quarter: kwartały, tylko średnia cena za m² i liczba transakcji, ale dłuższa historia. | month |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | Co zrobić dalej, gdy wynik jest obcięty. |
| note | Yes | Uwaga do danych: najnowsze okresy są niepełne. |
| total | Yes | Wszystkie okresy, które serwis ma dla miasta. |
| periods | Yes | Okresy od najstarszego; okres bez transakcji nie ma cen ani metrażu. |
| returned | Yes | Okresy w wyniku: ostatnie z nich. |
| city_slug | Yes | |
| stats_url | No | Strona statystyk transakcji na deweloperuch.pl dla ludzi: podaj ją użytkownikowi jako link. |
| truncated | Yes | true: są starsze okresy niż pokazane; co dalej, mówi hint. |
| granularity | Yes | month (miesiące) albo quarter (kwartały). |
| available_from | Yes | Najstarszy okres, jaki ma serwis. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses reporting latency ('transakcje trafiają do RCN z kilkumiesięcznym opóźnieniem'), that recent months are incomplete with understated counts and uncertain prices, that truncated=true signals older data exists, and that empty periods carry no prices. These caveats directly affect interpretation of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then distinctions, then behavioral caveats — good ordering. It is dense and repeats the month-vs-quarter field list that the granularity schema description already carries, which costs a little efficiency but the repetition is defensible for a statistical tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description enumerates the return envelope (periods, total, returned, truncated, available_from, hint, note, stats_url) and, more importantly, supplies the interpretive caveats (incomplete recent months, truncation semantics) an agent needs to use the output correctly. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new guidance: the 60-period cap implies ~9k characters and the recommendation to use quarter for long-term trends. It also restates the scope restriction (whole cities only, no districts/streets/polska) that the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Zwraca ceny transakcyjne mieszkań w mieście z Rejestru Cen Nieruchomości') plus the unit of analysis (miesiące/kwartały: liczba transakcji i ceny za m²). It explicitly distinguishes itself from three siblings (search_offers, get_market_statistics, get_government_statistics) by contrasting actual sale prices against offer prices and NBP figures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use search_offers/get_market_statistics for offer prices, get_government_statistics for official NBP prices, this tool for actual RCN transactions. It also states when to pick quarter over month ('dla trendu wieloletniego wybierz quarter zamiast wielu miesięcy') and warns not to combine months and quarters in one series.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rank_locationsRanking miast i powiatówARead-only
Ranking miejscowości (level=city) albo powiatów (level=powiat) w Polsce według transakcji z Rejestru Cen Nieruchomości (RCN): liczba transakcji i cena transakcyjna za m². Dla porównania wielu miast (gdzie najwięcej transakcji, gdzie najdrożej, gdzie najtaniej): to narzędzie; dla trendu jednego miasta w czasie: get_transaction_statistics. To ceny transakcyjne, nie ofertowe; oferty deweloperów daje search_offers.
Zwraca total (miejsca z co najmniej min_transactions transakcji), returned, truncated, hint i items (name, city_slug albo powiat_id, transaction_count, price_per_m2, area_m2, price); dla city także ranking_url (strona rankingu na deweloperuch.pl: podaj ją użytkownikowi jako link). powiat_id jest informacyjny: żadne narzędzie go nie przyjmuje.
Ograniczenia: serwis nie podaje okresu ani tego, czy ceny i metraż to średnie, czy mediany: przedstawiaj je jako wartości podane przez serwis. Liczby transakcji powiatów obejmują wiele lat: służą tylko do uporządkowania, nie są bieżącym wolumenem; nie porównuj ich z liczbami miejscowości. Przy sortowaniu miejscowości po cenie podaj min_transactions (np. 50): przy kilku transakcjach cena bywa przypadkowa.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | transactions_desc: najwięcej transakcji (domyślnie); price_per_m2_desc: najwyższa cena za m²; price_per_m2_asc: najniższa cena za m². Miejsca bez ceny są na końcu. | transactions_desc |
| level | No | city: miejscowości (miasta, także małe miasteczka i wsie), domyślnie; powiat: powiaty (bez ranking_url i bez odpowiednika w search_locations). | city |
| limit | No | Ile pierwszych pozycji rankingu zwrócić, 1–100, domyślnie 20. Pozycja to ok. 120 znaków wyniku. Dla pełnych list zawężaj min_transactions, nie podnoś limitu bez potrzeby. | |
| min_transactions | No | Pomiń miejsca z mniejszą liczbą transakcji; domyślnie 0 (wszystkie). Przy sortowaniu miejscowości (level=city) po cenie podaj np. 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | Co zrobić, gdy wynik jest obcięty albo pusty. |
| sort | Yes | Kolejność rankingu, jak w argumencie sort. |
| items | Yes | |
| level | Yes | city (miejscowości) albo powiat (powiaty). |
| total | Yes | Wszystkie miejsca tego poziomu z co najmniej min_transactions transakcji. |
| returned | Yes | Pozycje w items: pierwsze z rankingu. |
| truncated | Yes | true: miejsc jest więcej, niż pokazano; co dalej, mówi hint. |
| ranking_url | No | Strona rankingu miast na deweloperuch.pl (tylko level=city): podaj ją użytkownikowi jako link. |
| min_transactions | Yes | Próg z argumentu min_transactions (0 = wszystkie miejsca). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint; the description adds substantial behavioral context the annotations cannot: return envelope (total, returned, truncated, hint, items), the ranking_url for city level, the fact powiat_id is informational and accepted by no tool, and data-quality caveats (no period given, mean/median unknown, powiat counts span many years and are not comparable to city counts).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well-structured: purpose and routing first, then return shape, then constraints. All sentences carry information, though the return-shape detail is somewhat redundant given the tool has an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only ranking tool with a full output schema and 100% parameter coverage, the description covers routing, data caveats, and result interpretation (ranking_url to hand to the user, non-comparable powiat counts). Nothing an agent needs to call and present it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains sort, level, limit and min_transactions; the description's parameter value is mostly reinforcement plus practical guidance (e.g., set min_transactions≈50 when sorting by price, don't raise limit unnecessarily). It adds some real advice beyond the schema but does not carry the primary burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource: ranking of Polish towns (level=city) or powiatów by RCN transactions, with metrics (transaction count, price per m²). It explicitly distinguishes itself from get_transaction_statistics (single-city trend) and search_offers (offer prices), so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: comparing many cities (most transactions, most expensive, cheapest) → this tool; single city over time → get_transaction_statistics; developer offer prices → search_offers. It also gives a concrete usage rule (supply min_transactions ~50 when sorting cities by price).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_developersSzukaj deweloperówARead-only
Znajduje deweloperów (rynek pierwotny) po fragmencie nazwy, np. atal albo dom development. Użyj, żeby zamienić nazwę dewelopera na developer_slug, którego wymaga get_developer (profil dewelopera; domyślnie dla całej Polski, city=polska). Nie zwraca ofert ani cen.
Zwraca items (developer_slug, name, offer_count, czyli liczbę ofert dewelopera wg serwisu, i developer_url, czyli profil na deweloperuch.pl: podawaj go użytkownikowi jako link) oraz total, returned, truncated i hint. truncated=true znaczy, że pasujących deweloperów jest więcej niż pokazano: doprecyzuj nazwę albo zwiększ limit (najwyżej 20). total jest null, gdy wiadomo tylko, że jest ich więcej.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Fragment nazwy dewelopera, 2–100 znaków, np. atal, Dom Development. | |
| limit | No | Najwięcej deweloperów w wyniku, domyślnie 5, najwyżej 20. Każdy to ok. 150 znaków wyniku. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| items | Yes | |
| total | Yes | Wszyscy pasujący deweloperzy; null, gdy wiadomo tylko, że jest ich więcej. |
| returned | Yes | |
| truncated | Yes | true: pasujących deweloperów jest więcej niż pokazano; co dalej, mówi hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds genuinely useful behavior: the name-to-slug conversion role, the truncation contract (truncated=true means more matches exist, refine or raise limit to max 20), and the total=null edge case. It does restate some return-field structure that the output schema likely covers, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose before the routing rationale, then the return/truncation contract. Dense but every sentence carries information; the field-by-field enumeration of items is the only mild over-explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter descriptions, and annotations present, the description only needs to add the lookup role and truncation handling, both of which it covers. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both 'name' (fragment, 2–100 chars, examples) and 'limit' (default 5, max 20). The description largely repeats those facts, though it does add the framing that 'name' is a lookup key for slug resolution. Baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Znajduje deweloperów ... po fragmencie nazwy') and scopes it to the primary market, then explicitly excludes adjacent data ('Nie zwraca ofert ani cen'). It distinguishes itself from siblings by naming the downstream tool it feeds, get_developer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Użyj, żeby zamienić nazwę dewelopera na developer_slug, którego wymaga get_developer'), names the alternative/next step, and states a when-not ('Nie zwraca ofert ani cen'). An agent knows exactly when to pick this over search_offers or get_developer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_investmentsSzukaj inwestycjiARead-only
Wyszukuje inwestycje (projekty deweloperskie, rynek pierwotny). Dwa tryby: city (pełne dane) albo samo name (cała Polska; tylko investment_slug, name i offers_active, w kolejności serwisu). Użyj, gdy pytanie dotyczy projektów, a nie pojedynczych mieszkań: np. najtańsze za m² w mieście, inwestycje jednego dewelopera, slug inwestycji po nazwie.
Z city zwraca inwestycje, które serwis pokazuje na mapie miasta (z aktywnymi ofertami; bez nich mogą nie być na liście): investment_slug, name, city_slug, ulica, status, offers_active, offers_total, średnie (avg_price, avg_area_m2, avg_price_per_m2; tylko aktywne oferty, wg serwisu), developer_slug, developer_name, investment_url i developer_url. name i developer_slug zawężają listę, sort ją porządkuje (domyślnie najwięcej aktywnych ofert); pozycje bez średniej są na końcu. Oferty i szczegóły inwestycji daje get_investment (investment_slug). Linki podawaj użytkownikowi.
Ograniczenia: najwyżej limit pozycji; total, returned, truncated i hint mówią, ile pominięto i co zawęzić. Nie filtruje po cenie ani metrażu (do tego search_offers); city=polska nie działa.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | city_slug miasta z search_locations, np. warszawa, sopot (nie polska). | |
| name | No | Fragment nazwy inwestycji, 2–100 znaków, np. Kolibki. Z city wielkość liter i polskie znaki nie mają znaczenia; bez city szuka serwis w całej Polsce. | |
| sort | No | Tylko z city. active_offers: najwięcej aktywnych ofert (domyślnie); price_per_m2_asc, price_per_m2_desc: średnia cena za m²; price_asc, price_desc: średnia cena; name: alfabetycznie. Bez średniej na końcu. | |
| limit | No | Najwięcej inwestycji w wyniku, 1–30, domyślnie 10. Pozycja z city to ok. 550–750 znaków wyniku (z linkami), więc 30 daje najwyżej ok. 23 tys.; zwykle wystarcza 10. | |
| developer_slug | No | developer_slug z search_developers (po nazwie) albo z pól developer_slug w search_offers, get_investment, get_offer, np. atal. Tylko z city. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| items | Yes | |
| total | Yes | Wszystkie pasujące; null, gdy serwis nie podaje (szukanie po nazwie). |
| returned | Yes | |
| truncated | Yes | true: pasujących jest więcej, niż pokazano; co zawęzić, mówi hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the real behavioral load: it discloses that city mode returns only investments the site shows on the city map (those without active offers may be absent), that averages cover active offers only, that items without an average sort last, and that total/returned/truncated/hint report what was cut. It even flags that links should be surfaced to the user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the two modes, then grouped into return fields and limits. Dense and mostly waste-free, though the enumerated return-field list partially duplicates what the output schema already provides and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter search tool with an output schema, annotations, and eleven siblings, nothing an agent needs is missing: mode selection, field availability per mode, sorting behavior, filtering exclusions, and truncation reporting are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema does not: which parameters only work together with city (sort, developer_slug), how name alone switches to nationwide site-ordered search, and a practical sizing rule for limit (roughly 550–750 output characters per city item).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Wyszukuje inwestycje – projekty deweloperskie, rynek pierwotny') and immediately distinguishes the two operating modes (city = full data, name-only = whole Poland with a reduced field set). An agent can tell this apart from search_offers and get_investment without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance with concrete examples (cheapest per m² in a city, one developer's projects, slug lookup by name) and names the boundary against siblings: price/area filtering goes to search_offers, offer and project details go to get_investment. It also states the negative case (city=polska does not work).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_locationsSzukaj lokalizacjiARead-only
Znajduje miasta, dzielnice i ulice w Polsce po fragmencie nazwy. Użyj na początku, żeby zamienić nazwę miejsca na city_slug, którego wymaga search_offers. Nie zwraca ofert ani cen.
Zwraca items (kind: city, district albo street; name, city, city_slug, opcjonalnie district, street, lat, lng i offer_count, czyli liczbę ofert wg serwisu) oraz total, returned, truncated i hint. total jest null, gdy wyników jest więcej niż pokazano; truncated=true znaczy, że pasujących może być więcej: doprecyzuj nazwę. Miejscowości z offer_count=0 nie mają ofert: nie przekazuj ich do search_offers. Dzielnica i ulica podają city_slug swojego miasta. Nazwę dzielnicy (kind=district, pole name) przekaż do search_offers jako district razem z tym city_slug; po ulicy search_offers nie filtruje.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Fragment nazwy miasta, dzielnicy lub ulicy, 2–100 znaków, z polskimi znakami, np. Kraków, Mokotów. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| items | Yes | |
| total | Yes | Wszystkie pasujące; null, gdy wyników jest więcej niż pokazano. |
| returned | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/open-world safety, and the description adds valuable semantics beyond them: total=null meaning, truncated=true handling, offer_count=0 exclusion, and that search_offers does not filter by street. Much of the raw field list is redundant with the existing output schema, so it stops short of a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by usage, then output semantics; every sentence is information-dense. It is somewhat long and the itemized field list borders on redundancy given the output schema, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single-param tool with an output schema and read-only annotations, the description covers purpose, the sibling dependency, edge-case semantics (truncation, zero-offer filtering), and downstream usage. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single query param is fully documented in the schema (length, Polish characters, examples). The description restates it as a name fragment without adding syntax or format beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: finds cities, districts and streets in Poland by name fragment. It explicitly distinguishes itself from siblings by noting it returns neither offers nor prices, which sets it apart from search_offers. An agent can identify its role immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it at the beginning to convert a place name into the city_slug required by search_offers, giving the exact ordering and dependency. It also states when NOT to forward results (offer_count=0) and how district/street map to search_offers parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_offersSzukaj ofert mieszkańARead-only
Wyszukuje oferty mieszkań od deweloperów (tylko rynek pierwotny, ceny ofertowe, nie transakcyjne) w jednym mieście albo w całej Polsce (city=polska). Filtry: cena, metraż, cena za m², dzielnica, status (aktywne, archiwalne) i obniżka od pierwszej ceny; sortowanie po cenie, cenie za m², metrażu albo największej obniżce. Nie filtruje po liczbie pokoi ani piętrze (serwis nie ma takich danych) ani po deweloperze (jego inwestycje daje get_developer).
Zwraca jedną stronę: total (wszystkie pasujące), returned, page, per_page, pages_available, truncated, hint, list_url i items (offer_id, investment_slug, investment_url (strona inwestycji), name, cena w PLN, metraż w m², cena za m², status, inwestycja, deweloper z developer_slug, zmiany ceny w procentach; miasto tylko przy city=polska). Pozycje są skrócone; szczegóły oferty i historię ceny daje get_offer. list_url to ta lista na deweloperuch.pl z tymi samymi filtrami. Linki podawaj użytkownikowi.
Ograniczenia: można przejrzeć najwyżej 20 stron po per_page ofert. Gdy truncated=true, zawęź filtry zamiast przeglądać kolejne strony. Wszystkie oferty jednej inwestycji daje get_investment, ceny całego miasta get_market_statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | city_slug miasta z search_locations (np. warszawa, krakow) albo polska dla całego kraju. | |
| page | No | Numer strony wyników, 1–20. | |
| sort | No | price_asc: od najtańszych, price_desc: od najdroższych, price_per_m2_asc i price_per_m2_desc: po cenie za m², area_asc i area_desc: po metrażu, biggest_drop: najpierw największa obniżka od pierwszej ceny (w %); brak: domyślna kolejność serwisu (nie jest gwarantowana). | |
| status | No | active (domyślnie): oferty obecnie w cennikach; archived: tylko wycofane; all: aktywne i wycofane. | active |
| area_max | No | Największy metraż w m². | |
| area_min | No | Najmniejszy metraż w m². | |
| district | No | Nazwa dzielnicy dokładnie tak, jak podaje ją search_locations (kind=district, pole name), np. Mokotów; tylko z miastem tej dzielnicy, nie z polska. | |
| per_page | No | 10 albo 50. Pozycja to ok. 500 znaków wyniku (z linkiem), więc 50 daje ok. 25 tys.; zwykle wystarcza 10. | |
| price_max | No | Najwyższa cena oferty w PLN. | |
| price_min | No | Najniższa cena oferty w PLN. | |
| price_dropped | No | true: tylko oferty, których obecna cena jest niższa od pierwszej ceny (liczy się zmiana od pierwszej ceny, nie ostatnia zmiana). | |
| price_per_m2_max | No | Najwyższa cena za m² w PLN. | |
| price_per_m2_min | No | Najniższa cena za m² w PLN. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| page | Yes | |
| items | Yes | |
| total | Yes | |
| list_url | No | Ta lista ofert na deweloperuch.pl (te same filtry, sortowanie i strona): podaj ją użytkownikowi jako link. |
| per_page | Yes | |
| returned | Yes | |
| truncated | Yes | true: pasujących ofert jest więcej, niż można przejrzeć (najwyżej 20 stron); zawęź filtry. |
| pages_available | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes far beyond by disclosing the 20-page cap, the truncated flag semantics with remediation ('zawęź filtry zamiast przeglądać kolejne strony'), the truncated-items behavior, and the list_url reuse. This is rich behavioral context an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but dense and clearly front-loaded: purpose, filters, return shape, then limits. Every paragraph carries distinct information (filter set, return fields, pagination cap, alternatives), though it is near the upper bound of useful length for a 13-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex paginated search with an output schema, the description still explains the return envelope, the truncated hint, the 20-page limit, and the correct fallbacks to sibling tools. Nothing an agent needs to call it correctly or handle its edge cases is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond it: the offer-price vs transaction-price framing, the city=polska sentinel, the district-only-with-matching-city constraint, and the fact that rooms/floor are unsupported. These context notes are genuinely additive over the schema field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Wyszukuje oferty mieszkań od deweloperów') and immediately scopes it (tylko rynek pierwotny, ceny ofertowe, nie transakcyjne). It also names sibling tools for adjacent tasks, so an agent can distinguish it from get_offer, get_investment and get_market_statistics without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states what it does NOT filter by (liczba pokoi, piętro, deweloper) and routes each unsupported case to the correct alternative (get_developer, get_investment, get_market_statistics). It also gives the polska-vs-city selection rule and the truncated=true workflow, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.3- First observed
estimate_property_value - First observed
get_building - First observed
get_developer - First observed
get_government_statistics - First observed
get_investment - First observed
get_market_statistics - First observed
get_offer - First observed
get_transaction_statistics - First observed
rank_locations - First observed
search_developers - First observed
search_investments - First observed
search_locations - First observed
search_offers
TDQS
Scored across 13 tools
Each tool targets a distinct resource or data source (locations, primary-market offers, investments, developers, RCN transactions, GUS/NBP statistics, valuation). Descriptions explicitly state when to use one tool versus another (e.g. search_offers vs get_investment vs get_market_statistics), leaving little room for misselection despite the cluster of statistical tools.
All tool names follow a consistent snake_case verb_noun pattern (search_locations, get_offer, rank_locations, estimate_property_value), with no mixed conventions or vague verbs. The pattern is predictable and readable across the whole set.
13 tools is well-scoped for a Polish real-estate research server covering discovery, detail lookup, statistics, ranking, valuation and government data. Each tool earns its place; there is no obvious bloat or thin surface.
The surface covers the main lifecycle: resolving locations/developers, searching offers/investments, fetching detail and history, transaction and government statistics, ranking and valuation. Minor gaps remain, such as no built-in address-to-coordinates geocoding and no district-level transaction statistics, but these are documented limitations agents can work around.
Maintenance
Related MCP Connectors
An open MCP server for the Portuguese housing market, run by flatin.pt. No API key, no registration, no rate-limit negotiation. Twelve tools: • imt_calculate — IMT and Imposto do Selo on a purchase, 2026 tables, including the reduced table, the relief for buyers aged 35 or under and the flat rate for non-residents • imi_rate / imi_annual_cost — the IMI rate of any of the 308 municipalities for 2023–2025, and the annual bill for a given VPT • construction_barometer — how many building-permit cases enter a town hall each month (our own indicator: monthly for three municipalities, annual for eight, method and revision policy published) • search_newbuilds / get_newbuild — 250 new developments, 53 municipalities, 71 developers, with stage and, where published, price • where_to_live / municipality_stats / compare_municipalities — municipal comparisons • glossary_lookup — Portuguese property and tax terms • request_consultation / subscribe_digest — reaching a human The data behind the tax tools is published as open data under CC BY 4.0 on the Portuguese national portal (dados.gov.pt) and archived on Zenodo with a permanent DOI. Anyone may reuse it. Humans, not bots, answer the people who get in touch: a home purchase involves personal data under the GDPR and decisions that cannot be refunded.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Public Data Ukraine Mcp connects AI agents to real public APIs via MCP. Tools include
Housing Intel MCP — Meta-pack that chains FRED, BLS, ATTOM, and HUD APIs into higher-level housing…
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceExposes ATTOM's real estate API as MCP tools, enabling property details, valuations, assessments, sales, and area data via natural language.24 PyPI2-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and analyze Korean property data—court auctions, actual transactions, subscription announcements, price trends, and loan/tax calculations—through MCP tools.MIT
- AlicenseAqualityBmaintenanceGives AI agents read-only access to Bulgarian real-estate data from imotai.bg, letting them list districts, search and fetch active listings, pull district-level market statistics, and estimate values from current asking prices. All results are field-allowlisted and rate limited, with no credentials, broker contact details, or written descriptions exposed.5MIT
- AlicenseAqualityCmaintenanceEnables AI agents to compute Dubai Land Department transaction fees, rental yields, Central Bank mortgage and LTV limits, and Golden Visa eligibility thresholds, while querying curated off-plan developments and district price benchmarks. It exposes these as deterministic MCP tools, resources, and prompt templates over stdio transport.5MIT