
CityTracker provides a free, read-only query interface to New York City's public real-estate and property data — the datasets from NYC and NY State open-data portals, cleaned and joined so they can be searched together.
Coverage spans all five boroughs (Manhattan, Brooklyn, Queens, the Bronx, Staten Island) and includes: Department of Buildings (DOB) construction permits and job filings; DOB and HPD building and housing violations, complaints, litigations, and vacate orders; ACRIS property documents — deeds, mortgages, liens, and the parties on them; tax lots (PLUTO/BBL) with owner, year built, zoning, land use, units, and assessed value; certificates of occupancy; facade compliance filings (FISP / Local Law 11); 311 requests; HPD registrations; property assessments; tax lien sales; and resolved company and representative (owner and contractor) records. It also covers NY State liquor licenses and retail food stores.
https://citytracker.ai/api/mcpCityTracker is a read-only replica of NYC real-estate data: Department of Buildings (DOB) construction filings and permits, ACRIS documents (deeds, mortgages, and their parties), HPD housing violations, tax lots (BBLs), resolved companies and representatives, and zoning. To explore: call to see the tables (with a human label for each documented table), then on a table for its columns plus curated per-column descriptions and entity-level notes. The notes are authoritative domain rules and column semantics VARY per table (e.g. ACRIS party roles depend on doc_type), so read each table's notes before writing a query. The exact tables and columns you can query, with their descriptions, are also published as one JSON document at https://citytracker.ai/api/mcp/schema . Tables that back a REST API asset have a background docs page, whose URL returns as docs_url, but that page describes the REST API, whose rows add JOINED fields (e.g. bbl and bin on facade inspections) that are NOT columns of the table here — take column names from or the schema document, never from the API docs. Use the tool to run a single read-only SELECT.
RECIPE — contractor-license lookup. DCWP Home Improvement Contractor (HIC) 7-digit license numbers are NOT stored anywhere in this schema, so a query keyed on the license number itself cannot resolve. Trying to reach a contractor through a company/contractor FK is also unreliable (see the filing/permit/representative_raw_data notes on raw-id truncation and mislinked FKs). The reliable path is BIN or address: look the building up in bin_building/tax_lot by BIN or BBL, then match filing/permit rows on that same BIN/address rather than joining through the company chain.
KNOWN LIMITATIONS. (1) GC/applicant-person -> job joins via *_representative_id can return zero rows on recent filings/permits even though the person exists — see representative_raw_data notes. (2) *_company_id columns on filing/permit resolve firms via company_raw_data, and that resolution can land on an unrelated party (e.g. an ACRIS mortgage lender/bank) rather than the actual permittee — prefer the resolved person (applicant_representative) or group on the raw applicant_company_name + address over trusting the company FK chain; see the filing/permit notes. (3) data_type does NOT share one vocabulary across tables: filing holds exactly 'NOW' or 'BIS' (enforced, so an exact match is safe there), but certificate_occupancy stores 'now'/'NOW'/'old' (never 'BIS'), and permit stores 'BIS'/'NOW' and leaves it NULL on ~63% of rows. On those two, filter case-insensitively and allow NULL (e.g. lower(data_type) = 'now' OR data_type IS NULL), or omit the filter — WHERE data_type = 'NOW' drops half of certificate_occupancy's DOB NOW rows and 97% of permit rows.
QUERY COST. Every query runs under a 15s statement timeout, so a blind multi-way join across the largest tables (filing ~1.0M, permit ~1.4M, violation_hpd ~3.2M, tax_lot ~0.9M, ACRIS document*) will be cancelled rather than returned. Filter on an indexed key (BIN, BBL, job_number, a bounded date range) before aggregating, and prefer a targeted lookup over a whole-table GROUP BY.
OUT OF SCOPE — data not in this schema, don't chase it: DCWP HIC 7-digit contractor license numbers (not loaded; tracked as dat-19); a unit-level DHCR rent-stabilization registry (no per-apartment stabilization status exists here — the stabilized table is a building-level proxy, one row per rent-stabilized lot joined via stabilized.tax_lot_id -> tax_lot.id, and where absent the roughest available heuristic is tax_lot.year_built < 1974 AND tax_lot.units_res >= 6, presumptive only); and geography — this covers the five NYC boroughs only, no Long Island/Nassau/Westchester data.
ANONYMOUS USAGE LIMITS. Without an access token this endpoint meters per IP address: 25 database tool calls per UTC day, at most 20 per 60s, and at most 2 running at once. initialize, tools/list and the tool are free and never limited, so you can always connect and read this. Exceeding a limit returns a tool error beginning "Rate limit:" that names the limit and when to retry — relay it rather than retrying immediately. Note the quota is per IP, so it is shared by everyone behind the same network address. A free access token removes it entirely: support@citytracker.ai.
None in the store listings or on the server