Skip to main content
Glama
Capital-W-Holdings

DFX Real Estate Intelligence

DFX Intelligence: MCP server

DFX Intelligence MCP server: quality and maintenance score on Glama

One connection, four domains. Real estate is the first and deepest; the same server also answers across family offices, independent sponsors and their capital providers, private companies with a transition coming, and venture capital, with cross-domain identity, relationships, events, matching and verification. See Beyond real estate.

The real estate domain answers dated questions about two things: United States commercial and federal-programme real estate debt, where loan maturities are published across 52 state codes, compliance expiries across 56 and subsidy expiries across 54, and property records, where 291,914 Massachusetts and New York parcels carry ownership and assessed value and 95,562 recorded sale instruments cover Massachusetts and New York. Call it when an agent needs to know who owns a specific building, what it last sold for, or which loans and subsidies come due in a given state and time window, with the source and the observation date attached to every claim.

Coverage is deliberately uneven and it is stated up front rather than discovered by trial.

United States, unevenly. NATIONAL: federal programme debt and maturities, LIHTC, HUD subsidy, distress and commercial tenancy. MASSACHUSETTS ONLY: parcels and ownership. RECORDED SALES: Massachusetts statewide, plus New York City deeds at or above $10m. BOSTON ONLY: permits and certificates of occupancy. coverage_by_event_type below is the measured grid, per event family, per state.

The measured per-type, per-state numbers are in Event coverage, measured below, and dfx_coverage returns the same grid at call time so an agent never has to guess from an empty result.

Endpoint: https://exchange-production-9123.up.railway.app/mcp Transport: Streamable HTTP Auth: none Registry: io.github.Capital-W-Holdings/us-property-parcel-real-estate-debt

83 tools, all free, unauthenticated and read-only: no key, no signup, no OAuth.

A tool that answers "no" clearly is worth more to an agent than one that answers an empty list, so this server refuses unknown arguments with the served vocabulary attached.

Every number on this page is measured against production, not typed. Last measured 2026-09-19. Call dfx_coverage for the same grid at the moment you read it.


Read the schemas before you call anything

A plain GET on the endpoint returns the full tool list, the coverage numbers and a worked example. No handshake, no session, no initialize.

curl -s https://exchange-production-9123.up.railway.app/mcp

Then call a tool over JSON-RPC:

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"}}}'

That address returns a parcel carrying a recorded sale, with the registry book and page it was recorded under.

If you are a harvester rather than a caller

The endpoint serves the discovery conventions from its own origin, so an index does not have to guess and does not have to be told:

path

what it is

/llms.txt

the entry point, for something holding only this host name

/.well-known/ard.json

Agentic Resource Discovery catalog

/.well-known/mcp/server-cards.json

MCP server card

/.well-known/agent-card.json

A2A style agent card

/agents.txt

the agents.txt convention

/openapi.json

the same capabilities over plain HTTP

/robots.txt

crawlers and agents are welcome, and it says so

agents.txt names no payment protocol because nothing on this server is priced.


Related MCP server: LiveDataLink

The 83 tools

Tool

Takes

Returns

Price

resolve_address

address, city?, state?

canonical DFX ids with the match basis and any ambiguity

free

resolve_organization

name

entity ids for owners, managers, lenders, servicers

free

get_occupancy

a property or company id, or a company name with an address

who is observed to occupy a building, or where a company operates, with the evidence tier

free

get_property_record

a DFX id

state, dated events, relationships, debt with maturity dates, recorded sales, provenance

free

search_property_events

event_type?, state?, within_days?

dated events with provenance

free

search_bank_cre_exposure

state?, name?, CRE-to-equity range?, above_guidance?, min_assets_usd?, min_noncurrent_pct?, sort?

FDIC-insured banks by CRE concentration with the guidance screen and UBPR percentile ranks

free

search_subsidised_housing

state?, city?, program?, min_waiting_months?, occupancy range?, min_units?

HUD-subsidised projects with units available, occupancy, months on the waiting list, rent, income and HUD spend, one annual capture

free

search_parcels

filters

parcels by attribute rather than by an address you already knew

free

what_can_dfx_answer

an objective, in natural language

whether DFX can help, which tool to call, the arguments, and a free sample

free

changes_since

an opaque cursor

what DFX has learned since your cursor

free

debt_maturity_schedule

state, within_days?, limit?

the loan tape: principal, lender, instrument, maturity, secured property

free

dfx_coverage

nothing

measured coverage, served sources, object types, known gaps

free

search_family_offices

asset_class?, city?, class?, cursor?, has_real_estate?, has_sponsor_relationships?, ...

Family offices as compact cards: class (single, multi, embedded...) with confidence, whether they invest directly, sectors and asset classes on record, check si...

free

get_family_office

dfx_id

The full card for one family office: profile, AUM / RAUM / 13F value kept apart with their as-of dates, behaviour, the people who run it with roles, its observe...

free

search_family_office_investments

asset_class?, include_candidates?, investment_kind?, limit?, office_dfx_id?, sector?, ...

Dated investments family offices have been observed making: target, sector, asset class, structure, control or minority, lead or participant, amounts where disc...

free

search_independent_sponsors

city?, include_unverified?, kind?, limit?, min_confidence?, query?, ...

Verified independent sponsor firms (deal-by-deal acquirers of lower middle market companies) as compact cards: verification status, classification, mandate summ...

free

get_independent_sponsor

dfx_id

