Developer reference

Machine capability

Property sale and ownership data for AI agents

Recorded deeds with consideration, book and page, plus the assessor parcel layer behind them. This is DFX's DEEPEST data and its NARROWEST geography, and the two facts belong in the same sentence.

Short answer

What did this property sell for, and who owns it? Yes, for 2 states only: MA, NY. 43,680 published events, measured 12 September 2026. Free, with no API key and no signup. Call resolve_address at https://exchange-production-9123.up.railway.app/mcp.

What it returns

Per sale: the recorded date, the consideration as published, this parcel's allocated share of it, the allocation basis, how many parcels the instrument covered, and the registry book and page. Per parcel: assessed value, land use, gross building area, value per square foot, annual tax and year built.

Coverage, with the denominators

Coverage is uneven by family and stating it any other way would be the one failure that matters here. These are whole populations, not samples.

Event familyEventsWhere it is covered
PROPERTY_SOLD43,6802 states only: MA, NYMA NY

Why this is different from the alternatives

A deed repeats its full consideration on every parcel it covers, so summing the naive column multiplies a portfolio sale by the number of parcels in it. DFX carries the instrument total and the allocated share as separate fields and states which split is its own. Most sale feeds carry one number and do not say which one it is.

A real call, and the real response

Executed against production when this page was generated. The response below is what came back, truncated, not an illustration.

Recent recorded property sales in New York.

No within_days: a sale has already happened, and the filter looks forward.

curl -s https://exchange-production-9123.up.railway.app/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_property_events","arguments":{"event_type":"PROPERTY_SOLD","state":"NY","limit":3}}}'

Response (truncated)

