The address-to-BBL step is what makes the rest work, and the README says to call it first for that reason — a lookup on the wrong lot returns clean records for a building you are not buying. `analyze_property` is the one to reach for when you are screening rather than investigating, since it fans out the sub-queries concurrently instead of costing you a dozen round trips. Two limits worth knowing before you rely on it: rent stabilization data stops at 2017, and the tool reports records only — no valuation, no demographics, no tenant screening.
An MCP server over 20+ New York City public record datasets, loaded into PostgreSQL from nycdb so queries run against a local database rather than a rate-limited open-data API. It answers property questions the way a buyer's checklist does — what is wrong with the building, who owns it, what it sold for, what is owed on it. It is explicitly a due-diligence tool, not an appraisal tool: it surfaces records and does not estimate value.
- Any address or BBL resolved to a full property profile — owner, building class, zoning, FAR, assessed value, lot dimensions — the call the others build on — `lookup_property`
- The distress record: HPD housing violations by class, DOB building code violations and ECB/OATH penalties, filterable by severity, status and date — `get_property_issues`
- Earlier warning signs than formal violations: tenant-reported HPD complaints and DOB complaints filed before anything was issued — `get_hpd_complaints`, `get_dob_complaints`
- Housing court cases, open judgements and harassment findings against the owner, plus the registered owner, managing agent and head officer — `get_hpd_litigations`, `get_hpd_registration`
- Sales and deed transfers with prices, buyer and seller names and document types back to 2003 — `get_property_history`
- What is owed and against what: tax lien sale entries, ACRIS mortgages with lender names and amounts, and assessments, market value, taxable value and active exemptions such as 421a, J-51 and STAR — `get_liens_and_encumbrances`, `get_tax_info`
- DOB job filings — new buildings, alterations, demolitions, sign permits — with status, cost estimate and applicant — `get_building_permits`
- Rent-stabilized unit counts by year from 2007 to 2017, which is where a deregulation trend shows up — `get_rent_stabilization`
- Comparable sales by zip code with quarterly market statistics, and area-level aggregates covering stock, median prices, violation rates and stabilization share — `search_comps`, `search_neighborhood_stats`
- Incident history around the building: FDNY fire and emergency incidents from 2013, 311 service requests from 2010, marshal-executed evictions from 2017, and NYPD crime complaints within a radius that defaults to 300 m — `get_fdny_fire_incidents`, `get_311_complaints`, `get_evictions`, `get_nypd_crime`
- The whole checklist run at once: profile, FAR analysis, financials, risk factors, stabilization, comps and observations, with the sub-queries executed concurrently — `analyze_property`
Hosted, with a token: sign up on the project's site for a trial key — 10 queries a day for 30 days, including up to 5 full due-diligence reports — and point a client at the HTTP endpoint with an `Authorization: Bearer` header. There is also a web chat with 3 free queries and no signup, if you only want to see what it returns. Self-hosting is a real undertaking: Python 3.12+, `uv`, PostgreSQL 16+ and the `nycdb` CLI, with `DATABASE_URL` set — the data is roughly 19 million rows, restored from a dump in about 10 minutes or loaded from source over about 2.5 hours. `NYC_GEOCLIENT_SUBSCRIPTION_KEY` improves address resolution and `SOCRATA_APP_TOKEN` raises rate limits on the 311, FDNY and NYPD fallbacks; both are optional. The package is `nyc-property-intel` (0.1.1 in pyproject).
One command plus a key — claude mcp add --transport http nyc-property-intel \ "https://nyc-property-intel-production.up.railway.app/mcp" \ --header "Authorization: Bearer YOUR_TOKEN" \ --scope user, then supply credentials
