nyc-property-intel
The NYC Property Intel server provides access to 20+ public record datasets for real estate due diligence on any NYC property. Key capabilities include:
Property Lookup: Resolve any address or BBL to a full profile — owner, building class, zoning, FAR, assessed value, and lot dimensions.
Violations & Complaints: Access HPD housing violations (Class A/B/C), DOB code violations, ECB/OATH penalties, HPD tenant complaints, and DOB complaints as early distress signals.
Sales & Ownership History: Track DOF sales records and ACRIS deed transfers (back to 2003) showing price trajectory, buyer/seller names, and document types.
Tax & Financials: Retrieve assessed/market values, tax class, taxable value, and active exemptions (421a, J-51, STAR).
Liens & Encumbrances: View DOF tax lien entries and ACRIS mortgage records including lender names, amounts, and satisfactions.
Building Permits: Review DOB job filings for new buildings, alterations, demolitions, and permits with status and cost estimates.
Rent Stabilization: Check rent-stabilized unit counts (2007–2017) to track deregulation trends.
HPD Registration & Litigation: Look up legal owner, managing agent, and head officer; identify housing court cases, open judgments, and harassment findings.
Comparable Sales & Neighborhood Stats: Find comps by zip code, building class, size, and time period; get area-level aggregates on median prices, violation rates, and rent stabilization share.
FDNY Fire Incidents: Access fire and emergency history (2013–present) including alarm level, spread, casualties, and duration.
311 Complaints: Query 311 service requests (2010–present) covering 200+ types like noise, rodents, and heat.
Evictions: Retrieve marshal-executed eviction records (2017–present) for residential and commercial properties.
NYPD Crime Data: Query crime complaints within a configurable radius with felony/misdemeanor breakdown and year-over-year trends.
Full Due Diligence Report: Run a single comprehensive analysis that concurrently queries all data sources to produce a complete property risk and investment profile.
NYC Property Intel
MCP server that gives Claude AI access to 20+ NYC public record datasets for real estate due diligence. Ask Claude about any NYC property in plain English — violations, liens, sales history, ownership, permits, rent stabilization, zoning, fire history, crime data, and more.
This is a due diligence tool, not an appraisal tool. It surfaces public record data only; it does not estimate property values.
Quickstart — Web Chat (no setup)
The fastest way to try it: open nycpropertyintel.com/chat and ask about any NYC property in plain English. 3 free queries, no signup — no install, no token, and no Claude client needed.
"What violations does 123 Atlantic Ave, Brooklyn have?"Free guides & lookups
NYC Property Due Diligence Checklist — the complete pre-offer checklist across 20+ city data sources
NYC HPD Violations Lookup — Class A/B/C breakdown by address
NYC DOB & ECB Violations Lookup — open violations, ECB penalties, Local Law 153 lien risk
NYC Property Owner Lookup — the owner and HPD contacts behind an LLC
NYC Eviction History by Address — City Marshal executed evictions, 2017–present
Check If You Have an Eviction on Your Record (NYC) — tenant-facing guide to court records, screening files, and your rights
Related MCP server: NYC Property Data MCP Server
Quickstart — Claude Code / Desktop (hosted MCP)
Sign up at nycpropertyintel.com to get a free trial token (10 queries/day for 30 days, including up to 5 full due-diligence reports). Then:
Claude Code — run once in your terminal:
claude mcp add --transport http nyc-property-intel \
"https://nyc-property-intel-production.up.railway.app/mcp" \
--header "Authorization: Bearer YOUR_TOKEN" \
--scope userClaude Desktop — add to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"nyc-property-intel": {
"type": "http",
"url": "https://nyc-property-intel-production.up.railway.app/mcp",
"headers": {
"Authorization": "Bearer YOUR_TOKEN"
}
}
}
}Then ask Claude:
"Look up 350 5th Ave, Manhattan"
"What violations does 123 Atlantic Ave, Brooklyn have?"
"Full due diligence on 123 Atlantic Ave, Brooklyn"Self-Hosting
Prerequisites
1. Clone and install
git clone https://github.com/ccedacero/nyc-property-intel.git
cd nyc-property-intel
uv sync2. Configure environment
cp .env.example .env
# Edit .env:
# DATABASE_URL=postgresql://nycdb:nycdb@localhost:5432/nycdb
# NYC_GEOCLIENT_SUBSCRIPTION_KEY=your_key (optional, improves address resolution)
# SOCRATA_APP_TOKEN=your_token (optional, higher rate limits for 311/FDNY/NYPD)3. Set up the database
Option A: Restore from dump (~10 min)
createuser -s nycdb 2>/dev/null; createdb -O nycdb nycdb 2>/dev/null
pg_restore -U nycdb -d nycdb --no-owner --jobs=4 data/nycdb.dumpOption B: Load from source (~2.5 hours)
createuser -s nycdb 2>/dev/null; createdb -O nycdb nycdb 2>/dev/null
chmod +x scripts/seed_nycdb.sh
./scripts/seed_nycdb.sh # all phases
# or incrementally:
./scripts/seed_nycdb.sh --phase A # core data (~30 min)
./scripts/seed_nycdb.sh --phase B # sales + DOB (~45 min)
./scripts/seed_nycdb.sh --phase C # ACRIS + permits (~90 min)Then create indexes and materialized views:
psql -U nycdb -d nycdb -f scripts/create_indexes.sql
psql -U nycdb -d nycdb -f scripts/create_views.sql4. Add to Claude Desktop
{
"mcpServers": {
"nyc-property-intel": {
"command": "uv",
"args": ["run", "nyc-property-intel"],
"cwd": "/absolute/path/to/nyc-property-intel",
"env": {
"DATABASE_URL": "postgresql://nycdb:nycdb@localhost:5432/nycdb"
}
}
}
}5. Add to Claude Code
The .mcp.json in the project root auto-registers when you open this directory. Or add manually to ~/.claude.json:
{
"mcpServers": {
"nyc-property-intel": {
"command": "uv",
"args": ["run", "nyc-property-intel"],
"cwd": "/absolute/path/to/nyc-property-intel"
}
}
}18 Tools
Tool | Description |
| Resolve any NYC address or BBL to a full property profile: owner, building class, zoning, FAR, assessed value, lot dimensions. Always call this first. |
| HPD housing violations (Class A/B/C), DOB building code violations, and ECB/OATH monetary penalties. Filter by severity, status, and date. |
| DOF sales records and ACRIS deed transfers. Price trajectory, buyer/seller names, document types going back to 2003. |
| Tenant-reported HPD complaints — leading indicators of building distress before formal violations are issued. |
| HPD housing court cases, open judgements, and harassment findings against building owners. |
| Legal owner, managing agent, and head officer registration records. |
| DOB job filings: new buildings, alterations, demolitions, sign permits. Status, cost estimate, applicant name. |
| DOF tax lien sale list entries and ACRIS mortgage records. Outstanding liens, lender names, amounts, satisfactions. |
| Tax assessments, market value estimates, taxable value, and active exemptions (421a, J-51, STAR). |
| Rent-stabilized unit counts by year (2007–2017). Trend analysis for deregulation signal. |
| Comparable sales by zip code. Filter by building class, price, date. Includes quarterly market stats. |
| Area-level aggregates: property stock, median sale prices, violation rates, rent stabilization share. |
| FDNY fire and emergency incident history. Fire type, alarm level, spread, casualties, duration. 2013–present, loaded from NYC Open Data. |
| 311 service requests at or near a property. Noise, rodents, heat, illegal dumping, and 200+ types. 2010–present, loaded from NYC Open Data. |
| Marshal-executed evictions by address. Residential and commercial. 2017–present, loaded from NYC Open Data. |
| DOB complaints filed before formal violations — the earliest public signal of construction or safety issues. |
| NYPD crime complaints within a configurable radius (default 300 m ≈ 3 blocks). Felony/misdemeanor breakdown, top offenses, year-over-year trend. |
| Full due diligence summary — runs all sub-queries concurrently. Property profile, FAR analysis, financials, risk factors, rent stabilization, comparable sales, and key observations. |
Data Sources
Core data (~19 million rows) is loaded from nycdb. All datasets are loaded into PostgreSQL. Socrata API used as fallback only.
Dataset | Agency | Notes |
PLUTO | DCP | Property profiles, zoning, FAR, building class |
PAD | DCP | Address-to-BBL resolution |
HPD Violations | HPD | Housing code violations by class and status |
HPD Complaints | HPD | Tenant complaint records |
HPD Registrations | HPD | Owner/agent/officer registration |
HPD Litigations | HPD | Housing court cases |
DOB Violations | DOB | Building code violations |
ECB Violations | OATH/ECB | Environmental Control Board penalties |
DOF Rolling Sales | DOF | Recent property sales |
DOF Annual Sales | DOF | Historical sales 2003–present |
DOF Assessments | DOF | Tax valuations and assessment rolls |
DOF Exemptions | DOF | Tax exemption records (421a, J-51, STAR) |
DOF Tax Liens | DOF | Annual lien sale list |
Rent Stabilization | DOF | Stabilized unit counts by building, 2007–2017 (derived from DOF tax bills via taxbills.nyc / JustFix) |
ACRIS | DOF | Deeds, mortgages, liens, satisfactions, UCC filings |
FDNY Fire Incidents | FDNY | 2013–present |
311 Service Requests | 311/DOITT | 2010–present |
Marshal Evictions | DOI | 2017–present |
DOB Complaints | DOB | Loaded from NYC Open Data |
NYPD Crime Data | NYPD | 2006–present, geospatial radius |
Architecture
src/nyc_property_intel/
app.py # FastMCP instance + system prompt
server.py # Entry point: lifespan, auth middleware, tool registration
config.py # pydantic-settings (reads .env / environment variables)
db.py # asyncpg connection pool + query helpers
auth.py # Token validation, rate limiting, usage logging
analytics.py # PostHog event capture (fire-and-forget)
geoclient.py # NYC GeoClient API + PAD fallback for address resolution
socrata.py # Socrata Open Data API client — fallback for FDNY, 311, NYPD, evictions
loops_webhook.py # Loops.so webhook → auto-provision trial tokens on signup
tools/
lookup.py # lookup_property
issues.py # get_property_issues
history.py # get_property_history
hpd_complaints.py # get_hpd_complaints
hpd_litigations.py# get_hpd_litigations
hpd_registration.py# get_hpd_registration
permits.py # get_building_permits
liens.py # get_liens_and_encumbrances
tax.py # get_tax_info
rentstab.py # get_rent_stabilization
comps.py # search_comps
neighborhood.py # search_neighborhood_stats
fdny.py # get_fdny_fire_incidents
complaints_311.py # get_311_complaints
evictions.py # get_evictions
dob_complaints.py # get_dob_complaints
nypd_crime.py # get_nypd_crime
analysis.py # analyze_property
scripts/
seed_nycdb.sh # Downloads and loads all nycdb datasets
create_indexes.sql # Performance indexes on critical columns
create_views.sql # Materialized views for fast property lookup
manage_tokens.py # CLI for provisioning and managing customer tokensDevelopment
uv run pytest tests/test_utils.py -q # unit tests (no DB needed)
uv run pytest tests/ -m integration -q # integration tests (needs live DB)
uv run ruff check src/ # lint
uv run nyc-property-intel # run server locally (stdio)Fair Housing
NYC Property Intel provides building and property data from public city records only. It does not provide demographic data, tenant screening, or any analysis based on protected characteristics. See nycpropertyintel.com/#fair-housing for the full policy.
License
MIT
Available Tools
18 toolsanalyze_propertyAInspect
Generate a comprehensive due diligence summary for a NYC property.
Combines data from 14 sources concurrently: property profile, HPD/DOB
violations, HPD complaints, HPD litigations, HPD registration, evictions,
building permits, 311 complaints, sales history, tax assessment, tax liens,
ACRIS mortgages, rent stabilization, and comparable sales. Use this when
the user wants a complete picture of a property for investment analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses concurrent data combining from 14 sources, but does not mention read-only behavior, authentication requirements, or potential rate limits. This is a moderate disclosure for a read-heavy aggregate tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant information. The first sentence front-loads the core purpose, and the second sentence provides usage guidance, making it highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of aggregating 14 sources and only one parameter, the description adequately captures the tool's purpose and when to use it. However, it lacks details about output format, processing time, or any constraints, which would be beneficial for a comprehensive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'bbl' has no description in the schema (0% coverage) and the tool description provides no additional meaning. The abbreviation is domain-specific but not explained, leaving the agent to infer its format and purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a comprehensive due diligence summary for a NYC property, listing 14 data sources. It distinguishes itself from sibling tools which are individual source-specific tools, making its aggregate purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises using this tool for a complete picture for investment analysis. While it doesn't specify when not to use it, the sibling context implicitly guides agents to use individual tools for single-source needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_311_complaintsAInspect
Get 311 service request complaints filed at or near a property address.
Queries the local 311 database (NYC Open Data). Covers noise, rodents,
illegal dumping, graffiti, heat/hot water, illegal parking, street
conditions, and ~200 other complaint types.
311 data is a leading-indicator for neighborhood quality and building
distress — complaints are filed *before* violations are issued. High
complaint volume at an address is a red flag for active tenant issues.
Provide either `address` OR `bbl` (not both).
Args:
address: Street address, e.g. "37-06 80th Street, Queens".
bbl: 10-digit NYC BBL. Resolved to street address via PAD table.
complaint_type: Filter by complaint type keyword, e.g. "NOISE",
"RODENT", "HEAT", "ILLEGAL PARKING". Case-insensitive.
since_year: Return only complaints from this year onward (2010–present).
status: Filter by status: "Open" or "Closed".
limit: Max complaints to return (1–100, default 30).
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| bbl | No | ||
| complaint_type | No | ||
| since_year | No | ||
| status | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains that complaints are filed before violations, high volume is a red flag, and includes default limit and case-insensitive filtering. It does not mention pagination or rate limits but provides sufficient behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear header, explanatory paragraph, and a bullet-like parameter list. It is concise with no redundant information, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (not shown), the description covers the tool's purpose, parameters, and the nature of 311 data. For a tool with 6 parameters, it provides sufficient context for correct usage without relying on the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It thoroughly explains all six parameters: address, bbl, complaint_type, since_year, status, and limit, including constraints and examples. This adds significant value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves 311 service request complaints at or near a property address, specifies the data source (NYC Open Data), and lists complaint categories. It distinguishes from siblings like get_hpd_complaints or get_dob_complaints by focusing on 311 data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on using either address or bbl, includes examples of complaint types and parameters, and explains the significance of 311 data as a leading indicator. However, it lacks explicit alternatives or when-not-to-use scenarios compared to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_building_permitsAInspect
Get DOB building permit filings and job applications for a property.
Shows new building, alteration, and demolition applications with costs, status, proposed changes (stories, units, height), and applicant info. Use this to understand planned or completed construction activity.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes | ||
| job_type | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description lacks annotations, so it must bear the full burden of behavioral disclosure. It describes the data returned (costs, status, etc.) but does not disclose any operational behavior such as read-only property, authentication needs, rate limits, or data freshness. This is insufficient for a read tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of three sentences with no redundancy. The first sentence states the action, the second details what is shown, and the third provides usage context. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main purpose and typical use, and an output schema exists to document return values. However, it lacks explanations for parameters (especially 'job_type' and 'limit') and does not mention any pagination or constraints. It is minimally adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage and 3 parameters, the description should provide meaningful explanations beyond the schema. It implies 'bbl' is a property identifier but does not describe 'job_type' or 'limit' (e.g., valid values, effect on results). This leaves significant gaps for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get DOB building permit filings and job applications for a property,' specifying the action (Get) and resource (building permits). It distinguishes from sibling tools by focusing on construction permits, which is distinct from complaints or other property data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises 'Use this to understand planned or completed construction activity,' providing clear context for when to use the tool. However, it does not explicitly mention alternatives or when not to use it, missing some guidance compared to tools that name sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dob_complaintsAInspect
Get DOB complaints filed against a property with the Dept of Buildings.
Queries the DOB Complaints Received dataset (NYC Open Data `eabe-havv`).
Complaints are filed *before* formal violations are issued — they trigger
DOB inspections and are the earliest public signal of construction, safety,
or code issues at a building.
Key insight: compare this with `get_property_issues` violations. If a
property has many complaints but few violations, DOB may not be inspecting.
If complaints are recent and unresolved, it flags active safety concerns.
Common complaint categories: illegal construction (01), elevator (02),
plumbing (03), illegal conversion (04), boiler (05), structural (06),
facade (07), fire egress (09), work without permit (10), electrical (11).
Provide either `address` OR `bbl` (not both).
Args:
address: Street address, e.g. "350 5th Ave, Manhattan".
bbl: 10-digit NYC BBL. Resolved via BIN lookup for accurate matching.
category: Filter by complaint category code, e.g. "01" for
construction without permit, "04" for illegal conversion.
status: Filter by status keyword, e.g. "OPEN", "CLOSED",
"REFERRED TO DA".
since_year: Return only complaints from this year onward.
limit: Max complaints to return (1–100, default 25).
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| bbl | No | ||
| category | No | ||
| status | No | ||
| since_year | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It mentions the data source and that complaints precede violations, but does not disclose any side effects, rate limits, or authentication needs. However, as a read-only query, the lack of behavioral notes is acceptable but not exemplary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections, parameter list, and contextual insights. Every sentence adds value without redundancy. Appropriate length given tool complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all necessary aspects: dataset origin, usage context, parameter details, interpretation guidance, and connection to sibling tools. With an output schema present, return values are implicitly covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description adds comprehensive meaning: explains address/BBL relationship, lists common category codes with examples, specifies status keywords, bounds for limit, and since_year semantics. This far exceeds what the raw schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get DOB complaints filed against a property with the Dept of Buildings', specifies the dataset (NYC Open Data eabe-havv), and contrasts with sibling `get_property_issues`, distinguishing when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises when to use this tool vs `get_property_issues`, provides interpretation guidance (complaints vs violations), and specifies to provide either address or BBL, with no duplication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_evictionsAInspect
Get marshal eviction execution records for a property address.
Returns evictions that were *executed* (marshal removed tenant), not just
filed. Covers residential and commercial evictions citywide from 2017.
BBL queries use a local indexed database for fast, exact lookups.
Address queries use the Socrata API for full 126K-row dataset coverage.
Use this to assess tenant instability and cash-flow risk. Many executed
evictions at a building may indicate distressed management, problematic
tenants, or an owner pushing out rent-stabilized tenants.
Provide either `address` OR `bbl` (not both).
Args:
address: Street address, e.g. "123 Main St, Brooklyn".
bbl: 10-digit NYC BBL. Queried directly via BBL index.
eviction_type: Filter by type: "Residential" or "Commercial".
since_year: Return only evictions from this year onward (2017–present).
limit: Max records to return (1–100, default 25).
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| bbl | No | ||
| eviction_type | No | ||
| since_year | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that it returns executed evictions (not filed), covers since 2017, and distinguishes query performance (local DB vs Socrata API). It does not mention rate limits, authentication, or error handling, but for a read operation this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: first sentence states the purpose, then expands with details, usage guidance, and an Args section. Every sentence adds value, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no annotations and 5 parameters, the description covers purpose, use cases, parameter details, data sources, and mutual exclusivity. The presence of an output schema (noted in context) handles return values, so the description is complete for an agent to use this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains each parameter in detail (address, bbl, eviction_type, since_year, limit) including defaults, mutual exclusivity, and year range. It adds value beyond the schema's property names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb+resource ('Get marshal eviction execution records for a property address') and clearly distinguishes this tool from siblings by focusing on evictions only. It also outlines the scope (citywide from 2017, residential/commercial) and query methods (BBL vs address).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool ('assess tenant instability and cash-flow risk') and provides guidance on parameter selection ('provide either address OR bbl (not both)'). It does not explicitly state when not to use it or list alternatives, but sibling tools are clearly different.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fdny_fire_incidentsAInspect
Get FDNY fire and emergency incident history for a property address.
Queries the local FDNY incident database (NYC Open Data dataset 8m42-w767).
Returns fire incidents, structural fires, EMS responses, and other emergency
calls associated with a property's zip code and borough. Falls back to the
Socrata API for finer-grained address matching if local table unavailable.
Use this to identify fire history, structural fire risk, repeated emergency
responses, or patterns of emergency calls at a property's location.
Provide either `address` OR `bbl` (not both). If BBL is given, the tool
resolves it to a zip code before querying.
Args:
address: Street address, e.g. "37-06 80th Street, Queens" or
"350 5th Ave, Manhattan". Borough or zip code recommended.
bbl: 10-digit NYC BBL, e.g. "4008020015". Alternative to address.
incident_type: Filter by incident type keyword, e.g. "FIRE",
"STRUCTURAL", "EMS", "MEDICAL". Case-insensitive.
since_year: Return only incidents from this year onward, e.g. 2018.
Data available from 2013.
limit: Max incidents to return (1–100, default 20).
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| bbl | No | ||
| incident_type | No | ||
| since_year | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it queries a local database with Socrata API fallback, resolves BBL to zip code, and returns incidents associated with zip code/borough. It also mentions data availability from 2013. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose statement, usage context, and a bullet-style parameter list. It is slightly verbose but each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and the presence of an output schema, the description adequately covers purpose, usage, parameters, and behavior. It explains BBL resolution, date filters, and limit constraints. Minor omissions like pagination don't significantly detract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides clear details for each parameter: address examples, BBL format, incident_type keywords, since_year range, and limit range with default. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves FDNY fire and emergency incident history for a property address, specifying data sources and fallback behavior. It distinctly targets a niche not covered by sibling tools like get_311_complaints or get_building_permits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using the tool to identify fire history and structural fire risk, and explicitly warns against providing both address and BBL. However, it does not elaborate on when to prefer this tool over alternatives or provide exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hpd_complaintsBInspect
Get HPD tenant complaints and reported problems for a property.
Complaints are leading indicators of building distress — they show what
tenants are reporting before formal violations are issued. Categories
include PLUMBING, PAINT/PLASTER, HEAT/HOT WATER, PEST CONTROL, etc.
Use this alongside violations to assess a building's condition.
Note on historical depth: our local DB retains all historical HPD
complaints, while NYC's live Socrata API rolls older records out of
its public feed. As a result, totals reported here may exceed what
data.cityofnewyork.us shows for the same BBL — the extra rows are
real, just no longer surfaced by NYC Open Data.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes | ||
| status | No | ||
| category | No | ||
| since_date | No | ||
| limit | No | ||
| include_summary | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description provides some behavioral context: it notes historical depth and potential data differences from NYC Open Data. However, it does not disclose other behaviors such as authentication requirements, rate limits, or whether the operation is read-only (though implied). The description adds value but leaves gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise, with a clear front-loaded purpose in the first sentence. The subsequent sentences add context about usage and data depth without excessive verbosity. It earns its place, though the note about historical depth could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters (0% schema coverage) and no annotations, the description should provide comprehensive context. It explains the data source and use case but omits parameter details, making it incomplete for an agent to use correctly without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions categories like 'PLUMBING' and 'HEAT/HOT WATER' but does not describe other parameters (bbl, status, since_date, limit, include_summary). The explanation of 'BBL' is absent, and parameter meanings rely on names alone, which is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'HPD tenant complaints and reported problems for a property'. It distinguishes from sibling tools like get_dob_complaints and get_311_complaints by specifying 'HPD' and 'tenant complaints', making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description suggests using this tool alongside violations to assess building condition, but it does not explicitly state when to use this tool versus alternatives or when not to use it. The guidance is implied rather than explicit, missing a clear decision framework.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hpd_litigationsBInspect
Get HPD litigation history — cases where HPD sued the building owner.
HPD only litigates the worst-offending buildings. This is a strong red flag for investors. Shows case types (heat/services, harassment, tenant protection), harassment findings, open judgements, and penalties. A building with HPD litigation history carries significant regulatory risk.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry full burden. It lists returned data types but does not disclose side effects, rate limits, or behavior on invalid inputs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, concise at 5 sentences, but includes some redundant emphasis on regulatory risk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description lists key returned fields (case types, findings, etc.), but could be more complete about the output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'bbl' has 0% schema coverage and the description does not mention it or explain its format/purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get HPD litigation history' and differentiates from sibling tools (e.g., get_hpd_complaints) by specifying it covers cases where HPD sued the owner. Also explains that only worst-offending buildings are litigated, which adds context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage for investors evaluating regulatory risk and notes that HPD only litigates worst-offending buildings, but does not explicitly compare with sibling tools or mention when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hpd_registrationAInspect
Get HPD building registration and contact info.
Shows the managing agent, corporate owner, head officer, and site manager for a registered NYC building. Required for buildings with 3+ residential units. Use this to find who manages or owns a building.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the types of information returned (managing agent, etc.) but does not mention error handling, authentication needs, or behavior for invalid BBLs. The missing details limit full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of four concise, front-loaded sentences. Every sentence adds value: the first states the action, the second details the output, and the last two provide usage context. No redundant or vague language exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple lookup tool with a single parameter and no output schema, the description covers the essential aspects: what it does, what data it returns, and a key context (building size requirement). It is almost complete, though it could mention return format or read-only nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'bbl' has no schema description (0% coverage) and the description does not explain what BBL means or its format. The description adds no meaning beyond the parameter name, leaving the agent without important context for constructing valid requests.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves HPD building registration and contact info, listing specific contact types (managing agent, corporate owner, etc.). It distinguishes from siblings like get_hpd_complaints by focusing on registration data, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies that registration is required for buildings with 3+ residential units and directly says 'Use this to find who manages or owns a building.' It provides clear context for when to use the tool but does not explicitly mention alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_liens_and_encumbrancesAInspect
Get tax liens and mortgage/encumbrance records for a property.
Shows DOF tax lien sale list entries and ACRIS mortgage documents including lender names, amounts, and satisfaction records. Use this to assess a property's debt profile and lien exposure.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes | ||
| include_tax_liens | No | ||
| include_mortgages | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided. The description discloses the data sources (DOF, ACRIS) and record types (tax lien sale entries, mortgage documents, lender names, amounts, satisfaction records), adding value beyond the schema. However, it does not cover aspects like pagination, data freshness, rate limits, or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long and efficiently conveys purpose, details, and use case without unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, no schema descriptions, and no annotations, the description covers the core functionality and data sources but lacks parameter explanations and mentions of error conditions or rate limits. The presence of an output schema partially compensates, but overall completeness is moderate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description indirectly links the boolean parameters to tax liens and mortgages but does not explain the 'bbl' or 'limit' parameters, nor does it provide explicit parameter-level guidance. The agent may miss the meaning of 'bbl' as a Borough-Block-Lot identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (get), the specific resources (tax liens and mortgage/encumbrance records), and details the data sources (DOF and ACRIS) and contents (lender names, amounts, satisfaction records). This distinguishes it from sibling tools like get_tax_info or get_property_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a use case ('assess a property's debt profile and lien exposure'), suggesting when to use, but does not explicitly state when not to use or compare with alternatives. The implied usage is present but lacks explicit exclusions or comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_nypd_crimeAInspect
Get NYPD crime complaints within a radius of a property.
Queries the local NYPD complaint database (NYC Open Data) using a
geospatial bounding-box search centered on the property's lat/lon. Returns
all complaint types — felonies, misdemeanors, and violations — filed within
the specified radius. Falls back to Socrata API if local table is unavailable.
Uses the property's PLUTO coordinates (lot centroid) for accuracy.
Default radius of 300 m covers roughly 3 city blocks in any direction.
Use this to assess neighborhood safety for buyers, lenders, or underwriters.
Compare felony vs misdemeanor breakdown, trend over years, and dominant
offense types (assault, burglary, grand larceny, etc.).
Provide either `address` OR `bbl` (not both).
Args:
address: Street address, e.g. "350 5th Ave, Manhattan".
bbl: 10-digit NYC BBL. Coordinates resolved from PLUTO.
radius_meters: Search radius in meters (50–800, default 300 ≈ 3 blocks).
law_category: Filter by "FELONY", "MISDEMEANOR", or "VIOLATION".
Case-insensitive.
offense: Filter by offense keyword, e.g. "ASSAULT", "BURGLARY",
"GRAND LARCENY", "ROBBERY". Case-insensitive.
since_year: Return only complaints from this year onward (2006–present).
limit: Max complaints to return (1–200, default 50).
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| bbl | No | ||
| radius_meters | No | ||
| law_category | No | ||
| offense | No | ||
| since_year | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the geospatial bounding-box search, use of PLUTO coordinates, default radius, and fallback behavior. It mentions filtering capabilities but does not address auth needs, rate limits, or error cases. Still, it provides meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a front-loaded purpose paragraph followed by detailed parameter list. Every sentence adds value, though some phrases could be trimmed. Overall, it is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 7 parameters and existence of an output schema, the description covers the essential aspects: purpose, data source, filtering parameters, and use cases. It lacks info on output format and error handling, but these are partly addressed by the output schema and parameter defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates fully. It explains each parameter in detail: address/bbl mutual exclusivity, radius range and default, law_category case-insensitive values, offense examples, since_year range, and limit range. This adds significant meaning beyond the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get NYPD crime complaints within a radius of a property.' It specifies the data source, geospatial approach, and types of complaints returned. It distinguishes itself from sibling tools (e.g., get_311_complaints) by focusing on crime data, making selection unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: 'Use this to assess neighborhood safety for buyers, lenders, or underwriters.' It also explains the fallback behavior to Socrata API. However, it does not directly compare with alternatives or specify when not to use, though the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_property_historyAInspect
Get the history of a NYC property including sales and ownership transfers.
Pulls sales from DOF records and ownership transfers from ACRIS deed records. Shows sale prices, dates, buyer/seller names, and document types. Use this to understand a property's transaction history and price trajectory.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes | ||
| include_sales | No | ||
| include_ownership | No | ||
| include_transactions | No | ||
| doc_type_filter | No | ||
| start_date | No | ||
| end_date | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the data sources (DOF for sales, ACRIS for ownership) and what fields are shown, indicating a read operation. However, it does not disclose any behavioral traits like rate limits, data freshness, or permissions, which would be helpful given the lack of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, with the purpose first, then data sources, then use case. No redundant information; each sentence adds value. It is well-structured and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description adequately covers what the tool returns (sale prices, dates, buyer/seller names, document types) and the data sources. It could be more complete by explaining how the include_* parameters affect the output, but overall it is sufficient for a look-up tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for parameters, and the description does not explain the meaning or usage of parameters (e.g., bbl, include_sales, doc_type_filter). The description only provides high-level context about the tool's outputs, not the input parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it gets the history of a NYC property including sales and ownership transfers, specifically from DOF and ACRIS records. This distinguishes it from sibling tools that cover other aspects like permits, complaints, tax info, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Use this to understand a property's transaction history and price trajectory,' clarifying its applicability. However, it does not explicitly state when not to use it or mention alternative tools for related but distinct purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_property_issuesAInspect
Get HPD housing violations, DOB building code violations, and ECB/OATH violations for a property.
HPD Class C violations are immediately hazardous. ECB violations include
penalties and balances due. Returns both summary counts and violation
details. Use this to assess a building's regulatory risk profile.
Note on historical depth: our local DB retains all historical HPD
violations and complaints, while NYC's live Socrata API rolls older
records out of its public feed. As a result, the totals reported here
may exceed what data.cityofnewyork.us shows for the same BBL — the
extra rows are real, just no longer surfaced by NYC Open Data.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes | ||
| source | No | ALL | |
| status | No | ||
| severity | No | ||
| since_date | No | ||
| limit | No | ||
| include_summary | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It includes a detailed note about historical data retention explaining why totals may exceed NYC's public data, which is excellent transparency. However, it does not explicitly state that it is a read-only operation or mention authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first paragraph is concise. The second paragraph, while important for transparency, is somewhat lengthy but earned. Overall, minimal redundancy and front-loaded with key purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description fails to cover parameter semantics, which are important for correct invocation. It provides good behavioral context and purpose, but the parameter gap lowers completeness given the tool's complexity (7 parameters).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the description must compensate. It does not describe any of the 7 parameters (bbl, source, status, etc.) or their meanings, leaving the agent to infer from schema names and types alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves HPD, DOB, and ECB/OATH violations for a property, and mentions it returns summary counts and details. This distinguishes it from sibling tools like get_hpd_complaints which focus on single complaint types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description recommends using this to assess a building's regulatory risk profile, providing a clear use case. However, it does not explicitly state when not to use it or mention alternatives like get_dob_complaints for specific violations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rent_stabilizationAInspect
Get rent stabilization history for a property.
Shows stabilized unit counts from 2007-2017 and whether counts are estimated or confirmed by DHCR. Use this to check if a building is rent-stabilized and track unit count changes over time.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description provides some behavioral context: it shows historical counts from 2007-2017 and indicates counts can be estimated or confirmed. However, it does not disclose authentication needs, rate limits, error handling, or what happens with invalid BBLs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-load the purpose and key details. Every sentence provides useful information with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description partially explains the output (counts and confirmation status) but lacks details on output structure, error states, or data coverage assumptions. It is moderately complete but could be improved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, meaning the description does not explain the 'bbl' parameter (e.g., what it stands for, required format, or how to obtain it). The description adds no semantic value beyond the schema's type and required flag.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves rent stabilization history, specifies the data range (2007-2017) and type (counts, estimated/confirmed). It distinguishes itself from sibling tools like tax info or complaints by focusing on rent stabilization specifically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit usage guidance: 'Use this to check if a building is rent-stabilized and track unit count changes over time.' It does not mention when not to use it or alternatives, but the context of siblings implies distinct purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_infoBInspect
Get property tax assessment, market value, and exemption details.
Shows assessed and market values (land and total), tax class, taxable value, and any active tax exemptions like 421a, J-51, or STAR.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only lists returned data fields without addressing side effects, permissions, cost, or read-only nature. For a tool with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the main purpose. While concise, it could be slightly more streamlined but remains effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one required parameter and no output schema, the description is minimal. It lacks explanation of the bbl parameter and does not distinguish from siblings beyond scope. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The required parameter 'bbl' is not explained in the description. With 0% schema description coverage, the agent has no guidance on format (e.g., Borough-Block-Lot identifier) or example values, making correct invocation unlikely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('property tax assessment, market value, exemption details'), listing concrete data types. It clearly distinguishes from sibling tools like get_property_history or get_rent_stabilization.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when tax assessment details are needed, but it does not explicitly state when to avoid or name alternatives, which is acceptable for a focused tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_propertyAInspect
Look up a NYC property by address or BBL.
Returns the full property profile including building details, zoning, assessed value, owner, and lot characteristics. This is always the first tool to call — you need a BBL before using other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| bbl | No | ||
| borough | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the lookup and return of a full property profile. Implicitly a read operation, but lacks explicit statement of safety; no annotations to contradict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with action and resource, no filler. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage context, and high-level return value. Lacks explicit mention of borough parameter but otherwise complete for a lookup tool with output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description mentions address and BBL as identifiers but does not detail the borough parameter. With 0% schema coverage, description partially compensates but misses full parameter context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it looks up a NYC property by address or BBL and returns a full profile. Distinguishes from siblings by positioning itself as the first tool to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states it is always the first tool to call and that a BBL is needed before using other tools, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_compsAInspect
Find comparable property sales and neighborhood market statistics.
Can search by zip code, building class, size, and time period. If a reference BBL is provided, uses that property's characteristics as defaults. Returns individual sales with price per sqft and quarterly market trends.
| Name | Required | Description | Default |
|---|---|---|---|
| bbl | No | ||
| zip_code | No | ||
| building_class | No | ||
| min_sqft | No | ||
| max_sqft | No | ||
| months | No | ||
| min_price | No | ||
| max_price | No | ||
| limit | No | ||
| include_stats | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It does not mention whether the tool is read-only, idempotent, or has any side effects, rate limits, or authentication needs. The name 'search' implies read-only, but that's implicit at best.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loading the core purpose. Each sentence adds distinct value: purpose, search criteria, and return information. No redundant or verbose text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, no annotations, and an output schema (which partially mitigates return documentation), the description is incomplete. It does not cover all parameters, and lacks context on behavior, privacy, or data freshness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description only mentions zip_code, building_class, min/max_sqft, and months. It omits price parameters, limit, include_stats, and bbl's special behavior is partially covered. With 10 parameters, the description adds limited meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds comparable property sales and neighborhood market statistics. It specifies search criteria (zip code, building class, size, time period) and return types (sales with price per sqft, quarterly trends), distinguishing it from siblings like search_neighborhood_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage guidance: search by various filters and use of a reference BBL to inherit defaults. However, it does not explicitly compare to sibling tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_neighborhood_statsAInspect
Get aggregate neighborhood statistics for market research and area analysis.
Combines property stock data, sales market activity, violation patterns,
and rent stabilization counts at the zip code or neighborhood level.
Use this to compare areas, identify investment hotspots, or understand
a neighborhood's character before drilling into individual properties.
At least one of zip_code or neighborhood is required.
| Name | Required | Description | Default |
|---|---|---|---|
| zip_code | No | ||
| neighborhood | No | ||
| building_class | No | ||
| months | No | ||
| include_quarterly_trends | No | ||
| include_violations | No | ||
| include_rent_stabilization | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It states that the tool combines multiple data sources into aggregate statistics, but does not disclose behavioral details like rate limits, response structure, or that it returns only aggregates (no individual records). The existence of an output schema mitigates some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise (two sentences plus a usage note) and front-loads the main purpose. It could benefit from a more structured format (e.g., bullet points) but avoids unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters and an output schema, the description adequately covers the purpose and main inputs but omits details about boolean flags and months parameter. It completes the context for the tool's role as an aggregate querier, but not fully for parameter usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description only explains zip_code and neighborhood. Five other parameters (building_class, months, include_quarterly_trends, include_violations, include_rent_stabilization) are not described, leaving the agent to infer from names alone. This is a significant gap for a tool with 7 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get aggregate neighborhood statistics' and lists the combined data types (property stock, sales, violations, rent stabilization). It distinguishes from sibling tools that return specific records (e.g., get_evictions, get_rent_stabilization) by emphasizing aggregation and area analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: compare areas, identify investment hotspots, understand neighborhood character before drilling into individual properties. It also notes that at least one of zip_code or neighborhood is required. However, it does not explicitly name alternative sibling tools for specific data needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v0.1.1- First observed
analyze_property - First observed
get_311_complaints - First observed
get_building_permits - First observed
get_dob_complaints - First observed
get_evictions - First observed
get_fdny_fire_incidents - First observed
get_hpd_complaints - First observed
get_hpd_litigations - First observed
get_hpd_registration - First observed
get_liens_and_encumbrances - First observed
get_nypd_crime - First observed
get_property_history - First observed
get_property_issues - First observed
get_rent_stabilization - First observed
get_tax_info - First observed
lookup_property - First observed
search_comps - First observed
search_neighborhood_stats
TDQS
Scored across 18 tools
Most tools have distinct purposes clearly described, but there is potential confusion between get_hpd_complaints (complaints) and get_property_issues (violations), as both deal with property condition. Similarly, get_dob_complaints and get_311_complaints might be conflated. However, detailed descriptions mitigate ambiguity.
All tool names follow a consistent verb_noun pattern using snake_case (e.g., get_evictions, search_comps). The verbs are descriptive and predictable, making it easy for an agent to infer tool functionality from the name.
With 18 tools, the set is comprehensive without being overwhelming. Each tool covers a distinct NYC data source or analysis function, and the count is well-aligned with the server's purpose of providing detailed property intelligence.
The server covers a wide range of NYC property data including violations, complaints, permits, evictions, crime, sales, taxes, and neighborhood statistics. Some niche datasets like flood zones or school quality are missing, but core due diligence needs are met.
Maintenance
Related MCP Connectors
Agent-native MCP server over 49M+ US public and government records, privacy-first, always current.
Agent-native MCP over US public + government records, entity- and parcel-keyed.
MCP server for nonprofit financials via ProPublica — IRS Form 990 data for 1.8M+ nonprofits.
Agent-ready NYC public records. Hosted, source-backed civic data organized around durable anchors.
Related MCP Servers
- AlicenseAqualityCmaintenanceBuilt an MCP server that connects Claude Desktop, Cursor, or any MCP client to Northeast Deal Intel's CRE database. 8 tools: • search_deals — filter 14K+ active listings by state, type, score, cap rate • search_comps — 100K+ closed transactions for comp benchmarking • score_deal — submit any property for AI scoring against real comp data • find_1031_candidates — exchange-ready deal filter (price8MIT
- FlicenseAqualityDmaintenanceProvides Claude with access to NYC public property data including property details, sales history, comparable sales, tax benefits, and rent stabilization analysis using natural language.7-
- FlicenseAqualityCmaintenanceMCP server that exposes a Hawaii property pipeline as Claude tools, allowing natural language queries about parcel records, hazards, zoning, ADU eligibility, and more, based on real public data.3-
- FlicenseNot gradedqualityCmaintenanceA production-grade MCP server enabling Claude to perform comprehensive NJ real estate workflows including property search, valuation, neighborhood intelligence, investment analysis, and agent tools via 20 tools and 15+ data sources.-