{
 "dfx": {
  "capability": "search_property_events",
  "version": "0.3.0",
  "answered_at": "2026-09-12T14:38:49.532684+00:00"
 },
 "ok": true,
 "count": 3,
 "results": [
  {
   "dfx_id": "77553afc-ebf2-4a4f-a84e-6e95f991b6b5",
   "place_kind": "parcel",
   "event_type": "PROPERTY_SOLD",
   "occurred_at": "2026-07-29",
   "in_days": -45,
   "headline": "500 COLUMBUS AVENUE, New York NY sold for $28,000,000 on 2026-07-29 to 500 COLUMBUS SP LLC",
   "address": "500 COLUMBUS AVENUE",
   "city": "New York",
   "state": "NY",
   "unit_count": null,
   "address_known": true,
   "magnitude": 28000000.0,
   "magnitude_unit": "USD",
   "evidence_class": "VERIFIED",
   "source": "nyc_acris",
   "sources": [
    "nyc_acris"
   ],
   "verify": {
    "capability": "get_property_record",
    "dfx_id": "77553afc-ebf2-4a4f-a84e-6e95f991b6b5"
   }
  },
  {
   "dfx_id": "8aa0afbb-7d54-472a-ab10-c7ec7faa200b",
   "place_kind": "parcel",
   "event_type": "PROPERTY_SOLD",
   "occurred_at": "2026-07-24",
   "in_days": -50,
   "headline": "153-15 CROSS ISLAND PARKWAY, New York NY sold for $56,000,000 on 2026-07-24 to BTF WHITESTONE REALTY LLC",
   "address": "153-15 CROSS ISLAND PARKWAY",
   "city": "New York",
   "state": "NY",
   "unit_count": null,
   "address_known": true,
   "magnitude": 56000000.0,
   "magnitude_unit": "USD",
   "evidence_class": "VERIFIED",
   "source": "nyc_acris",
   "sources": [
    "nyc_acris"
   ],
   "verify": {
    "capability": "get_property_record",
    "dfx_id": "8aa0afbb-7d54-472a-ab10-c7ec7faa200b"
   }
  },
  {
   "dfx_id": "6af85b7a-86fc-491c-8714-c7e8749a3144",
   "place_kind": "parcel",
   "event_type": "PROPERTY_SOLD",
   "occurred_at": "2026-07-24",
   "in_days": -50,
   "headline": "165 EAST 64 STREET, New York NY sold for $18,000,000 on 2026-07-24 to an individual buyer",
   "address": "165 EAST 64 STREET",
   "city": "New York",
   "state": "NY",
   "unit_count": null,
   "address_known": true,
   "magnitude": 18000000.0,
   "magnitude_unit": "USD",
   "evidence_class": "VERIFIED",
   "source": "nyc_acris",
   "sources": [
    "nyc_acris"
   ],
   "verify": {
    "capability": "get_property_record",
    "dfx_id": "6af85b7a-86fc-491c-8714-c7e8749a3144"
   }
  }
 ],
 "state": "OK",
 "coverage": {
  "verdict": "COVERED",
  "refreshed_at": "2026-09-12T13:53:10.534838+00:00"
 },
 "searched": true,
 "complete": false,
 "no_match": null,
 "ro

Turn a street address into a canonical id.

curl -s https://exchange-production-9123.up.railway.app/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"resolve_address","arguments":{"address":"100 Binney St","city":"Cambridge","state":"MA"}}}'

Response

{
 "dfx": {
  "capability": "resolve_address",
  "version": "0.3.0",
  "answered_at": "2026-09-12T14:38:44.889396+00:00"
 },
 "ok": true,
 "objects": [
  {
   "dfx_id": "90555f06-627e-4946-a97f-8397a7bf8726",
   "type": "parcel",
   "name": "100 BINNEY ST",
   "city": "Cambridge",
   "state": "MA",
   "county": null,
   "apn": null,
   "land_use": null,
   "assessed_total": 494419400.0,
   "assessment_year": 2026,
   "address_ambiguous": false,
   "match": {
    "key": "100 BINNEY ST, CAMBRIDGE MA",
    "basis": "exact normalised address"
   },
   "verify": {
    "capability": "get_property_record",
    "dfx_id": "90555f06-627e-4946-a97f-8397a7bf8726"
   }
  }
 ],
 "count": 1,
 "ambiguity": "unique",
 "caution": null,
 "no_match": null,
 "interpreted": null,
 "latency_ms": 549,
 "state": "OK"
}

Connecting

One HTTPS endpoint speaking Model Context Protocol over JSON-RPC. No signup, no API key, no OAuth for anything free. A plain GET on the endpoint returns every tool schema, so you can evaluate the server without calling it.

Claude Code

one command, then it is available in every session

claude mcp add --transport http dfx-real-estate https://exchange-production-9123.up.railway.app/mcp

Claude Desktop

claude_desktop_config.json, then restart the app. It cannot reach a remote server directly, so this bridges through mcp-remote.

{
  "mcpServers": {
    "dfx-real-estate": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://exchange-production-9123.up.railway.app/mcp"
      ]
    }
  }
}

Cursor, Windsurf, Cline and Zed

the mcp.json their settings panel writes

{
  "mcpServers": {
    "dfx-real-estate": {
      "url": "https://exchange-production-9123.up.railway.app/mcp"
    }
  }
}

VS Code

the servers key, which is spelled differently to everything above

{
  "servers": {
    "dfx-real-estate": {
      "type": "http",
      "url": "https://exchange-production-9123.up.railway.app/mcp"
    }
  }
}

There is no signup, no API key and no OAuth for anything free, and eleven of the twelve tools are free. A plain GET on the endpoint returns every tool schema, so a client can be pointed at it and evaluated before it is trusted.

Registry entry io.github.Capital-W-Holdings/us-property-parcel-real-estate-debt. The full machine-readable capability catalog, including every tool schema, the measured coverage grid and the stated gaps, is at /ai/real-estate-mcp/catalog.json.

Where this does not help

Where it does not help

  • Recorded sales carry a buyer and never a seller.
  • The parcel and ownership layer is Massachusetts. Nothing here is national and it is not a national product with gaps; it is a state product.
  • `within_days` looks FORWARD. A sale has already happened, so omit it.

State by state

One page per state, each carrying the dated rows themselves rather than a description of them. These are free to read and free to call.

The other capabilities on this server

Facts on this page were last checked against the running product on . Prices are read from the live billing configuration, so this page and your invoice cannot disagree. The machine-readable version of this record is at /ai/entity.json.