mcpbeat

Nyc Property Report

alpacalabsllc/nyc-property-report

Compile NYC landmarks, DOB, ACRIS, HPD, and BSA findings into one property due-diligence report. Use for a full report; use individual NYC skills for one dataset.

6k tokens
context cost
the whole folder, loaded on every use
4
files
instructions only
0
copies elsewhere
how many repositories repackaged it
302
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/AlpacaLabsLLC/skills-for-architects --skill nyc-property-report

What comes with it

14 232 bytes besides the instruction
README.md
pluto-resolution.md
socrata-reference.md

What it tells the agent to use

found in the instruction text
WebFetch fetches pages from the network

The instruction itself

16 sections, as written by the author

/as:nyc-property-report — Combined NYC Property Report

Runs all 6 NYC property data lookups and produces a combined report. For individual lookups, use the standalone skills:

  • /as:nyc-landmarks — LPC landmark & historic district check
  • /as:nyc-dob-permits — DOB permit & filing history
  • /as:nyc-dob-violations — DOB & ECB violations
  • /as:nyc-acris — ACRIS property transaction records
  • /as:nyc-hpd — HPD violations, complaints & registration
  • /as:nyc-bsa — BSA variances & special permits

No API key required — all queries use NYC Open Data (Socrata) with PLUTO for address resolution.

Project context

If PROJECT.md exists in the working directory, read it before fetching — prior lookups may already be on file. After completing, offer identity facts (address, BBL, ownership), landmark status, and the open-violations summary to /as:project update for its Identity and Zoning sections, each with a source and date. No PROJECT.md? Skip silently — or mention /as:project init if the user is clearly starting a project.

Usage

/as:nyc-property-report 120 Broadway, Manhattan
/as:nyc-property-report 1000770001          (BBL)
/as:nyc-property-report 1001389             (BIN)

Steps 1–2: Parse Input & Resolve BBL/BIN

