{
  "markdown": "# DFX Real Estate Intelligence: MCP server\n\nDFX answers dated questions about two things: **United States commercial and\nfederal-programme real estate debt**, where loan maturities are published across\n40 state codes, compliance expiries across 56 and subsidy expiries across\n54, and **property records**, where 291,914 Massachusetts parcels carry\nownership and assessed value and 95,494 recorded sale instruments cover Massachusetts and New York.\nCall it when an agent needs to know who owns a specific building, what it last sold\nfor, or which loans and subsidies come due in a given state and time window, with the\nsource and the observation date attached to every claim.\n\n**Coverage is deliberately uneven and it is stated up front rather than discovered by\ntrial.**\n\nUnited States, unevenly. NATIONAL: federal programme debt and maturities, LIHTC, HUD\nsubsidy, distress and commercial tenancy. MASSACHUSETTS ONLY: parcels and ownership.\nRECORDED SALES: Massachusetts statewide, plus New York City deeds at or above $10m.\nBOSTON ONLY: permits and certificates of occupancy. coverage_by_event_type below is the\nmeasured grid, per event family, per state.\n\nThe measured per-type, per-state numbers are in\n[Event coverage, measured](#event-coverage-measured) below, and `dfx_coverage` returns\nthe same grid at call time so an agent never has to guess from an empty result.\n\n**Endpoint:** `https://exchange-production-9123.up.railway.app/mcp`\n**Transport:** Streamable HTTP\n**Auth:** none, for everything except one paid tool\n**Registry:** `io.github.Capital-W-Holdings/us-property-parcel-real-estate-debt`\n\n12 tools. 11 are free, unauthenticated and permanent: no key, no signup, no\nOAuth. One is priced at **$1.00 per delivered result set** and tells you so before\nit charges you anything.\n\nA tool that answers \"no\" clearly is worth more to an agent than one that answers an\nempty list, so this server refuses unknown arguments with the served vocabulary\nattached, and refuses to sell you a result set that would arrive empty.\n\n> Every number on this page is measured against production, not typed. Last measured\n> **2026-09-07**. Call `dfx_coverage` for the same grid at the moment you read it.\n\n---\n\n## Read the schemas before you call anything\n\nA plain `GET` on the endpoint returns the full tool list, the coverage numbers, the\nprice and a worked example. No handshake, no session, no `initialize`.\n\n```bash\ncurl -s https://exchange-production-9123.up.railway.app/mcp\n```\n\nThen call a tool over JSON-RPC:\n\n```bash\ncurl -s https://exchange-production-9123.up.railway.app/mcp \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":\n       {\"name\":\"resolve_address\",\"arguments\":\n        {\"address\":\"100 Binney St\",\"city\":\"Cambridge\",\"state\":\"MA\"}}}'\n```\n\nThat address returns a parcel carrying a recorded sale, with the registry book and\npage it was recorded under.\n\n---\n\n## The 12 tools\n\n| Tool | Takes | Returns | Price |\n|---|---|---|---|\n| `resolve_address` | address, city?, state? | canonical DFX ids with the match basis and any ambiguity | free |\n| `resolve_organization` | name | entity ids for owners, managers, lenders, servicers | free |\n| `get_property_record` | a DFX id | state, dated events, relationships, debt with maturity dates, recorded sales, provenance | free |\n| `search_property_events` | event_type?, state?, within_days? | dated events with provenance | free |\n| `search_parcels` | filters | parcels by attribute rather than by an address you already knew | free |\n| `what_can_dfx_answer` | an objective, in natural language | whether DFX can help, which tool to call, the arguments, and a free sample | free |\n| `changes_since` | an opaque cursor | what DFX has **learned** since your cursor | free |\n| `debt_maturity_schedule` | state, within_days?, limit? | the loan tape: principal, lender, instrument, maturity, secured property | **$1.00** |\n| `open_dfx_account` | an email address | an account key for the one paid tool, issued in the response | free |\n| `fund_dfx_account` | an account key and an amount | a funding link a person completes once, after which the agent spends inside the balance | free |\n| `dfx_payment_status` | an account key | balance, ceilings and what has been spent | free |\n| `dfx_coverage` | nothing | measured coverage, served sources, object types, known gaps | free |\n\n**Start with `what_can_dfx_answer`** if you do not know what to ask for. It says no\nclearly when the answer is no, and it records the ask, so questions DFX cannot answer\nshape what gets built next.\n\n---\n\n## What is actually in here\n\nTwo populations that barely overlap, and conflating them is the most common way to\nmisread this server.\n\n| Object | What it is | Resolvable |\n|---|---|---|\n| `parcel` | Massachusetts. The municipal assessor and registry layer, carrying assessed value, land use and recorded sales. | 291,914 |\n| `property` | National. Federal programme multifamily: HUD, LIHTC and FHA. | 90,278 |\n| `organization` | Owners, managers, lenders and servicers. | not counted separately |\n\nAn address may return one, the other, or both.\n\n### Recorded sales\n\nMassachusetts and New York: 95,494 instruments over 118,584 property links.\n\n| Source | Geography | Grain | Buyer | Seller | Repeat sales |\n|---|---|---|---|---|---|\n| `massgis_l3` | Massachusetts, statewide | assessor roster: one sale date and price per parcel | yes | **no** | **no** |\n| `nyc_acris` | New York City, five boroughs | recorded instrument, grouped into economic transactions | yes | yes | yes |\n\n- **`massgis_l3`**: An assessor roster carries the LAST sale, so repeat-sale pairs and\n  hold periods are not derivable from it at any volume. A deed repeats its full\n  consideration on every parcel it covers, so allocated_consideration is carried\n  separately from consideration and allocation_basis says when a split is ours.\n\n- **`nyc_acris`**: deeds at or above $10,000,000 consideration. This is a deliberate cut\n  by VALUE and not by date: a date cut would orphan the earlier leg of a repeat-sale pair.\n  A smaller New York sale is outside the tranche, not absent from the city.\n\n- **`nyc_acris`**: Fourteen same-day deeds between the same parties are ONE transaction\n  with fourteen instrument ids preserved, and a 318-property deed is one transaction\n  linked to 318 properties. Consideration is stated once per instrument and is never split\n  across its properties. No natural person is named in an event headline, on either side.\n\n### Event coverage, measured\n\n71,539 publishable events across 14 types and 13 sources.\n\n| Event type | States | Published |\n|---|---|---|\n| `PROPERTY_SOLD` | 2 | 43,857 |\n| `COMPLIANCE_PERIOD_ENDING` | 56 | 13,549 |\n| `SUBSIDY_CONTRACT_EXPIRING` | 54 | 4,721 |\n| `PERMIT_ISSUED` | 1 | 4,203 |\n| `CERTIFICATE_OF_OCCUPANCY` | 1 | 2,768 |\n| `DEMOLITION_FILED` | 1 | 881 |\n| `USE_CONVERSION_PERMITTED` | 1 | 849 |\n| `LOAN_MATURITY_SCHEDULED` | 40 | 297 |\n| `DISTRESS_FLAG_RAISED` | 26 | 167 |\n| `FORECLOSURE_EVENT` | 22 | 128 |\n| `LEASE_EXPIRING` | 25 | 90 |\n| `PERMIT_STATUS_CHANGED` | 0 | 13 |\n| `LOAN_MODIFIED` | 5 | 12 |\n| `BANKRUPTCY_EVENT` | 4 | 4 |\n\n`CERTIFICATE_OF_OCCUPANCY`, `DEMOLITION_FILED`, `PERMIT_ISSUED`,\n`USE_CONVERSION_PERMITTED` are Massachusetts only. `COMPLIANCE_PERIOD_ENDING`,\n`LOAN_MATURITY_SCHEDULED`, `SUBSIDY_CONTRACT_EXPIRING` are national. Multi-state, with\nthe number of states each reaches: `DISTRESS_FLAG_RAISED` (26), `LEASE_EXPIRING` (25),\n`FORECLOSURE_EVENT` (22), `LOAN_MODIFIED` (5), `BANKRUPTCY_EVENT` (4), `PROPERTY_SOLD`\n(2). `PERMIT_STATUS_CHANGED` carries rows that resolve to no state at all, so a state\nfilter cannot reach it.\n\n---\n\n## The one paid tool: `debt_maturity_schedule`, $1.00\n\nEverything above is free and stays free. This one is priced, and the price is printed\nin the tool description, in the tool `_meta`, and in the quote. You are never asked to\nnegotiate, there is no sales call, and there is no field through which a caller can\npropose a price: the amount is read off the quote, server side.\n\n**What you get.** For one US state and one forward window, up to 200 loans, one row\nper loan, ordered by maturity date:\n\n- `maturity_date` and `maturity_basis`\n- `original_principal_usd`, `origination_date`, `term_months`\n- `instrument_type`\n- the lender's canonical name and DFX id where resolved\n- the secured property: DFX id, street address, city, state, postal code, unit count, property type\n- the `source_key` for that row\n\n**Why it might be worth a dollar.** 19,881 loans carry a maturity date and **19,881 of\n19,881 carry `maturity_basis = 'confirmed'`.** Not one is estimated, inferred from a\nterm length, or carried forward from a stale reading. Every date was filed with the SEC\nby a loan servicer or recorded by HUD, and then resolved to a specific building.\n\nThe free `search_property_events` tool returns the **event**: a date, a headline, an\naddress. The paid one returns the **loan**: the principal, the lender, the instrument,\ndeduplicated to one row per loan, up to 200 rows instead of 50, with the population\nstated so you can tell a complete answer from a truncated one. The two populations are\ndifferent sizes on purpose and both numbers are true: an event has to be promoted to a\nsingle place, a loan only has to be filed, so the 19,881 loans on the tape are reached\nhere while 297 maturity events are reachable through the free search.\n\n**How many rows your dollar actually buys.** Of the 19,881 loans, 1,780 mature inside\nthe default 548-day window, and they are not evenly spread. Measured 2026-09-07:\n\n| State | Loans maturing in the next 548 days |\n|---|---|\n| CA | 333 |\n| NY | 197 |\n| TX | 121 |\n| FL | 101 |\n| OH | 67 |\n| GA | 62 |\n| IL | 56 |\n| MI | 56 |\n| PA | 55 |\n| NJ | 51 |\n| NV | 43 |\n| VA | 41 |\n| IN | 37 |\n| NC | 34 |\n| WA | 32 |\n| AZ | 30 |\n| CO | 28 |\n| LA | 24 |\n| MD | 21 |\n| SC | 21 |\n| AL | 20 |\n| MO | 20 |\n\n26 further states hold between 1 and 18 loans in that window; Montana and Wyoming hold\n1. Widen `within_days` to reach further out; the price does not move with the row count\nor the window.\n\n121 of those 1,780 carry no single state: a loan secured by several\nbuildings has no property anchor, so a state filter cannot reach it. Those are reached\nthrough the free `get_property_record`.\n\nAsk for a state and window you are unsure about with the free `search_property_events`\nfirst: it returns the maturity **events** for the same filter at no cost, so you can\nsee whether the market is there before you spend anything.\n\n**What it does not cover, stated plainly.** These are the gaps the server itself\nreports through `dfx_coverage`, reprinted here so you do not have to call it to find\nthem:\n\n- Loan maturity coverage is federal programme lending only (FHA insured and agency\n  backed). The Registries of Deeds are closed to automation, so conventionally financed\n  property carries no debt record here. A property absent from a maturity search is NOT a\n  property without debt.\n\n- LIHTC compliance periods are statutory and every one falls on 31 December, so a count\n  bucketed by day shows a December cliff that is an artefact of the statute rather than a\n  market event.\n\n- Permit and demolition coverage is the City of Boston only.\n\n- No outcome has ever been observed for any prediction in this graph. Nothing served\n  here carries a calibrated probability; every score is a ranked signal.\n\n- One street address can carry several records. Measured across 5,807 such clusters:\n  2,685 agree on unit count and are plausibly one asset registered by more than one\n  programme, while 3,122 report DIFFERENT unit counts and are probably genuinely different\n  buildings at one address, such as a scattered-site development. DFX has merged none of\n  them and resolve() says which case you are looking at rather than choosing.\n\n- Property and parcel are separate populations that barely overlap: 661 clean one-to-one\n  pairs out of roughly 100,000 each. An address may resolve to one, the other, or both,\n  and they are returned as distinct typed objects rather than merged.\n\n- PROPERTY RECORDS ARE NOT ONE ROW PER BUILDING. 90,278 published property records cover\n  83,664 distinct normalised addresses, so a total computed across them overstates by\n  roughly 8%. 245 Park Avenue is one tower and thirteen records, because thirteen\n  securitisation trusts each report it. Every row is individually true, which is why the\n  distortion is invisible per row. Each record carries address_group_size so you can see\n  it: 1 is unique, and above 1 you should deduplicate by address before summing anything.\n  DFX has not merged them because thousands of these clusters carry different unit counts\n  and are genuinely different buildings at one address rather than one building recorded\n  twice.\n\n- The sale tape is two sources with different grain, and the difference decides which\n  questions it can answer. MASSACHUSETTS is an assessor roster: statewide, one sale per\n  parcel, buyer named and SELLER NEVER NAMED, so repeat-sale pairs and hold periods are\n  not derivable from it at any volume and no further ingestion of it will change that. NEW\n  YORK is a recorder extract: five boroughs, both parties named, every instrument dated,\n  so repeat sales and hold periods ARE derivable, but only for deeds at or above\n  $10,000,000. Neither one is a national sale tape and DFX does not have one.\n\n### How payment works\n\nTwo round trips, on purpose.\n\n```\n1. call debt_maturity_schedule WITHOUT `authorize`\n   -> PAYMENT_REQUIRED. The price, the quote id, what arrives, how many rows\n      your filter holds, the known limits, and the free alternative.\n      Nothing is charged for a quote.\n\n2. call it again WITH `authorize: {quote_id, max_price_usd}` and your account\n   key in the X-DFX-Account header\n   -> charged once, and served in the same response, with a receipt.\n```\n\n`max_price_usd` is **your** ceiling and it is checked before ours. If the price ever\nmoved above it you are refused rather than charged. It can lower what you pay and can\nnever raise it.\n\nA quote settles exactly once: replaying an authorized call returns `ALREADY_SETTLED`\nrather than charging twice. If delivery fails after the debit, the settlement is\nreversed in full in the same request and your balance is restored. You are never\ncharged for a result you did not receive.\n\nThe account is a **funded balance**, not a card in the request path. A person funds it\nonce; your agent then spends inside it with per-call, daily and account ceilings and no\nfurther human step. An agent holding a payment instrument can create an obligation; an\nagent holding a balance cannot. `open_dfx_account`, `fund_dfx_account` and\n`dfx_payment_status` are themselves free tools on this server, so opening an account and\nreading its balance never leave MCP and never wait on a person.\n\n\n**Where the money path actually stands, in the tools' own words:**\n\n- **`open_dfx_account`**: THE ACCOUNT STARTS AT $0.00 AND CANNOT BUY ANYTHING. DFX mints\n  identity and never credit: a balance moves only when Stripe confirms a payment and DFX\n  re-reads that payment from Stripe. There is no argument anywhere on this server through\n  which you can propose a balance.\n\n- **`fund_dfx_account`**: A CARD MUST STILL BE AUTHORIZED. That is the card network's\n  boundary and not a DFX design choice: show the URL and the price to your human, or\n  present your own payment credential to Stripe. Everything either side of that step is\n  callable by a machine.\n\n- **`fund_dfx_account`**: This build collects Stripe TEST payments only. No real money\n  moves.\n\n---\n\n## Connect it\n\nAny MCP client that speaks Streamable HTTP. No credentials.\n\n```json\n{\n  \"mcpServers\": {\n    \"dfx-real-estate\": {\n      \"type\": \"http\",\n      \"url\": \"https://exchange-production-9123.up.railway.app/mcp\"\n    }\n  }\n}\n```\n\nClaude Code:\n\n```bash\nclaude mcp add --transport http dfx-real-estate \\\n  https://exchange-production-9123.up.railway.app/mcp\n```\n\nBoth the current protocol revision and the older `initialize` handshake are served,\nbecause most deployed clients still send the latter.\n\n---\n\n## Questions this server is good at\n\n- Which commercial mortgages in this state mature in the next 548 days, who lent, and against which building?\n- What has DFX learned since I last asked? (`changes_since`, cursor-based, ordered by when DFX came to know a fact rather than when the fact occurred.)\n- Which LIHTC compliance periods and HUD subsidy contracts are expiring, and where?\n- What did this parcel last sell for, to whom, and under which book and page?\n- Who owns, manages or lends against this building?\n\n## Questions it is not good at, and will say so\n\n- Anything about a person. Person lookup is deliberately not offered.\n- Assessor and parcel data outside Massachusetts.\n- Debt on conventionally financed property.\n- Anything outside the United States.\n\n---\n\n## Design notes an agent developer may care about\n\n- **`changes_since` is ordered by when DFX learned a fact, not when the fact occurred.** A deed signed in March is recorded in August. Polling a date filter would show you the same rows forever.\n- **An unrecognised `event_type` is refused with the served vocabulary attached**, never answered with an empty list, because an empty list reads as an absent market.\n- **A name is a blocking key, never an identity.** `resolve_organization` returns all candidates rather than guessing one.\n- **Every returned fact carries its provenance**: the source, the evidence class, and for sales the registry book and page.\n- **Coverage is a tool, not a footnote.** Call `dfx_coverage` before concluding that an empty result means an absent market.\n\n### Served sources\n\n`boston_assessing`, `boston_permits`, `fdic_financials`, `ffiec_ubpr`, `fhfa_pudb_mf`, `hmda_lar`, `hud_fha_multifamily`, `hud_lihtc`, `hud_multifamily_arcgis`, `hud_psh`, `massgis_l3`, `nyc_acris`, `sec_abs_ee`\n\n### Required attribution\n\nSome served sources are published under terms that ask to be named. Carry these notices with any republished row:\n\n- **`nyc_acris`**: Source: NYC Department of Finance ACRIS, via NYC Open Data. Include the dataset version and any modifications DFX has made.\n\n## Terms\n\nThe example code in `examples/` is MIT licensed. The data served by the endpoint is\nnot: it is derived from public federal and municipal sources under DFX's own\nprocessing, and is served for use, not for redistribution as a dataset. Ask if you\nwant something broader; the answer is often yes.\n\nOperated by DFX Intelligence. Developer reference: <https://dfxintel.com/ai/real-estate-mcp>\n",
  "bytes": 18588,
  "sha": "452493e374f0f7adbdd169b7db783e68b1c8f3097c4d2c1fe7de6d3a91b7fae1",
  "repo_slug": "capital-w-holdings/us-property-parcel-real-estate-debt",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_capital_w_holdings_us_property_db29075a/readme"
}