A property inquiry agent answers a renter’s question from listing records and policy text, shows the evidence behind each reply, and passes anything it cannot settle to a person. Luka Engels’s TypeScript project, described in his article of 29 September 2026, does exactly that, but it is a local prototype built on synthetic data, not a finished agency system. This guide explains how the pieces fit together, which parts of the design are verified by his own tests, and where the checks stop.
How a single inquiry moves through the system
The architecture is a chain of five stages. Each stage has a narrow job, and each one leaves a trace that the interface can display.
As an Amazon Associate I earn from qualifying purchases.
- The React inquiry desk sends the customer’s question to a server-side agent loop.
- The agent loop asks a conversational model which tools to call. The model decides; the loop does not guess.
- An MCP client executes the requested calls against the project’s own MCP server.
- The model drafts an answer, and the loop runs its answer checks before anything reaches the customer.
- The response returns the reply, citations, any hand-off tickets, a tool trace, and usage information.
The project also exposes a command-line interface and an HTTP API, so the same loop can be driven without the browser demo.
PC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteThe four MCP tools and the policy resources
The server offers four built-in tools, each with a distinct purpose:
#1 Best Overall
search_listingsapplies explicit listing requirements such as city, price, and room count.get_listingreturns one complete property record.search_knowledgesearches text passages drawn from property descriptions and policy documents.hand_off_to_humancreates a ticket for an inquiry that needs a person.
General policy pages are also exposed as MCP resources, so a client can read them directly rather than through a search call.
How a question is routed
The central design decision is that structured requirements and descriptive text are handled by different mechanisms. The author describes this as an implementation choice for this project, not as a proof that the split is best for every property corpus.
| Kind of question | Path in the project | Example from the article |
|---|---|---|
| Explicit listing requirements | Direct filtering of typed catalogue fields via search_listings |
A flat in Hamburg under €2,000 |
| Descriptive or policy text | Hybrid retrieval: BM25 keyword search and local embedding search generate candidates, then a local reranker scores each question-passage pair | Whether heating is included |
| Work requiring a person | Hand-off ticket via hand_off_to_human |
Booking a viewing on Saturday |
Typed filters for hard requirements
When a customer states a limit, such as a maximum price or a city, the system filters the typed fields in the catalogue. This avoids asking a language model to judge whether 1,990 is below 2,000. The benefit is that a numeric requirement is applied the same way every time, and the result can be checked against the record.
Hybrid retrieval for text
Questions about descriptions and policies, such as whether heating is included or whether pets are allowed, are answered from passages. The project uses two candidate searches:
- BM25 keyword search, which matches the words in the question.
- Local embedding search using
multilingual-e5-small, which matches meaning across phrasing.
The candidates are then scored by a local reranker, bge-reranker-v2-m3, which reads each question-passage pair together. The retrieval models run locally through Transformers.js after their initial download. The conversational model is separate from this layer and can be an Anthropic API model or an Amazon Bedrock model.
Walking through the example inquiry
The article’s example asks: “I’m looking for a flat in Hamburg under €2,000. I have a dog. Is heating included, and can I view it on Saturday?” One message contains four different kinds of work. The city and price are explicit requirements for typed filtering. The heating and pet questions are text questions answered through retrieval, with citations pointing to the passage used. The Saturday viewing is a request the system cannot complete itself, so it belongs in the hand-off path. A well-behaved reply therefore combines a filtered result, cited text answers, and a ticket for the viewing, while stating clearly that the viewing has not been booked.
Hand-off tickets are records, not bookings
- Creating a ticket does not send an email to the agency.
- It does not reserve a viewing slot.
- Tickets are held in memory, so they disappear when the process stops.
Anyone building on this design should treat the ticket as a log entry that a person must still act on, and should add a durable store and a delivery step before relying on it operationally.
What the interface exposes
The interface is built to make the agent’s work inspectable. A reply appears with its tool calls, its citations, and any hand-offs. Clicking a citation opens the cited passage or the listing record it came from. This is the main way a reader can check a claim without trusting the model’s wording.
Rank #3
Answer checks and where they stop
Before a reply is returned, the built-in loop applies three checks:
- Every citation marker must match a listing or passage ID returned during the current run.
- Detected prices, areas, and percentages must match values in an allowed tool result or in the customer’s own inquiry.
- Empty replies are rejected.
If a check fails, the model receives one repair opportunity. If the second attempt also fails, the code creates a hand-off ticket and returns a fixed reply.
These checks confirm that a citation or number appeared in an allowed result. They do not confirm that the sentence around it interprets the evidence correctly. The author identifies three specific gaps:
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →- A real number attached to the wrong property can still pass the numeric check.
- Non-numerical claims may lack citations without triggering the numeric guard.
- The built-in checks do not automatically apply when an external assistant calls the
/mcpendpoint directly.
The recorded figures and what they measure
The project’s tests use a 33-question set: 25 answerable and 8 unanswerable questions, all on a small synthetic corpus. The author states that these results are not an independent benchmark, not a final-answer accuracy measure, and not proof that the assistant never invents facts.
Rank #4
| Figure | What was measured | Conditions and source |
|---|---|---|
| 24 of 25 answerable questions | The expected passage appeared among the top five retrieval results | Project-recorded retrieval evaluation, Luka Engels, 28 September 2026 |
| 0 of 8 unanswerable questions | Returned any passage | Same evaluation; abstention test on the same corpus |
| About 1.4 seconds per question | Average latency across the 33-question set | Laptop CPU, same evaluation; not a hardware-independent figure |
| 20 of 25 with headers, 23 of 25 without | Expected passage in the top five vector results | Small recorded experiment in the author’s article; passage-only embeddings performed better, while headers were kept for keyword search and reranking context |
| 0.832 and 0.784 | Embedding similarity for an unanswerable gym question and an answerable German pet question | Example pair from the author’s article; used to explain why a fixed similarity cutoff was unreliable in that experiment |
The one answerable miss is instructive. A German question asking whether a tenant must pay commission did not get its passage into the top five. Neither the keyword search nor the embedding search collected the relevant passage, so the reranker had nothing to rescore. This is a candidate-retrieval failure in this corpus, and the author does not present it as an estimate of performance on real agency inquiries.
Loop limits and default budgets
The agent loop is bounded by default settings described in the author’s 29 September 2026 article. They may change as the implementation evolves.
- Up to 8 model calls per inquiry.
- An 80,000-token budget, checked between model calls.
- A 60-second timeout on each model call.
- A 30-second timeout on each tool call.
Setting up and running the demo
- Prerequisites: Node.js 20 or newer,
corepack, andpnpm, as documented in the author’s article. - Without an API key: the browser demo can fall back to a rule-based demo model.
- Model downloads: the retrieval models may still download on first use unless the hashing embedder is selected.
- Hosted models: the article documents an Anthropic API adapter and an Amazon Bedrock adapter. Current vendor availability and pricing were not verified for this article.
- Default address: the server listens on
127.0.0.1:3000and, according to the article, has no authentication. It should be run locally only. - Storage: the ticket queue and the vector store are in memory. Vector embeddings are cached on disk.
The author characterises the project as a local application with synthetic data, not a complete agency operations system.
What remains unfinished
The author states plainly: “This is still a work in progress: a broader evaluation suite is next, to measure answer correctness and missed hand-offs beyond the existing tests.” The tests that exist cover retrieval on the small corpus, scripted-model tests of failure paths, and browser tests of the visible workflow. A broader evaluation of answer correctness, preserved qualifications, missed hand-offs, and prompt-injection cases is still needed. Persistent storage and continuous integration are listed as planned rather than completed.
Best Value
How to evaluate a similar system
Because the source describes a single project rather than a set of comparable products, the most useful comparison is against the following axes:
- Data path: whether hard requirements go through typed-field filtering or through retrieval over descriptive text.
- Retrieval evaluation: top-k recall for answerable questions, abstention on unanswerable ones, and latency, each stated with its corpus size and device.
- Evidence controls: whether citations and numbers are checked, and whether a sentence’s support in its source is evaluated separately.
- Human escalation: whether a system only creates a ticket, or delivers and tracks the request through a persistent workflow.
- Operational readiness: authentication, persistent storage, a broader evaluation suite, and how external MCP clients are handled.
Primary details are in Luka Engels’s article on the project.
The Bottom Line
The design is worth studying as an engineering pattern: keep hard requirements in typed filters, retrieve text with cited passages, check the evidence the model uses, and send unresolved work to a visible ticket. Its own tests are small and narrow, and they do not show that the answers are correct or that every hand-off is caught. Treat it as a well-instrumented prototype, not a production property-search service.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Fix the driver behind crashes, sound loss and screen glitches3Clear out junk files and repair common Windows errorsQuick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




