Releases: paulieb89/property-shared
Release list
v1.12.0 — EPC browse tooling, Rightmove floor area, address matching fixes
What's new
Added
property_epc_search(postcode)— browse all EPC certificates at a postcode as a slim list (address, rating, floor_area, property_type, floor_level, habitable_rooms, inspection_date, lmk_key). Designed for Rightmove listings where the house number is not shown.epc_certificate(lmk_key)— direct EPC certificate lookup by lmk_key, faster than address-based lookup. Available on both MCP servers.RightmoveListingDetail.floor_area_sqm/floor_area_sqft— numeric floor area from the Rightmovesizingsarray. Key discriminator for EPC cross-referencing.
Fixed
address_matching.extract_number— stripsFLAT N,/APARTMENT N,prefixes before extracting building number.address_matching.extract_street— takes 3 words instead of 2, including directional qualifiers (North/South/East/West). Eliminates wrong-street false positives.address_matching.match_epc_address— raises minimum match threshold to 50 when target has no house number.
Full changelog: https://github.com/paulieb89/property-shared/blob/main/CHANGELOG.md
v1.11.0 — MCP primitive refactor, resources, prompts, EPC dual-mode, yield escalation, slim sweep
Summary
Combined release of the MCP primitive cleanup work shipped across PRs #11, #12, #13, #14. The fleet's data layer (`property_core`) gains one user-facing improvement; the rest is MCP-server-layer cleanup that affects `property-shared.fly.dev/mcp` and `propertydata.fly.dev/mcp` consumers directly.
What downstream PyPI consumers get from `property-shared 1.11.0`
The only `property_core` change between 1.10.0 and 1.11.0:
- `calculate_yield()` rental-radius escalation — when no rental listings are found at the requested radius, retry at 1.0mi → 1.5mi → 2.0mi before giving up. Rural postcodes (e.g. DE12 6LL) that previously returned `rental_count: 0` now return useful yields. New `rental_search_radius_miles` field on `YieldAnalysis` surfaces which radius produced the data.
Downstream consumers (`uk-property-mcp`, `property-descriptions-mcp`) can bump their `property-shared` dep to `>=1.11.0` to inherit this.
What MCP-server consumers get (live on Fly)
These are MCP-layer changes already deployed manually to property-shared.fly.dev and propertydata.fly.dev:
Breaking
- Removed `property_report` MCP tool from both servers; removed `get_property_data` from MCP App. Replaced by a `full_property_analysis` MCP prompt on both servers that instructs the LLM to call the underlying primitive tools explicitly and synthesise.
- Removed `component_test` and `image_test` dev utilities from MCP App.
Added — MCP Prompts
- `full_property_analysis` (single-property assessment workflow)
- `area_comparison` (multi-postcode comparison)
- `investment_analysis` (buy-to-let evaluation)
Added — MCP Resources (canonical reference data, queryable not computed)
- `councils://list` — 99-council planning portal registry
- `council://{code}` — single-council profile by code/slug
- `sdlt-bands://current` — April 2025 SDLT band schedule
- `epc-ratings://reference` — A-G EPC band definitions and SAP score ranges
Fixed
- `property_epc` plain MCP tool now has dual-mode: with address returns the matched cert, without address returns an aggregate summary instead of an arbitrary first row.
- `_slim` + `exclude_none=True` applied across all plain MCP tools that returned Pydantic models with optional fields. ~40-50% token-cost reduction on tools that return PPDTransaction lists (`property_comps`, `ppd_transactions`, `property_blocks`).
Files of note
- `property_core/yield_service.py` — the one `property_core` change
- `property_core/models/report.py` — `rental_search_radius_miles` field added
- `app/mcp/server.py` — MCP-layer changes (slim, prompts, resources, EPC dual-mode)
- `property_app/` — MCP App equivalents
- `CHANGELOG.md` — full breakdown
🤖 Generated with Claude Code
v1.10.0 — comps data parity with prop MCP
Breaking default changes — PPDService.comps() data parity with the prop MCP server
PPDService.comps() previously returned a raw pass-through of Land Registry data, including commercial properties, bulk-transfer deals (transaction_category='B'), and price outliers. This caused divergence with the production prop MCP server. This release brings the library in line.
Breaking defaults
transaction_categorydefaults to"A"(standard residential sales). PassNonefor all categories.property_type=Nonenow means residential set (F+D+S+T). Pass"F"/"D"/"S"/"T"/"O"for one type. Pass"ALL"for the firehose.- New
filter_outliersparam (defaultFalse; opt in for IQR-trimmed stats and transactions list). - REST
/v1/ppd/compsnow defaultsauto_escalate=true.
Coverage
All consumer interfaces (REST API, plain MCP server, propertydata MCP app, CLI) expose the new params with the new defaults. block_service.analyze_blocks() explicitly opts out to preserve bulk-transfer detection.
Concrete example (NG1 2NS, 24mo)
- Before: 23 transactions returned (incl. bulk transfers + commercial), median £235k, mean £447k
- After (default): 3 clean residential category-A sales, median £180k, mean £218k
- Firehose escape hatch (`property_type="ALL", transaction_category=null`): identical to pre-fix output
See the full CHANGELOG for details.
🤖 Generated with Claude Code
v1.9.0
What's Changed
- feat: multimodal image support for rightmove_listing by @paulieb89 in #7
Full Changelog: v1.8.1...v1.9.0
v1.8.1
v1.8.0
What's Changed
- fix: restore plain MCP at /mcp, fix propertydata server-card version by @paulieb89 in #5
- Add HTTP metrics middleware and Prometheus metrics for request counts and durations by @paulieb89 in #4
- feat: plain MCP server at /mcp, fix Rightmove scraping by @paulieb89 in #6
New Contributors
- @paulieb89 made their first contribution in #5
Full Changelog: v1.7.4...v1.8.0