Read pluto-resolution.md (in this skill's directory) and follow it: parse the input (address, BBL, or BIN), resolve via PLUTO, and resolve BIN via Building Footprints.

This skill's extras: in addition to the base PLUTO field set, store zipcode, cd, bldgarea, unitstotal, histdist, numbldgs.

Step 3: Query All 6 Domains

Query each domain in sequence. If any query fails, note the error and continue with the next domain.

Read socrata-reference.md (in this skill's directory) — it is the single source of truth for every dataset ID and field name below. If a query here ever disagrees with it, the reference wins.

Domain 1: Landmarks

By BBL: https://data.cityofnewyork.us/resource/buis-pvji.json?bbl={BBL}

Fallback by block + lot (NOT zero-padded): https://data.cityofnewyork.us/resource/buis-pvji.json?$where=block='{BLOCK}' AND lot='{LOT}' AND borough='{BOROUGH}'

Also check PLUTO histdist field — if set, property is in a historic district.

Key fields: lpc_name, lpc_lpnumb, desdate, landmarkty, lpc_sitede, lpc_sitest, lpc_altern, address, url_report

Domain 2: DOB Permits

IMPORTANT: Legacy datasets use bin__ (double underscore). DOB NOW uses bin.

Legacy permits: https://data.cityofnewyork.us/resource/ipu4-2q9a.json?$where=bin__='{BIN}'&$order=issuance_date DESC&$limit=30

Legacy filings: https://data.cityofnewyork.us/resource/ic3t-wcy2.json?$where=bin__='{BIN}'&$order=latest_action_date DESC&$limit=30

DOB NOW permits: https://data.cityofnewyork.us/resource/rbx6-tga4.json?$where=bin='{BIN}'&$order=approved_date DESC&$limit=30

DOB NOW filings: https://data.cityofnewyork.us/resource/w9ak-ipjd.json?$where=bin='{BIN}'&$order=filing_date DESC&$limit=30

Merge, sort by date DESC, group by job type (NB, A1, A2, A3, DM, Other).

Domain 3: DOB Violations

DOB violations: https://data.cityofnewyork.us/resource/3h2n-5cm9.json?$where=bin='{BIN}'&$order=issue_date DESC&$limit=50

ECB violations: https://data.cityofnewyork.us/resource/6bgk-3dad.json?$where=bin='{BIN}'&$order=issue_date DESC&$limit=50

Active violations: https://data.cityofnewyork.us/resource/sjhj-bc8q.json?$where=bin='{BIN}'

Flag open violations with ⚠. Show ECB penalties.

Domain 4: ACRIS

Requires BBL (not BIN). Uses separate borough/block/lot fields.

Step A — Legals: https://data.cityofnewyork.us/resource/8h5j-fqxa.json?borough={boro}&block={block}&lot={lot}&$order=good_through_date DESC&$limit=20

Step B — Master: https://data.cityofnewyork.us/resource/bnx9-e6tj.json?$where=document_id IN ('{id1}','{id2}',...)&$order=document_date DESC (fields: document_date, document_amt, recorded_datetime)

Step C — Parties: https://data.cityofnewyork.us/resource/636b-3b5g.json?$where=document_id IN ('{id1}','{id2}',...)

Step D — Doc codes: https://data.cityofnewyork.us/resource/7isb-wh4c.json?$limit=200

Join by document_id. Party type 1=Grantor, 2=Grantee. Group by doc type (Deeds, Mortgages, Other).

Domain 5: HPD

First check bldgclass — HPD only applies to residential (classes starting with A, B, C, D, R, S). If non-residential, skip with note.

Uses boroid (not borough) and separate block/lot fields.

Violations: https://data.cityofnewyork.us/resource/wvxf-dwi5.json?$where=boroid='{boro}' AND block='{block}' AND lot='{lot}'&$order=inspectiondate DESC&$limit=50

Open violations: https://data.cityofnewyork.us/resource/csn4-vhvf.json?$where=boroid='{boro}' AND block='{block}' AND lot='{lot}'

Complaints (uses borough as TEXT — "MANHATTAN", "BROOKLYN", … — not boroid): https://data.cityofnewyork.us/resource/ygpa-z7cr.json?$where=borough='{BOROUGH_NAME}' AND block='{block}' AND lot='{lot}'&$order=received_date DESC&$limit=30

Registrations: https://data.cityofnewyork.us/resource/tesw-yqqr.json?$where=boroid='{boro}' AND block='{block}' AND lot='{lot}'

Registration contacts (owner names — registrations dataset has none): https://data.cityofnewyork.us/resource/feu5-w2e2.json?$where=registrationid='{registrationid}'

Flag Class C violations with ⚠ (immediately hazardous).

Domain 6: BSA

By BBL: https://data.cityofnewyork.us/resource/yvxd-uipr.json?$where=bbl='{BBL}'&$order=date DESC

Address fallback: https://data.cityofnewyork.us/resource/yvxd-uipr.json?$where=upper(street_name) LIKE '%{STREET}%' AND borough='{BOROUGH}'&$order=date DESC

Step 4: Write Report

Write to working directory as property-{address-slug}.md.

# NYC Property Report — {Address}

**Generated:** {date}
**BBL:** {bbl} | **BIN:** {bin}
**Source:** NYC Open Data (Socrata)

---

## 1. Property Identification

| Field | Value |
|-------|-------|
| BBL | {bbl} |
| BIN | {bin} |
| Borough | {borough} |
| Block | {block} |
| Lot | {lot} |
| ZIP | {zip} |
| Community District | {cd} |
| Building Class | {bldgclass} |
| Zoning | {zonedist1} |
| Year Built | {yearbuilt} |
| Floors | {numfloors} |
| Lot Area | {lotarea} SF |
| Building Area | {bldgarea} SF |
| Owner | {ownername} |
| Coordinates | {lat}, {lon} |

---

## 2. Landmark Status
{LANDMARKED / IN HISTORIC DISTRICT / NOT DESIGNATED}
{If landmarked: LP number, name, date, district, architect, style}
{Implications note if designated}

---

## 3. DOB Permits & Filings
**Total found:** {count} ({x} legacy, {y} DOB NOW)
{Tables grouped by NB, A1, A2/A3, DM, Other}

---

## 4. DOB Violations
### ⚠ Open Violations: {count}
{Open violations table}
### All DOB Violations
{Table}
### ECB Violations
{Table with penalties}
**Total penalties assessed:** ${amount}

---

## 5. Property Records (ACRIS)
### Deeds (Ownership)
{Table — current owner from most recent deed}
### Mortgages
{Table}
### Other Documents
{Table}

---

## 6. HPD — Housing Preservation & Development
{If non-residential: "Building class {X} — HPD records not applicable."}
{If residential: Registration, open violations by class, complaints}

---

## 7. BSA — Board of Standards and Appeals
{Applications table or "No BSA applications found (records from 1998-present)."}

---

*Generated by /as:nyc-property-report — NYC Open Data*
*Data currency varies by dataset. Verify critical findings with source agencies.*

Step 5: Summary

After writing the file, print a brief inline summary:

Property report written: property-120-broadway.md

Key findings:
- Landmark: Not designated
- DOB Permits: 47 found (3 active filings)
- Open Violations: 2 (1 ECB with $25,000 penalty)
- Owner: {name} (per ACRIS deed YYYY-MM-DD)
- HPD: N/A (commercial building)
- BSA: 1 approved variance (2004)

Run /as:zoning-analysis-nyc for zoning envelope data.

Conventions

  • All dates: YYYY-MM-DD
  • Dollar amounts: comma-separated
  • Open/active items flagged with ⚠
  • If a domain returns no results, say so explicitly (don't omit the section)
  • If a domain query fails (network error, rate limit), note the error and continue
  • Always include the "Data currency varies" caveat

Edge Cases

  • Rate limited (HTTP 429): Wait 5 seconds, retry once. If still 429, note error and suggest setting NYC_SOCRATA_TOKEN.
  • ACRIS with many documents: Limit to 20 most recent. Note if truncated.
  • Condo lots: ACRIS keys on individual unit lots. Note to search parent condo lot too.
  • Pre-1989 buildings: Pre-BIS DOB records not digitized. Note if few permits for old building.
  • Multiple BINs: If PLUTO shows numbldgs > 1, note that lot has multiple buildings.
  • No results from any API: State clearly per section. Don't fail the whole report.

Final Step: Disclaimer + Marker (required)

This skill produces regulatory output. End every report this skill produces — printed in chat or saved to a file — with the canonical disclaimer block from rules/professional-disclaimer.md, followed by one blank line and the machine-readable marker, exactly as shown:

> **Disclaimer:** This is an AI-generated analysis for preliminary planning purposes. All findings must be verified by a licensed professional before use in design, permitting, or regulatory submissions.

<!-- architecture-studio:requires-disclaimer -->

The marker is a single end-of-file sentinel — it appears exactly once, as the last line of the report. The post-write-disclaimer-check hook parses saved .md reports for the marker and blocks the write if the canonical disclaimer block is missing.

How to use it

Copy the folder

Take alpacalabsllc/nyc-property-report from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.