The full card for any entity on the sponsor graph: a sponsor (with its verification status, the companies resembling its observed deals as counted facts and rea...

free

search_sponsor_capital_providers

limit?, making_new_investments?, min_fund_size_usd?, provider_type?, query?, sbic_licensed?, ...

SBICs, mezzanine and private equity funds, and family offices observed providing capital to independent sponsors: provider type, strategy, fund style, fund size...

free

search_private_companies

city?, limit?, max_participants?, min_opportunity?, min_participants?, naics_prefix?, ...

US private companies whose filings (Form 5500 plan history, final filings, ownership changes) show a transition: vertical, plan participants as a size proxy, EB...

free

search_sponsor_deals

limit?, query?, since?, sponsor_dfx_id?, state?, target_dfx_id?, ...

Announced acquisitions, recapitalisations and exits by independent sponsors: sponsor, target, dates, enterprise value range where disclosed, structure, parties ...

free

search_pending_ownership_changes

changed_since?, limit?, query?, state?, tag?, view?

OFFICIAL state records that a skilled nursing facility's ownership, control or operator is changing, before the change takes effect (Kentucky, New York, Rhode I...

free

search_vc_firms

active_only?, city?, emerging_manager?, limit?, min_investments?, query?, ...

Venture firms as compact cards: stated sectors, stages, geography and check size beside OBSERVED behaviour (investments in the last 6 and 12 months, lead count,...

free

get_vc_firm

dfx_id

The full card for any entity on the venture graph: a firm (with recent investments, co-investors and funds), a person (with attributed investments and board sea...

free

search_vc_investments

company_dfx_id?, investor_dfx_id?, lead_only?, limit?, partner_dfx_id?, query?, ...

Investor-by-investor participations in rounds: investor, company, fund, the partner attributed (with attribution level), role (lead or participant), new or foll...

free

search_vc_funds

lifecycle_state?, limit?, max_vintage?, min_form_d_sold_usd?, min_vintage?, organization_dfx_id?, ...

Funds with every amount under its own name (target, first close, final close, announced size, Form D offering and sold, ADV gross asset value), vintage and basi...

free

search_pe_firms

class?, class_state?, cursor?, limit?, min_transactions_36m?, query?, ...

Private equity firms (management companies and advisers) as compact cards: the classifier's class with its state, confidence and basis; size band with the evide...

free

get_pe_firm

dfx_id

The full card for a private equity firm: identity (website, HQ, ADV filing dates), classification with basis and the size band's definition and evidence, classi...

free

search_pe_funds

adv_fund_type?, cursor?, lifecycle_state?, limit?, max_vintage?, min_adv_gav_usd?, ...

Funds on the private equity graph with every amount under its own name and beside its basis: target, first close, final close, announced size, Form D offering a...

free

get_pe_fund

dfx_id

One fund: manager, vintage and basis, every amount kept apart with its basis (adv_gross_asset_value is reported gross assets, not fund size or dry powder), the ...

free

search_pe_transactions

add_on_only?, control_status?, firm_dfx_id?, limit?, platform_dfx_id?, query?, ...

Acquisitions, add-ons, recapitalisations, carve-outs, secondary sales and exits on the private equity graph: type, status, announced and closed dates, target wi...

free

search_pe_platforms

limit?, min_add_ons_24m?, owner_dfx_id?, query?, sector?, sort?, ...

Companies that act as a platform (a sponsor's platform investment, or a company that has made add-ons): industry, add-on counts (total and last 24 months) and l...

free

find_pe_buyers_for_company

dfx_id, limit?

Computed buyer_for_company matches from the private equity matcher for one company (a dfx:pe:, dfx:isi: or dfx:vc: company id): each firm with the matcher's rea...

free

find_pe_companies_for_buyer

dfx_id, limit?

Computed company_for_buyer matches for one private equity firm (dfx:pe: id): each company (on the private equity, sponsor or venture graph, with its dfx id) wit...

free

find_pe_addons_for_platform

dfx_id, limit?

Computed addon_for_platform matches for one platform (a dfx:pe: company id from search_pe_platforms): each candidate company with the matcher's reasons, blocker...

free

search_ria

city?, cursor?, entity_type?, firm_class?, firm_crd?, fund_type?, ...

Registered investment advisers (Form ADV: RAUM, clients by type, employees, advisors on IAPD, private funds, class such as INDEPENDENT_WEALTH or WIREHOUSE), reg...

free

get_ria_firm

dfx_id

The full card for one registered investment adviser plus its people flows (joins, departures, net, rates over 90 days, 12 and 36 months), growth between annual ...

free

get_ria_advisor

dfx_id

One IAPD-registered advisor: name, current firm with class and tenure, employment history as dated registration spans in order (firm, begin, end, current), ever...

free

resolve_ria_advisor

crd?, firm?, firm_crd?, limit?, name, state?

Resolve an advisor by name AND a firm (name or CRD), or by individual CRD, to one person card

free

search_ria_funds

cursor?, firm_dfx_id?, form_d_file_number?, fund_type?, include_custodians?, limit?, ...

Private funds from Form ADV Schedule D 7.B.(1): fund name, SEC fund id (805-...), type, gross asset value with its as-of date (reported gross assets, NOT fund s...

free

search_ria_advisor_moves

advisor_dfx_id?, cursor?, from_dfx_id?, include_bulk?, include_departures?, limit?, ...

Advisors who left one firm and registered at another: the person, from and to firms with class, the registration end and begin dates, the gap, and the move type...

free

search_ria_teams

cursor?, from_dfx_id?, include_members?, kind?, limit?, min_members?, ...

Teams: clusters of advisors who left the same firm for the same firm from the same branch state within a 14-day chain, with member count, dates, spread, the fro...

free

search_ria_ma

acquirer_crd?, cursor?, firm_dfx_id?, kind?, limit?, min_advisors?, ...

RIA M&A from three factual sources, each labelled: successions the acquirer swore on Form ADV Item 4 (succession); firms whose advisors re-registered whole at o...

free

search_ria_changes

cursor?, dfx_id?, event_type?, limit?, signal_family?, since, ...

The RIA event tape by OBSERVATION time: advisor firm changes and departures, team lift-outs and absorptions, successions, RAUM and headcount changes, control pe...

free

get_ria_trends

firm_class?, limit?, min_advisors?, min_raum_usd?, sort?, state?, ...

Three derived views from the RIA lane's aggregates: state_stats (SEC-registered firms, wealth firms, RAUM, private funds, advisors, joins, departures and new fi...

free

get_ria_capital_links

dfx_id, limit?

For one RIA firm (or one private fund): every link to the private equity, venture, family office and sponsor graphs written on a shared identifier, with the bas...

free

get_ria_practice

dfx_id

What a practice looks like from what it filed: reported Form ADV fields (RAUM, discretionary, accounts, employees, advisors, clients and RAUM by type, private f...

free

search_ria_practices

archetype?, bank_owned?, cursor?, custody?, financial_planning?, firm_class?, ...

SEC-registered advisers screened on the practice layer: by archetype (HNW_WEALTH_MANAGER, UHNW_PRIVATE_WEALTH, MASS_AFFLUENT_RIA, INSTITUTIONAL_ASSET_MANAGER, R...

free

search_ria_anomalies

anomaly_type?, cursor?, family?, firm_class?, firm_crd?, limit?, ...

Reported values and filing-to-filing changes that stand out against a peer group (segment by RAUM band, 30 or more advisers), each with the metric, current and ...

free

search_ria_offices

cursor?, firm_class?, firm_crd?, limit?, min_advisors?, sort?, ...

Offices (a firm and an IAPD branch city) ranked by departures, joins, net flow, departure rate, team lift-outs out or in, breakaways in formation (advisors at t...

free

search_private_credit

bdc_advisers_only?, class?, cursor?, entity_type?, held_only?, industry?, ...

The capital structure graph behind private markets, built from every BDC's schedule of investments each quarter since 2022

free

get_credit_provider

dfx_id

A credit manager: its classes with basis, the BDCs it advises (from each BDC's own 10-K) with their latest schedules, its credit funds on Form ADV, its sponsor ...

free

get_bdc_portfolio

as_of?, cursor?, dfx_id, include_equity?, limit?, sort?

Every position a BDC tagged at one quarter end (the latest unless as_of is given), each in the filer's own figures: borrower, instrument, kind, lien, principal,...

free

get_borrower_capital_structure

dfx_id

The borrower group (its spellings and grade), every facility (kind, lien, principal held across lenders as a lower bound, mark, pricing, PIK, maturity with basi...

free

get_credit_facility

dfx_id

A facility (one borrower group in one instrument class): size as the sum of BDC pieces with its basis, pricing modal and ranged across pieces, maturity with bas...

free

search_credit_maturities

cursor?, from?, lien?, limit?, min_principal_usd?, months?, ...

Debt facilities still on a BDC schedule whose tagged or written maturity falls inside the window (default the next 24 months from today), ordered by date: borro...

free

search_sponsor_lender

cursor?, lender_dfx_id?, limit?, min_borrowers?, sort?, sponsor_dfx_id?

Sponsor x lender pairs counted once per borrower held (the lender is the adviser behind the BDCs, or the BDC where the adviser is not read): borrowers, faciliti...

free

search_private_credit_changes

by?, cursor?, dfx_id?, event_type?, include_routine?, limit?, ...

Dated changes by effective date (the quarter end where the change is visible) or by first-seen: new borrowers on any schedule, lenders joining and leaving facil...

free

search_allocators

allocator_class?, consultant_class?, cursor?, entity_type?, include_components?, limit?, ...

The capital-owner graph: public pensions (every Census unit), corporate and Taft-Hartley DB plans (Form 5500), endowments and foundations (IRS), state pools and...

free

get_allocator

dfx_id

For an allocator: the card with reported assets and basis, funded status, the latest allocation policy rows (target, range, actual as printed with the subject's...

free

search_allocator_commitments

allocator_dfx_id?, bucket?, consultant_dfx_id?, cursor?, first_time_only?, fund_dfx_id?, ...

One row per line of a plan's own disclosure: allocator, fund as printed, manager and fund resolved to the pe / vc graphs where the resolver matched, bucket, the...

free

search_re_fund_managers

crd?, cursor?, include_former?, limit?, max_gav_usd?, min_gav_usd?, ...

Advisers that swear a Real Estate Fund vehicle on Form ADV Schedule D 7.B.(1): one manager is one CRD, with its registration and latest filing, regulatory asset...

free

get_re_fund_manager

dfx_id

The manager card, its ten largest vehicles and the whole family by vintage, validated property bindings with the rule and confidence behind each and the propert...

free

search_re_fund_vehicles

cursor?, exclude_feeders?, first_reported_year?, include_dropped?, limit?, manager_crd?, ...

Vehicles sworn as Real Estate Funds by their SEC fund id (805-...): the fund and its family and sequence, master, feeder or fund of funds, gross asset value lat...

free

get_re_fund_vehicle

dfx_id

The vehicle card with its reporting history year by year as filed (gross asset value, owners, minimum investment, the fund type and name as filed that year), it...

free

get_re_fund_trends

limit?, min_gav_usd?, view?

Derived series over the sworn tape, each with its population, derivation and caveat printed beside it: vehicles first reported by year (with the managers filing...

free

get_capital_paths

dfx_id, kind?, limit?

Published capital flow paths through one institution: which allocators back this manager and through which fund, which lenders finance this sponsor's borrowers ...

free

get_commitments

dfx_id, include_holdings?, limit?

The commitment tapes, in one call, for any id they reference: the allocator tape (a public plan's own disclosure, with the plan, the fund as printed, the manage...

free

get_borrower_facilities

dfx_id, held_only?, limit?

Every facility a borrower group has on the BDC tape (kind, lien, principal held across lenders as a lower bound, mark on cost, pricing, PIK, maturity with its b...

free

get_sponsor_lenders

dfx_id, limit?, min_borrowers?, sort?

Sponsor by lender pairs counted once per borrower held: borrowers, facilities, principal held, first and latest quarter, new borrowers in the last four quarters...

free

search_capital_changes

dfx_id?, event_type?, graph, include_seeded?, limit?, since

The change tape for the three capital graphs by FIRST SIGHT: the day DFX first saw each row, which is the only order a poller can trust

free

search_entities

active_only?, asset_class?, city?, cursor?, domain?, entity_type?, ...

One search across family offices, independent sponsors and their capital providers, private companies, venture firms, private equity firms and funds, and real e...

free

resolve_name

domain?, entity_type?, limit?, name

Resolve a firm, fund, person or company name to canonical dfx ids from the Data Factory's index of every published name and alias (former names, dbas, legal nam...

free

get_entity

dfx_id, event_limit?, evidence_limit?, include?, relationship_limit?

For any DFX id: the full card, published relationships with sources and dates, recent events, evidence rows (the observation each fact traces to), cross-graph s...

free

search_people

cross_graph_only?, current_only?, domain?, investment_responsibility?, limit?, organization_dfx_id?, ...

Investment professionals, principals and family office staff as names with titles, roles, seniority, investment responsibility, organisation and tenure, from pu...

free

search_relationships

current_only?, dfx_id, limit?, rel_type?

Every published relationship touching one entity (EMPLOYS, PRINCIPAL_OF, INVESTED_IN, CO_INVESTED_WITH, MANAGES, OWNS, BOARD_MEMBER_OF, VEHICLE_OF, ...), each w...

free

relationship_path

from_dfx_id, max_hops?, to_dfx_id

An evidence-backed path between two DFX ids across every graph: each hop is a published relationship with its source, or a SAME_AS identity link by shared CRD/C...

free

search_events

dfx_id?, domain?, event_type?, exclude_routine?, limit?, min_significance?, ...

Dated events across family offices, sponsors, venture, private equity and real estate: investments announced, vehicles formed, Form D and ADV filings, people jo...

free

verify

claim?, object?, object_dfx_id?, predicate?, subject?, subject_dfx_id?, ...

SUPPORTED, PARTIALLY_SUPPORTED, CONTRADICTED or UNKNOWN for a claim, with the observations

free

find_capital_for_opportunity

asset_class?, check_size_usd?, control?, deal_size_usd?, dfx_id?, investor_types?, ...

Investors for a company (dfx_id) or a described opportunity (sector, state, deal size, stage, control): verified independent sponsors with observed acquisitions...

free

find_opportunities_for_capital

dfx_id, limit?

For a family office, sponsor, capital provider or venture firm: the opportunities DFX knows that fit its DEMONSTRATED behaviour: computed matches where the grap...

free

explain_match

dfx_id_a, dfx_id_b

For an investor and an opportunity (either order): MATCH REASONS, BLOCKERS, SUPPORTING OBSERVATIONS, COMPARABLE HISTORY (the investor's dated investments in the...

free

why_now

dfx_id, within_days?

Evidence-backed reasons an entity matters now: recent filings, vehicles formed, deployments, people moves, fundraising, transition signals, loan maturities, eac...

free

who_should_care

dfx_id?, event_id?, limit?

Given an entity or an event id: who is likely to care and why

free

Start with what_can_dfx_answer if you do not know what to ask for. It says no clearly when the answer is no, and it records the ask, so questions DFX cannot answer shape what gets built next.


Beyond real estate: family offices, independent sponsors, venture capital

The same connection answers across three more DFX graphs, with one id scheme (dfx:fo:, dfx:isi:, dfx:vc:, and the real estate ids above), one response contract, and cross-graph identity by shared CRD, CIK or EIN only. A same-name entity on another graph is returned as a candidate, never merged.

Family offices. 2,335 offices on the graph (849 candidates, 125 confirmed multi-family, 344 probable single-family, 118 outsourced), 4,236 foundations, 637 offices with 13F positions, 251 with observed direct investments. A candidate is a name, never a class; AUM, RAUM and 13F value are three numbers and are never substituted for one another.

Independent sponsors. 3,930 sponsors, 9,851 capital providers, 97,287 private companies with Department of Labor plan-filing history of which 15,015 carry a transition signal, 28,055 computed company-to-sponsor matches with reasons and blockers, 1,279 announced transactions. A plan-filing signal is one year lagged.

Venture capital. None firms (None with a fund raising in the last 18 months), 71,074 funds with every fund amount kept apart (52,341 with Form D sold), 108,223 people, 44,301 companies and 23,235 rounds. Stated sectors are populated on None firms today, so a sector filter on firms answers NOT_COVERED rather than an empty list; a round is never a check.

Across all of them: search_entities, get_entity (everything on one id: card, relationships, events, evidence, cross-graph links), search_people, search_relationships, relationship_path (how X connects to Y, every hop an evidenced edge), search_events, verify (SUPPORTED, PARTIALLY_SUPPORTED, CONTRADICTED or UNKNOWN, with the observations), and the economic tools find_capital_for_opportunity, find_opportunities_for_capital, explain_match (reasons and blockers, never a bare score), why_now and who_should_care.

Contact points are withheld over MCP on every graph. Call what_can_dfx_answer with domain set to any of family_office, independent_sponsor, venture_capital or real_estate for that domain's entity types, event families, rights, freshness and limitations.


What is actually in here (real estate)

Two populations that barely overlap, and conflating them is the most common way to misread this server.

Object

What it is

Resolvable

parcel

Massachusetts. The municipal assessor and registry layer, carrying assessed value, land use and recorded sales.

291,914

property

National. Federal programme multifamily: HUD, LIHTC and FHA.

102,351

organization

Owners, managers, lenders and servicers.

not counted separately

An address may return one, the other, or both.

Recorded sales

Massachusetts and New York: 95,562 instruments over 118,733 property links.

Tape

Geography

Grain

Buyer

Seller

Repeat sales

municipal recorder extract

New York City, five boroughs

recorded instrument, grouped into economic transactions

yes

yes

yes

statewide assessor roster

Massachusetts, statewide

assessor roster: one sale date and price per parcel

yes

no

no

  • municipal recorder extract: deeds at or above $10,000,000 consideration. This is a deliberate cut by VALUE and not by date: a date cut would orphan the earlier leg of a repeat-sale pair. A smaller New York sale is outside the tranche, not absent from the city.

  • municipal recorder extract: Fourteen same-day deeds between the same parties are ONE transaction with fourteen instrument ids preserved, and a 318-property deed is one transaction linked to 318 properties. Consideration is stated once per instrument and is never split across its properties. No natural person is named in an event headline, on either side.

  • statewide assessor roster: An assessor roster carries the LAST sale, so repeat-sale pairs and hold periods are not derivable from it at any volume. A deed repeats its full consideration on every parcel it covers, so allocated_consideration is carried separately from consideration and allocation_basis says when a split is ours.

Event coverage, measured

83,443 publishable events across 16 types, written by 9 sources on a published allowlist of 9.

Event type

States

Published

PROPERTY_SOLD

2

43,680

COMPLIANCE_PERIOD_ENDING

56

11,956

SUBSIDY_CONTRACT_EXPIRING

54

4,721

PERMIT_ISSUED

1

4,203

LEASE_EXPIRING

55

3,966

PORTFOLIO_EXPANDED

53

3,528

LOAN_MATURITY_SCHEDULED

52

3,395

PORTFOLIO_CONTRACTED

54

3,181

CERTIFICATE_OF_OCCUPANCY

1

2,768

DEMOLITION_FILED

1

881

USE_CONVERSION_PERMITTED

1

849

DISTRESS_FLAG_RAISED

26

163

FORECLOSURE_EVENT

21

123

PERMIT_STATUS_CHANGED

0

13

LOAN_MODIFIED

5

12

BANKRUPTCY_EVENT

4

4

CERTIFICATE_OF_OCCUPANCY, DEMOLITION_FILED, PERMIT_ISSUED, USE_CONVERSION_PERMITTED are Massachusetts only. COMPLIANCE_PERIOD_ENDING, LEASE_EXPIRING, LOAN_MATURITY_SCHEDULED, PORTFOLIO_CONTRACTED, PORTFOLIO_EXPANDED, SUBSIDY_CONTRACT_EXPIRING are national. Multi-state, with the number of states each reaches: DISTRESS_FLAG_RAISED (26), FORECLOSURE_EVENT (21), LOAN_MODIFIED (5), BANKRUPTCY_EVENT (4), PROPERTY_SOLD (2). PERMIT_STATUS_CHANGED carries rows that resolve to no state at all, so a state filter cannot reach it.


The loan tape: debt_maturity_schedule

Free, like everything else on this server. For one US state and one forward window, up to 200 loans per call, one row per loan, ordered by maturity date:

  • maturity_date and maturity_basis

  • original_principal_usd, current_principal_usd, interest_rate_pct, origination_date, term_months

  • instrument_type

  • the lender's canonical name and DFX id where resolved

  • the secured property: DFX id, street address, city, state, postal code, unit count, property type

  • the source_key for that row

Why the dates can be trusted. 19,821 loans carry a maturity date and 19,821 of 19,821 carry maturity_basis = 'confirmed'. Not one is estimated, inferred from a term length, or carried forward from a stale reading. Every date was filed with the SEC by a loan servicer or recorded by HUD, and then resolved to a specific building.

search_property_events returns the event: a date, a headline, an address. The loan tape returns the loan: the principal, the lender, the instrument, deduplicated to one row per loan, up to 200 rows instead of 50, with the population stated so you can tell a complete answer from a truncated one. The two populations are different sizes on purpose and both numbers are true: an event has to be promoted to a single place, a loan only has to be filed, so the 19,821 loans on the tape are reached here while 3,395 maturity events are reachable through the event search.

How the loans spread. Of the 19,821 loans, 1,765 mature inside the default 548-day window, and they are not evenly spread. Measured 2026-09-19:

State

Loans maturing in the next 548 days

CA

327

NY

196

TX

119

FL

99

OH

66

GA

60

MI

56

PA

55

IL

53

NJ

50

NV

39

VA

39

WA

33

IN

31

NC

30

AZ

28

CO

28

LA

24

MD

21

SC

20

28 further states hold between 1 and 19 loans in that window; Montana, Nebraska and Wyoming hold 1. Widen within_days to reach further out; each call returns up to 200 loans.

164 of those 1,765 carry no single state: a loan secured by several buildings has no property anchor, so a state filter cannot reach it. Those are reached through get_property_record.

What it does not cover, stated plainly. These are the gaps the server itself reports through dfx_coverage, reprinted here so you do not have to call it to find them:

  • Loan maturity coverage is federal programme lending only (FHA insured and agency backed). The Registries of Deeds are closed to automation, so conventionally financed property carries no debt record here. A property absent from a maturity search is NOT a property without debt.

  • LIHTC compliance periods are statutory and every one falls on 31 December, so a count bucketed by day shows a December cliff that is an artefact of the statute rather than a market event.

  • Permit and demolition coverage is the City of Boston only.

  • No outcome has ever been observed for any prediction in this graph. Nothing served here carries a calibrated probability; every score is a ranked signal.

  • One street address can carry several records. Measured across 6,114 such clusters: 2,764 agree on unit count and are plausibly one asset registered by more than one programme, while 3,350 report DIFFERENT unit counts and are probably genuinely different buildings at one address, such as a scattered-site development. DFX has merged none of them and resolve() says which case you are looking at rather than choosing.

  • Property and parcel are separate populations that barely overlap: 661 clean one-to-one pairs out of roughly 100,000 each. An address may resolve to one, the other, or both, and they are returned as distinct typed objects rather than merged.

  • PROPERTY RECORDS ARE NOT ONE ROW PER BUILDING. 101,991 published property records cover 94,859 distinct normalised addresses, so a total computed across them overstates by roughly 8%. 245 Park Avenue is one tower and thirteen records, because thirteen securitisation trusts each report it. Every row is individually true, which is why the distortion is invisible per row. Each record carries address_group_size so you can see it: 1 is unique, and above 1 you should deduplicate by address before summing anything. DFX has not merged them because thousands of these clusters carry different unit counts and are genuinely different buildings at one address rather than one building recorded twice.

  • The sale tape is two sources with different grain, and the difference decides which questions it can answer. MASSACHUSETTS is an assessor roster: statewide, one sale per parcel, buyer named and SELLER NEVER NAMED, so repeat-sale pairs and hold periods are not derivable from it at any volume and no further ingestion of it will change that. NEW YORK is a recorder extract: five boroughs, both parties named, every instrument dated, so repeat sales and hold periods ARE derivable, but only for deeds at or above $10,000,000. Neither one is a national sale tape and DFX does not have one.


Connect it

Any MCP client that speaks Streamable HTTP. No credentials.

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

Claude Code:

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

Both the current protocol revision and the older initialize handshake are served, because most deployed clients still send the latter.

If your client only speaks stdio

Some clients launch a subprocess and speak JSON-RPC over its pipes; they have no way to reach a URL at all. bridge/dfx_mcp_stdio.py is the whole adapter for those: one file, standard library only, no key, no state. It forwards each message to the endpoint above and writes the answer back.

{
  "mcpServers": {
    "dfx-real-estate": {
      "command": "python3",
      "args": ["/path/to/us-property-parcel-real-estate-debt/bridge/dfx_mcp_stdio.py"]
    }
  }
}

Use an absolute path. An MCP client launches the command from its own working directory, not yours, so a relative one will not find the file.

Use the URL directly if your client can. The bridge adds a process and a hop and buys nothing when Streamable HTTP is available. It reads the tool list from the live server on every tools/list, so an installed copy does not go stale when DFX publishes a new event family; there is nothing in it that knows what a family is.


Questions this server is good at

  • Which commercial mortgages in this state mature in the next 548 days, who lent, and against which building?

  • 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.)

  • Which LIHTC compliance periods and HUD subsidy contracts are expiring, and where?

  • What did this parcel last sell for, to whom, and under which book and page?

  • Who owns, manages or lends against this building?

Three recipes, as an agent calls them

Each is one tool call, the arguments verbatim, and what came back when this page was generated. Paste the call; the numbers are the wire's, not this page's.

Where is the queue? Subsidised projects in Ohio with a waiting list of 24 months or more, deepest first.

{"tool": "search_subsidised_housing", "arguments": {"state": "OH", "min_waiting_months": 24, "limit": 10}}

Returns matched: 69 and ten rows, the longest at 85 months, each with units available, occupancy, rent, household income and what HUD pays per unit, and waiting_list_coverage saying how many projects in the state report a list at all. One annual capture (29,455 projects nationally), stated on every row. A NULL waiting list is an absent disclosure, never an empty queue.

Which banks are past the CRE guidance line? FDIC-insured banks in Ohio whose total CRE exceeds 300% of equity, most concentrated first.

{"tool": "search_bank_cre_exposure", "arguments": {"state": "OH", "above_guidance": true, "limit": 10}}

Returns matched: 8 with each bank's CRE book against equity and assets, noncurrent and charge-off ratios and its UBPR peer and national percentile ranks. 626 of 4,313 banks nationally are over that line on this measure. The guidance tests total risk based capital and these ratios are on equity, so the row says "screen", not "finding".

What matures, and against which building? Securitised and FHA-insured loans on Texas property maturing inside a year, soonest first.

{"tool": "search_property_events", "arguments": {"event_type": "LOAN_MATURITY_SCHEDULED", "state": "TX", "within_days": 365, "limit": 50}}

Returns 75 events (page with next_cursor), each with the building's dfx_id. Then, for any row, get_property_record with that id returns the loan itself free: current principal, interest rate, original principal, maturity and basis. debt_maturity_schedule is the same population as one deduplicated statewide list with the lender name and a completeness figure.

One page per question, with the measured coverage on it

Questions it is not good at, and will say so

  • Anything about a person. Person lookup is deliberately not offered.

  • Assessor and parcel data outside Massachusetts.

  • Debt on conventionally financed property.

  • Anything outside the United States.


Design notes an agent developer may care about

  • 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.

  • 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.

  • A name is a blocking key, never an identity. resolve_organization returns all candidates rather than guessing one.

  • Every returned fact carries its provenance: the source, the evidence class, and for sales the registry book and page.

  • Coverage is a tool, not a footnote. Call dfx_coverage before concluding that an empty result means an absent market.

What is behind the rows

9 registered feeds pass the rights filter and serve this endpoint, in 4 families:

  • Federal program and statistical data (4): Federal programme registers and statistical series: who is funded, insured, assisted or measured.

  • County and municipal records (3): The property layer: assessment, recorded instruments, permits, code enforcement and tax status.

  • Federal regulator filings (1): What firms, funds and plans are required to tell a federal regulator, on the regulator's own schedule.

  • Securitised debt reporting (1): Loan-level and servicer reporting on debt that has been securitised, month by month.

Every returned row names its own source, the date it was effective and the date DFX read it. Which individual feeds sit inside a family is not published.

Terms

The example code in examples/ is MIT licensed. The data served by the endpoint is not: it is derived from public federal and municipal sources under DFX's own processing, and is served for use, not for redistribution as a dataset. Ask if you want something broader; the answer is often yes.

Operated by DFX Intelligence. Developer reference: https://dfxintel.com/ai/real-estate-mcp

Available Tools

12 tools
changes_sinceWhat DFX has learned since your last callA
Read-onlyIdempotent
Inspect

Poll for what is NEW to you, ordered by when DFX learned it rather than by when it happened. TWO CALLS ARE REQUIRED BEFORE YOU SEE ANYTHING: the first, with no cursor, deliberately returns ZERO events and a starting position; the second, with that cursor, returns what DFX learned in between. If you want rows now rather than a subscription, call search_property_events instead. Filter by event type, state, or a specific property or parcel id. Deterministic and indexed, so it is cheap to call often. Free. HISTORICAL FAMILIES DO FLOW THROUGH HERE. within_days on search_property_events cannot reach the past, but this tool is ordered by when DFX LEARNED a fact, not when the fact happened, so a foreclosure that occurred months ago and was ingested today arrives in today's delta. A distress or sales feed built on this works.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax 50. A full page sets `complete: false` in the envelope, which means the backlog was longer than one call: go again immediately with the returned cursor rather than waiting for your next poll interval. The cursor is the last row on the page, never the present moment, so nothing is skipped by doing so.
sinceNoOpaque cursor from a previous call. Omit on the first call to establish a position; that call returns no events by design.
stateNoTwo letter state code
event_typeNoOne family. Same vocabulary as search_property_events.
place_dfx_idNoWatch one property or parcel

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/non-destructive annotations, the description discloses key behavioral traits: the ordering by 'when DFX LEARNED a fact' vs. when it happened, the deterministic and indexed nature ('cheap to call often'), the first-call returning zero events by design, and the cursor semantics with the 'complete: false' envelope. It also states that it is 'Free' and explains the historical-family flow explicitly. This goes well beyond the annotations and fully informs an agent of the tool's runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: the first paragraph delivers the core purpose, protocol, alternative, filters, and performance characteristics; the second paragraph addresses the important historical-family edge case. Every sentence carries needed information without fluff. The use of capitalization and explicit warnings (e.g., 'TWO CALLS ARE REQUIRED') make critical points stand out despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's polling/cursor-based nature and the absence of an output schema, the description is remarkably complete. It explains the two-call flow, the cursor's meaning, the envelope's 'complete: false' flag, the filtering options (event_type, state, place_dfx_id), the relationship to search_property_events, and the historical-family coverage. It even clarifies that the event_type vocabulary matches search_property_events. This provides all necessary context for correct invocation and interpretation of responses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already has detailed descriptions for all 5 parameters (100% coverage), so the baseline is 3. The description adds extra meaning by explaining the two-call protocol in plain language and clarifying the limit parameter's effect on the envelope and cursor handling ('A full page sets complete: false... go again immediately with the returned cursor'). This supplements the schema descriptions meaningfully, justifying a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool's purpose with precision: 'Poll for what is NEW to you, ordered by when DFX learned it rather than by when it happened.' It also clearly distinguishes it from the sibling tool search_property_events by noting the alternative for immediate rows. The first paragraph explicitly establishes the core behavior and the two-call protocol, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives direct usage guidance by specifying when to use this tool versus the alternative: 'If you want rows now rather than a subscription, call search_property_events instead.' It also explains the required two-call sequence ('TWO CALLS ARE REQUIRED BEFORE YOU SEE ANYTHING') and highlights the historical-family advantage: 'within_days on search_property_events cannot reach the past... a foreclosure that occurred months ago and was ingested today arrives in today's delta.' This is explicit, actionable guidance for an agent deciding between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

debt_maturity_schedulePAID, $1.00: confirmed commercial mortgage maturities for one stateA
Read-onlyIdempotent
Inspect

PAID: $1.00 USD per delivered schedule. This is the ONLY priced tool on this server. The other eleven are free, keyless and permanently so. Returns the LOAN rather than the event: for one US state and one forward window, up to 200 loans with maturity date, original principal, lender name, instrument type, origination date and the secured property's address, deduplicated to one row per loan and ordered by maturity. Every maturity_basis is 'confirmed': 19,881 of 19,881 loans carry a date filed with the SEC by a servicer or recorded by HUD, and none is estimated or inferred from a term length. HOW TO GET A PRICE, FREE: call this tool with no authorize argument and no credential. You are not charged and not refused. You receive a real quote for your exact arguments, the price, every field that would arrive, the known limits, and the number of rows your dollar would actually buy, so a filter that would deliver one row is visible before you spend anything. HOW TO ACTUALLY BE CHARGED: resend the identical call with authorize and an X-DFX-Account header holding a funded account key. THIS IS THE ONLY THING ON THIS SERVER THAT NEEDS A CREDENTIAL, and it is the reason the handshake's 'no signup' is about the free tier and not about this tool. To get one, call open_dfx_account on this same server; no human step is needed to open it, and a balance must be funded before it can spend. Everything else here, including the quote itself, needs no account at all. FREE ALTERNATIVE, AND IT IS A REAL ONE: search_property_events with event_type=LOAN_MATURITY_SCHEDULED returns up to 50 maturity EVENTS for the same state, dated and sourced, with no principal, no lender and no instrument. It is also a smaller population: an event has to be resolved to a single building, so a loan secured by several is in the paid tape and not in the free index. Use the free tool for timing, this one for a refinancing conversation.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum loans, up to 200. The price does not change with the row count.
stateYesTwo letter state code. Required: the schedule is priced per state.
authorizeNoOmit to be quoted. Supply to be charged and served in one response.
within_daysNoForward window from today. Default 548, eighteen months.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses the payment/credential requirement as the only priced tool on the server, explains that quoting never charges, that the max_price_usd ceiling is checked before charging ('refused rather than charged'), and that the identical call is resubmitted for the paid path, reinforcing the idempotentHint. The readOnlyHint and destructiveHint are not contradicted; the description actually strengthens them by describing a read-only, non-destructive return with no mutation of domain data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well sectioned by topic (returns, data quality, quoting, charging, free alternative) and every section carries distinct meaning, but it is bloated with repeated all-caps emphasis (the paid/credential point is hammered across multiple sentences: 'ONLY priced tool', 'ONLY THING THAT NEEDS A CREDENTIAL', 'the handshake's no signup is about the free tier', 'Everything else here needs no account at all'). It is informative but not tight; roughly a third of the words re-drive the same paid-vs-free distinction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and the presence of a nested authorize object plus a payment flow, the description fills the gaps: it enumerates the returned fields, explains the quote-to-authorization transition, states the data-population guarantee (19,881 confirmed loans, none estimated), and covers credential acquisition and the free fallback. Error handling and exact response shape are not specified, but the essential context for a correct call is fully provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for all four parameters and the nested authorize object, so the baseline is already high. The description adds marginal value on top, reinforcing that state drives pricing ('priced per state'), that limit does not affect price, and that authorize toggles quote vs. paid execution — but most of this is already stated in the schema descriptions, so the added semantic load is small.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the verb ('Returns'), the resource (LOANs, explicitly contrasted with events), the exact scope (one US state, one forward window, up to 200 loans), and the precise field list (maturity date, original principal, lender, instrument, origination date, property address). It also names the sibling tool it is not (search_property_events for events), so an agent can disambiguate without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit two-mode usage flow: omit authorize for a free quote, resend with authorize plus X-DFX-Account to be charged and served. It names the exact free alternative (search_property_events with event_type=LOAN_MATURITY_SCHEDULED) and gives the decision rule ('Use the free tool for timing, this one for a refinancing conversation'), plus the population difference driving that choice. It also clarifies who needs a credential (only this tool) and how to get one (open_dfx_account), so nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dfx_coverageWhat DFX actually covers, and what it does notA
Read-onlyIdempotent
Inspect

Measured coverage, served sources, object types and the known gaps stated plainly, including where geography is a single state and where nothing carries a calibrated probability. Call this before concluding that an empty result means an absent market. Call it with NO arguments for the full grid: every event family, every state, measured. Call it with state and/or event_type for a direct verdict on that one slice (COVERED, NOT_COVERED or UNKNOWN) with the basis it was decided on, which is one small answer instead of a grid to parse. Free, and it queries no data: the verdict comes from a coverage registry, so a NOT_COVERED is measured rather than inferred from an empty search.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTwo letter state code. Optional: narrows the answer to this state.
event_typeNoOptional: narrows the answer to this family. Same vocabulary as search_property_events.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and idempotent, and description adds that it queries no data and is free, plus explains NOT_COVERED is measured not inferred. This goes beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose with redundant phrases like 'stated plainly' and 'measured rather than inferred', and the structure repeats information about the two modes. It could be half the length without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the two output modes (full grid vs direct verdict) and the meaning of NOT_COVERED, providing sufficient context for correct usage. Could benefit from an explicit output structure, but overall it is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters have clear schema descriptions ('Two letter state code', 'Same vocabulary as search_property_events'), and the tool description explains how they narrow the result. The enum is fully documented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports coverage ('Measured coverage, served sources, object types and the known gaps') and differentiates from search tools by clarifying it checks a coverage registry. However, the phrasing is ornate and could be more direct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call before concluding absence ('Call this before concluding that an empty result means an absent market') and provides two calling modes: no args for full grid, with args for direct verdict. This gives unambiguous guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dfx_payment_statusHas DFX actually been paid for this quote?A
Read-onlyIdempotent
Inspect

Reads the DFX payment ledger for one quote. Free. It is the ONLY trustworthy answer to 'did my payment go through'. A browser redirect, a Stripe success page and a client's own belief are all not receipts. This reads DFX rows, which advance only on a Stripe event DFX verified against Stripe's signature and then re-read from api.stripe.com. AWAITING_PAYMENT means keep polling. PAID means your balance is funded and you may now repeat the paid call with authorize.

ParametersJSON Schema
NameRequiredDescriptionDefault
quote_idYesfrom the PAYMENT_REQUIRED reply, the same id you passed to fund_dfx_account
account_keyNoyour DFX account key, if your MCP client cannot send the X-DFX-Account header

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description reinforces this with 'Reads' and 'Free'. It adds valuable behavioral context by explaining that payment advancement only occurs after DFX verifies a Stripe event and re-reads from api.stripe.com, giving the agent a clearer mental model of the underlying process.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and immediately gives actionable status semantics. Some phrasing is more rhetorical than strictly necessary, such as the examples of non-trustworthy payment signals, but those examples earn their place by preventing common misuse. Overall it is focused and not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description compensates by explaining the two key statuses, AWAITING_PAYMENT and PAID, and their required follow-up actions. It also explains the trust model and the role of Stripe verification, which gives the agent enough context to use the tool correctly without needing additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions fully cover both parameters, and the description adds useful provenance for quote_id by tying it to the PAYMENT_REQUIRED reply and prior fund_dfx_account call. The account_key description also clarifies the conditional fallback when the X-DFX-Account header cannot be sent, which goes beyond a basic label.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: reading the DFX payment ledger for a single quote. It also strongly differentiates this tool from related payment actions by calling it the 'ONLY trustworthy answer' to payment-status questions, which distinguishes it from sibling tools like fund_dfx_account and open_dfx_account.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use the tool and how to interpret its results: use it to confirm whether a payment went through, keep polling on AWAITING_PAYMENT, and proceed with the paid call when status is PAID. It also explicitly warns against relying on browser redirects, Stripe success pages, or client belief as substitutes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fund_dfx_accountOpen a Stripe payment for one quote and get the payment URLAInspect

Opens a Stripe payment for exactly one quote, into the account key you present, and returns the hosted payment URL and a payment id. THE AMOUNT IS READ FROM THE QUOTE, SERVER SIDE. There is no field on this tool through which a price can be proposed, raised or lowered. A CARD MUST STILL BE AUTHORIZED. That is the card network's boundary and not a DFX design choice: show the URL and the price to your human, or present your own payment credential to Stripe. Everything either side of that step is callable by a machine. Returning to the success page is NOT a receipt. Poll dfx_payment_status until it reports PAID; that reads the DFX ledger, which advances only on a Stripe event DFX verified and re-read from Stripe. This build collects Stripe TEST payments only. No real money moves.

ParametersJSON Schema
NameRequiredDescriptionDefault
quote_idYesfrom the PAYMENT_REQUIRED reply
account_keyNoyour DFX account key, if your MCP client cannot send the X-DFX-Account header

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses the side effect of opening a payment, warns that the amount is read server-side and cannot be changed, and clarifies that card authorization and payment completion are separate steps. The annotations already indicate non-readOnly and non-idempotent behavior, and the description adds useful caveats without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat lengthy with all-caps warnings, but each block conveys a distinct operational caveat. It remains focused and does not include irrelevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description adequately names the return values (hosted payment URL and payment ID), explains the follow-up step (poll dfx_payment_status), and notes that this build only handles Stripe TEST payments. This is enough for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers both parameters, and the description adds meaning by explaining quote_id's source and account_key's fallback purpose. This goes beyond simple type descriptions, though it does not need to elaborate further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool opens a Stripe payment for exactly one quote, using the provided account key, and returns a hosted payment URL and payment ID. This distinguishes it from sibling tools like dfx_payment_status and open_dfx_account.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context for when to use it: quote_id comes from a PAYMENT_REQUIRED reply, and account_key is only needed if the MCP client cannot send the X-DFX-Account header. It also points to dfx_payment_status for polling, though it does not spell out every when-not scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_property_recordEverything DFX holds about one property or parcelA
Read-onlyIdempotent
Inspect

Given a DFX id from resolve_address, return current state, dated events, ownership and management relationships, debt with maturity dates and maturity basis, recorded sales with consideration plus registry book and page, and the provenance of each. Sales carry BOTH the instrument total and this parcel's allocated share, because a deed repeats its full price on every parcel it covers. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
dfx_idYesid returned by resolve_address

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds a behavioral/data nuance: sales carry BOTH the instrument total and the parcel's allocated share because a deed repeats its full price on every parcel. This transparency about how output is computed goes beyond the annotations, though it does not mention side effects (which are already covered).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence followed by a clarifying sentence. It packs a lot of information (list of data components) without excessive verbosity. The structure is logical: first the main action and data items, then a specific nuance about sales consideration. No redundant words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description serves as the sole explanation of the return data. It enumerates all major components: current state, dated events, relationships, debt details, sales records with registry info, and provenance. It also explains the sales allocation nuance. This is sufficient for an agent to know what to expect from the tool in a single-property context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'dfx_id' has a clear description: 'id returned by resolve_address'. This explicitly tells the agent where to obtain the value, covering 100% of schema parameters. Since there is only one parameter and no enums or nested objects, the semantics are fully specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: given a DFX id from resolve_address, it returns a comprehensive record including current state, dated events, ownership/management relationships, debt details, recorded sales with consideration and registry book/page, and provenance. The title 'Everything DFX holds about one property or parcel' reinforces the singular comprehensive nature. It does not explicitly name sibling alternatives, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a usage prerequisite: the DFX id must come from resolve_address. It also states 'Free.' at the end, indicating no cost. While it does not explicitly contrast with siblings like search_property_events, the title and 'Given a DFX id' imply this is the tool for a single property's full record. The clarification about sales allocation also guides interpretation of output, which is part of usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_dfx_accountOpen your own DFX economic account. Free, instant, no human.AInspect

Creates an economic identity you control, with NO money in it. Free. No human approval, no email, no contract, no sales call. It returns an account key ONCE. DFX stores only its digest and can never show it to you again, so store it before your next call. THE ACCOUNT STARTS AT $0.00 AND CANNOT BUY ANYTHING. DFX mints identity and never credit: a balance moves only when Stripe confirms a payment and DFX re-reads that payment from Stripe. There is no argument anywhere on this server through which you can propose a balance. Call this only if you intend to buy a paid capability. Every discovery, coverage, resolution, property record and event search tool on this server is free, unauthenticated and does not need an account, permanently.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoA short name for this account, for your own reference on receipts. Optional.
quote_idNoIf you already hold a quote, pass it and the reply will name the exact funding call for it.
principalNoWho is behind this agent: the party whose money is being spent. Optional, stored as a CLAIM and never verified. It is not your software's name: 'Claude Desktop' is a client, not a principal.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important side effects: the key is returned once, only its digest is stored, it cannot be shown again, and the account starts at zero. It also clarifies that balance changes only occur through Stripe-confirmed payments, aligning with the readOnlyHint=false annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat repetitive with capitalized emphasis (e.g., 'NO money' and 'STARTS AT $0.00'), but each sentence adds meaningful operational detail. It could be tightened without losing crucial warnings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers core behavior, side effects, and usage conditions well despite the lack of an output schema. It does not specify exact output format or error scenarios, but it gives enough context for an agent to use the tool safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are described with added nuance beyond the schema. In particular, principal is clarified as a claim that is never verified and distinguished from the client software name, which prevents a common misuse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates an economic identity/account and explicitly notes it starts with no money. It distinguishes itself from sibling tools by emphasizing that free discovery tools do not need an account.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: call only if intending to buy a paid capability, and states that all free tools work without an account. It also explains how quote_id affects the reply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_addressResolve a US street address to a property or parcelA
Read-onlyIdempotent
Inspect

Turn a street address into canonical DFX object ids, with the match basis and any ambiguity stated. Returns typed objects: a 'property' (national federal programme multifamily) and/or a 'parcel' (Massachusetts assessor and registry layer). These are separate populations that barely overlap, so an address may return one, the other, or both. Free. Start here, then call get_property_record with an id.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity or town, for example 'Cambridge'. Optional: a one-line address carrying its own city and state is split here, so pass the whole line rather than splitting it yourself. Given explicitly it wins over anything parsed out of `address`.
limitNoMax 50. This is candidates for ONE address, not a page of a search. Raise it only when `address_group_size` on a result says several published records share the address.
stateNoTwo letter state code
addressYesStreet address including the house number, for example '100 Binney St'

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds functional context by noting it is 'Free' and by explaining that the response includes typed objects ('property' and/or 'parcel') and states the match basis and ambiguity. This enriches the behavioral understanding beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively brief yet packs essential information: the primary action, return types, overlap caveat, cost, and a forward pointer. No redundant sentences; each clause adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Lacking an output schema, the description adequately conveys the high-level response structure (canonical ids, typed objects, match basis) but does not detail the exact fields or shape of the result. Still, it provides enough context for an agent to understand what to expect and how to proceed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All four parameters have meaningful descriptions that go beyond basic type information. The city description clarifies precedence over parsed values, the limit description explains when to raise it (based on address_group_size), and the address description includes a concrete example. This exceeds the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: converting a street address into canonical DFX object ids, specifying the match basis and ambiguity handling. It differentiates from siblings by noting it returns both 'property' and 'parcel' types and by explicitly directing to 'get_property_record' next.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides usage context: 'Start here' signals the intended entry point for address-based queries, and the limit parameter description gives conditional guidance on when to increase it. However, it does not explicitly contrast with sibling tools like resolve_organization or search_parcels, which would make the 'when not to use' clearer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_organizationResolve a company name to a DFX entityA
Read-onlyIdempotent
Inspect

Turn an owner, manager, lender or servicer name into canonical DFX entity ids. A name is treated as a blocking key and never as an identity, so all candidates are returned rather than a guess. Free. Person lookup is deliberately not offered.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCompany name as written anywhere: owner, manager, lender or servicer, for example 'KeyBank'. It is matched as a blocking key, so a partial or differently punctuated name is expected to return several candidates and picking between them is yours to do.
limitNoMax 50. Every candidate is returned rather than a best guess, so a common name spends this whole budget.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnly, idempotent, and non-destructive hints. The description adds context about the blocking-key behavior and that it returns all candidates, which aligns with the annotations without contradiction. It doesn't mention side effects (none expected) but adequately supplements the annotation details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, using two sentences to convey the core purpose and key behavioral nuances. There is no redundant information or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description mentions that the output is canonical DFX entity IDs and that candidates are returned, which implies a list structure. However, it does not explicitly state the exact return schema (e.g., array of objects) or error handling, leaving some ambiguity. Given the absence of an output schema, this is a minor gap but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions for 'name' and 'limit' are thorough, explaining that 'name' accepts partial or differently punctuated company names and that 'limit' caps results at 50. The parameter semantics are fully covered and well-aligned with the tool's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: resolving a company name to canonical DFX entity IDs. It also specifies the input type (owner, manager, lender, servicer name) and the nature of the output (candidates, not a single guess).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (when a name needs to be resolved to IDs) and when not to (person lookup is deliberately not offered). It also clarifies the behavior of returning multiple candidates rather than a single guess, guiding the agent's expectations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_parcelsFind parcels by place, use, tenure, vintage and assessed valueA
Read-onlyIdempotent
Inspect

Search the assessor parcel layer with filters instead of one exact address. Filter by state, municipality, assessor land use code, owner-occupancy, tax-exempt status, year built and assessed value range; results carry assessed value, gross building area, assessed value per square foot, the annual tax and the year built. This is the only way to ask a QUESTION of the parcel layer: resolve_address needs an address you already have. Every answer states the true match count alongside the sample, and a search that matches nothing names the filter that emptied it rather than returning a bare empty list. At least one filter is required. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax 50. This sizes the SAMPLE only: every answer states the true match count beside it, so a small limit never hides how big the result really is.
stateNoTwo letter state code
land_useNoAssessor land use code, for example 'R3' for a three family dwelling
tax_exemptNotrue for the institutional universe (churches, universities, authorities), false for the taxable one
built_afterNoExclusive lower bound on year built
built_beforeNoExclusive upper bound on year built
max_assessedNoMaximum assessed total, in dollars
min_assessedNoMinimum assessed total, in dollars
municipalityNoCity or town, for example 'Boston'
owner_occupiedNotrue for owner-occupied, false for investor or institutionally held. Parcels whose roll does not state it are excluded either way.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description adds key behavioral details: every answer includes the true match count alongside the sample, and a match-nothing search names the filter that emptied it. It also lists the output fields (assessed value, gross building area, etc.).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat verbose and redundant, e.g., 'instead of one exact address' and later 'resolve_address needs an address you already have' convey the same idea. The trailing 'Free.' adds noise. It could be more concise while retaining the key points.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 10 parameters and no output schema, the description covers essential context: it states that results carry specific fields, explains the sample/true-match-count behavior, and notes the empty-result behavior. Missing details like pagination or output structure are not critical given the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides per-parameter descriptions at 100% coverage. The tool description summarizes the filter types (state, municipality, land use, owner-occupancy, tax-exempt, year built, assessed value) but does not significantly extend the schema details. However, it reinforces the purpose of each filter group, which is helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the assessor parcel layer with filters, using the verb 'Search' and specifying the resource. It explicitly contrasts with resolve_address ('instead of one exact address'), making the primary use case unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (for filter-based queries) versus resolve_address (which needs an exact address), and notes that at least one filter is required. It also clarifies that the 'limit' parameter only sizes the sample, not the true result set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_property_eventsFind dated property events by type, state and time windowA
Read-onlyIdempotent
Inspect

Dated events over US properties and parcels, with provenance and a headline you can show a person. Covers LIHTC compliance period endings (the Year 15 recapitalisation trigger, 11,956 of them), HUD subsidy contract expiries (4,721), scheduled loan maturities (3,422) now national rather than Massachusetts, CMBS distress and workout reporting (167 delinquency flags across 26 states, 128 foreclosures across 22), issued building permits and demolition filings (Boston only), and recorded sales (43,680, 2 states). 8,194 events fall inside the next 548 days, measured 2026-09-09. Filter by event type, state and days ahead. An unrecognised event type is REFUSED with the served vocabulary, never answered with an empty list. Free. PAGING: a full page carries next_cursor. Pass it back as cursor with every other argument unchanged to continue; next_cursor is null on the last page, and that is the only signal the traversal has ended. The counts above are therefore all reachable.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax 50. Results are ordered by occurred_at ASCENDING. For the expiry families (maturities, compliance periods, subsidy contracts, leases) a call with no `within_days` now returns events dated TODAY OR LATER, soonest first; the envelope reports this as `applied_date_floor`. Pass `include_past=true` for the full history.
stateNoTwo letter state code
cursorNoContinue a previous page. Pass the `next_cursor` returned by the last call, with EVERY other argument identical, to get the rows after it. Repeat until `next_cursor` is null, which is the only signal that the whole result set has been read: a short page is not the end, because a page can shrink when two sources publish the same event. Opaque; do not construct or edit one. An unreadable cursor is REFUSED rather than ignored, so a caller can never be silently restarted at page one.
event_typeNoONE family per call. Omit it and every family is searched together, which mixes populations of very different sizes and is rarely what you want: name the family. The list is generated from what this server actually publishes today, so it grows without a release. Call dfx_coverage for how many of each family exist in a given state before reading an empty result as an absent market.
within_daysNoFORWARD ONLY: it filters to events occurring between today and N days from now, and it cannot reach the past. For a backward-looking question ("recent sales", "foreclosures that already happened") OMIT this argument entirely. A historical event fails every forward window, so passing one returns an empty list that reads like an absent market. 548 is eighteen months. FORWARD FAMILIES, which this argument is for: COMPLIANCE_PERIOD_ENDING, LEASE_EXPIRING, LOAN_MATURITY_SCHEDULED, SUBSIDY_CONTRACT_EXPIRING. ENTIRELY HISTORICAL as of 2026-09-09, where ANY value returns nothing: BANKRUPTCY_EVENT, CERTIFICATE_OF_OCCUPANCY, DEMOLITION_FILED, DISTRESS_FLAG_RAISED, FORECLOSURE_EVENT, LOAN_MODIFIED, PERMIT_ISSUED, PROPERTY_SOLD, USE_CONVERSION_PERMITTED.
include_pastNoReturn the whole tape including events already past, instead of the default forward window applied to expiry families. Has no effect when `within_days` is given, which sets its own window, and none on historical families, which are never floored.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only and idempotent hints, the description discloses concrete behavior: ordering by occurred_at ascending, default date flooring for expiry families, refusal of unreadable cursors and unrecognized event types, and that short pages do not indicate the end of results. It also explains the envelope's applied_date_floor and the effect of include_past, providing 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and dense, but almost every sentence carries essential caveats. It is well-structured with clear sections for families, filtering, paging, and forward-only behavior. However, some repetition exists (e.g., the statement that next_cursor null is the only signal of completion appears twice in slightly different forms), making it slightly less concise than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the number of parameters (6) and the absence of an output schema, the description is remarkably complete. It explains paging, forward/backward temporal semantics, the distinction between expiry and historical families, and the envelope field applied_date_floor. It also addresses edge cases like empty results and cursor refusal, ensuring a caller has all needed context to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema already describes each parameter, the description adds crucial semantic depth: within_days is strictly forward-only and cannot reach the past, include_past has no effect when within_days is given, and the event_type enum is generated from what the server actually publishes. It also clarifies the interplay between parameters and the meaning of cursor opacity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides dated events over US properties and parcels with provenance and a headline, and enumerates the event families covered. It distinguishes itself from siblings by its specific focus on event timelines and filtering, leaving no ambiguity about its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when and how to use the tool: it advises naming one event family to avoid mixing populations, explains forward-only windows and historical families, recommends calling dfx_coverage before interpreting empty results, and details paging behavior with cursor usage. It also clarifies when to omit within_days for backward-looking questions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

what_can_dfx_answerAsk in plain language whether DFX can helpA
Read-onlyIdempotent
Inspect

Describe an objective in natural language and get back whether DFX can help, which tool to call, the arguments to call it with, and a free sample of the result. Says no clearly when the answer is no, and records what was asked so unmet demand shapes what DFX builds next. Call this first if you do not know what to ask for.

ParametersJSON Schema
NameRequiredDescriptionDefault
objectiveYesWhat you are trying to do, in one sentence and in your own words, for example 'commercial real estate loans in Ohio maturing in the next year'. A place named in the sentence is what the free sample is drawn from, so name one.
constraintsNoStructured overrides for what was parsed out of `objective`, applied last so they outrank the prose. ONLY `state`, `event_type`, `within_days` and `limit` are honoured; any other key is ignored without warning.

TDQS

A3.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'records what was asked so unmet demand shapes what DFX builds next', implying a write/persistence side effect. This directly contradicts the readOnlyHint annotation, which indicates the tool does not modify state. Flagged as an annotation contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tight sentences with no filler. It front-loads the main action and outcome, then adds necessary behavioral notes. Highly concise and well structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description reasonably explains what the agent will receive (helpfulness answer, tool, arguments, sample, explicit no). Slight vagueness around 'free sample of the result' prevents a perfect score, but overall it is contextually sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool description itself does not add much parameter detail, but the input schema has 100% description coverage with rich explanations, including nested constraints behavior and enum vocabulary reference. Since schema coverage is high, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: given an objective, return whether DFX can help, which tool to call, arguments, and a sample. It also distinguishes itself by saying 'Call this first if you do not know what to ask for', positioning it as a routing/discovery tool among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs when to use the tool: 'Call this first if you do not know what to ask for.' It also explains the behavior of saying no clearly and recording unmet demand, giving the agent clear expectations.

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.

  1. 12 tool updatesv0.10.0
    • First observedchanges_since
    • First observeddebt_maturity_schedule
    • First observeddfx_coverage
    • First observeddfx_payment_status
    • First observedfund_dfx_account
    • First observedget_property_record
    • First observedopen_dfx_account
    • First observedresolve_address
    • First observedresolve_organization
    • First observedsearch_parcels
    • First observedsearch_property_events
    • First observedwhat_can_dfx_answer

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have clearly distinct purposes, and the descriptions explicitly separate similar ones such as search_property_events versus changes_since and the paid debt_maturity_schedule versus the free event search. A few pairs could still be confused at a glance, but the documentation resolves the ambiguity well.

Naming Consistency3/5

The API uses snake_case throughout, but naming styles are mixed: some tools follow verb_noun (resolve_address, search_parcels, open_dfx_account), while others are noun phrases or questions (changes_since, debt_maturity_schedule, dfx_payment_status, what_can_dfx_answer). The inconsistency is noticeable but not chaotic.

Tool Count4/5

Twelve tools is within a reasonable range for a server that combines real estate data discovery with an account and payment flow. The count feels justified rather than padded, though the billing-related tools add some surface area beyond the core domain.

Completeness4/5

The tool set covers address and organization resolution, property records, event search, parcel search, coverage, change polling, and a full paid-capability flow. It is solid for a read-focused real estate intelligence API, though a direct parcel-by-ID retrieval endpoint is not clearly present and would round out the surface.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Open-source MCP server providing real estate regulatory intelligence (zoning, permits, entitlements, deal scoring) for US properties, enabling AI agents to access 10 callable tools.
    12
    5 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    62 real-time data tools for AI agents via MCP. Finance, crypto, FMCSA, sanctions, courts, weather, vehicles, cybersecurity. One bearer token, one bill. Free tier available.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Exposes ATTOM's real estate API as MCP tools, enabling property details, valuations, assessments, sales, and area data via natural language.
    2
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server for Moody's Commercial Real Estate API, providing 37 tools for property lookups, market analytics, comps, CMBS data, tax records, and more.
    -