DFX Real Estate Intelligence
DFX Real Estate Intelligence is a free, read-only MCP server that answers dated, source-attached questions about US commercial real estate debt, Massachusetts/New York property records, and extends into family offices, independent sponsors, venture capital, private equity, RIAs, private credit, and allocators.
Resolve street addresses to canonical property/parcel IDs and company names to entity IDs.
Search dated property events by type, state, and forward window: loan maturities, LIHTC compliance expiries, HUD subsidy expiries, leases, sales, permits, foreclosures, distress flags.
Get full property records: ownership, management, debt with confirmed maturity dates, recorded sales with book/page, provenance.
Query the loan tape via
debt_maturity_schedule(the only paid tool, $1 per state schedule) for principal, lender, instrument, and secured property; a free event-based alternative is available.Search parcels by municipality, land use, assessed value, year built, owner-occupancy, and tax-exempt status.
Check measured coverage with
dfx_coveragebefore interpreting empty results, and usewhat_can_dfx_answerto map natural-language objectives to tools.Poll
changes_sincefor newly learned facts ordered by discovery time.Search HUD-subsidised housing, bank CRE exposure, and commercial leases/occupancy.
Cross-graph tools: entity search, relationships, relationship paths, people, events, and claim verification (SUPPORTED/CONTRADICTED/UNKNOWN).
Match capital to opportunities: find investors for a company/opportunity, find opportunities for capital, and explain match reasons/blockers.
Explore family offices, independent sponsors, venture firms/funds/investments, PE firms/funds/transactions/platforms, RIAs and advisor moves, private credit/BDC portfolios, and allocator commitments.
Free discovery endpoints: /llms.txt, /openapi.json, agent cards, robots.txt, and stdio bridge for clients that cannot speak HTTP.
Handles payments for the server's paid debt maturity schedule tool, creating Stripe payment sessions, funding DFX accounts, and verifying payment status through Stripe.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DFX Real Estate IntelligenceWho owns 100 Binney St in Cambridge, MA and what did it last sell for?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DFX Intelligence: MCP server
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_coveragefor 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/mcpThen 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 |
the entry point, for something holding only this host name | |
Agentic Resource Discovery catalog | |
MCP server card | |
A2A style agent card | |
the agents.txt convention | |
the same capabilities over plain HTTP | |
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 |
| address, city?, state? | canonical DFX ids with the match basis and any ambiguity | free |
| name | entity ids for owners, managers, lenders, servicers | free |
| 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 |
| a DFX id | state, dated events, relationships, debt with maturity dates, recorded sales, provenance | free |
| event_type?, state?, within_days? | dated events with provenance | free |
| 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 |
| 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 |
| filters | parcels by attribute rather than by an address you already knew | free |
| an objective, in natural language | whether DFX can help, which tool to call, the arguments, and a free sample | free |
| an opaque cursor | what DFX has learned since your cursor | free |
| state, within_days?, limit? | the loan tape: principal, lender, instrument, maturity, secured property | free |
| nothing | measured coverage, served sources, object types, known gaps | free |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| claim?, object?, object_dfx_id?, predicate?, subject?, subject_dfx_id?, ... | SUPPORTED, PARTIALLY_SUPPORTED, CONTRADICTED or UNKNOWN for a claim, with the observations | free |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| Massachusetts. The municipal assessor and registry layer, carrying assessed value, land use and recorded sales. | 291,914 |
| National. Federal programme multifamily: HUD, LIHTC and FHA. | 102,351 |
| 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 |
| New York City, five boroughs | recorded instrument, grouped into economic transactions | yes | yes | yes |
| 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 |
| 2 | 43,680 |
| 56 | 11,956 |
| 54 | 4,721 |
| 1 | 4,203 |
| 55 | 3,966 |
| 53 | 3,528 |
| 52 | 3,395 |
| 54 | 3,181 |
| 1 | 2,768 |
| 1 | 881 |
| 1 | 849 |
| 26 | 163 |
| 21 | 123 |
| 0 | 13 |
| 5 | 12 |
| 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_dateandmaturity_basisoriginal_principal_usd,current_principal_usd,interest_rate_pct,origination_date,term_monthsinstrument_typethe 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_keyfor 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/mcpBoth 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
Which commercial real-estate loans mature in a given state and window?: 3,395 LOAN_MATURITY_SCHEDULED, 52 states and territories.
Which LIHTC properties are reaching the end of a compliance period?: 11,956 COMPLIANCE_PERIOD_ENDING, 56 states and territories.
Which HUD-subsidised properties have contracts approaching expiry?: 4,721 SUBSIDY_CONTRACT_EXPIRING, 54 states and territories.
Where is commercial real estate in distress, foreclosure or workout?: 163 DISTRESS_FLAG_RAISED, 123 FORECLOSURE_EVENT, 12 LOAN_MODIFIED, 26 states.
What did this property sell for, and who owns it?: 43,680 PROPERTY_SOLD, 2 states.
Which commercial leases are approaching expiry, and who occupies a building?: 3,966 LEASE_EXPIRING, 55 states and territories.
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_sinceis 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_typeis 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_organizationreturns 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_coveragebefore 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 toolschanges_sinceWhat DFX has learned since your last callARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| since | No | Opaque cursor from a previous call. Omit on the first call to establish a position; that call returns no events by design. | |
| state | No | Two letter state code | |
| event_type | No | One family. Same vocabulary as search_property_events. | |
| place_dfx_id | No | Watch one property or parcel |
TDQS
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.
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.
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.
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.
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.
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 stateARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum loans, up to 200. The price does not change with the row count. | |
| state | Yes | Two letter state code. Required: the schedule is priced per state. | |
| authorize | No | Omit to be quoted. Supply to be charged and served in one response. | |
| within_days | No | Forward window from today. Default 548, eighteen months. |
TDQS
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.
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.
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.
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.
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.
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 notARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Two letter state code. Optional: narrows the answer to this state. | |
| event_type | No | Optional: narrows the answer to this family. Same vocabulary as search_property_events. |
TDQS
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.
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.
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.
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.
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.
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?ARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | from the PAYMENT_REQUIRED reply, the same id you passed to fund_dfx_account | |
| account_key | No | your DFX account key, if your MCP client cannot send the X-DFX-Account header |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | from the PAYMENT_REQUIRED reply | |
| account_key | No | your DFX account key, if your MCP client cannot send the X-DFX-Account header |
TDQS
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.
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.
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.
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.
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.
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 parcelARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dfx_id | Yes | id returned by resolve_address |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | A short name for this account, for your own reference on receipts. Optional. | |
| quote_id | No | If you already hold a quote, pass it and the reply will name the exact funding call for it. | |
| principal | No | Who 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
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.
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.
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.
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.
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.
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 parcelARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City 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`. | |
| limit | No | Max 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. | |
| state | No | Two letter state code | |
| address | Yes | Street address including the house number, for example '100 Binney St' |
TDQS
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.
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.
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.
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.
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.
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 entityARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Company 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. | |
| limit | No | Max 50. Every candidate is returned rather than a best guess, so a common name spends this whole budget. |
TDQS
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.
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.
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.
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.
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.
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 valueARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| state | No | Two letter state code | |
| land_use | No | Assessor land use code, for example 'R3' for a three family dwelling | |
| tax_exempt | No | true for the institutional universe (churches, universities, authorities), false for the taxable one | |
| built_after | No | Exclusive lower bound on year built | |
| built_before | No | Exclusive upper bound on year built | |
| max_assessed | No | Maximum assessed total, in dollars | |
| min_assessed | No | Minimum assessed total, in dollars | |
| municipality | No | City or town, for example 'Boston' | |
| owner_occupied | No | true for owner-occupied, false for investor or institutionally held. Parcels whose roll does not state it are excluded either way. |
TDQS
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.
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.
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.
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.
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.
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 windowARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max 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. | |
| state | No | Two letter state code | |
| cursor | No | Continue 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_type | No | ONE 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_days | No | FORWARD 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_past | No | Return 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
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.
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.
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.
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.
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.
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 helpARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| objective | Yes | What 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. | |
| constraints | No | Structured 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
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.
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.
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.
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.
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.
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.
12 tool updates
v0.10.0- First observed
changes_since - First observed
debt_maturity_schedule - First observed
dfx_coverage - First observed
dfx_payment_status - First observed
fund_dfx_account - First observed
get_property_record - First observed
open_dfx_account - First observed
resolve_address - First observed
resolve_organization - First observed
search_parcels - First observed
search_property_events - First observed
what_can_dfx_answer
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Property Records MCP — address-level US property records (sales history,
75 MCP tools: SEC financials, FRED economics, IRS 990, FDA, FX, UK Companies House.
Remote MCP endpoint for U.S. home forecasts, public benchmark data, and permit or zoning readiness.
Agent-native MCP over US public + government records, entity- and parcel-keyed.
Related MCP Servers
- AlicenseAqualityDmaintenanceOpen-source MCP server providing real estate regulatory intelligence (zoning, permits, entitlements, deal scoring) for US properties, enabling AI agents to access 10 callable tools.125 npmMIT
- AlicenseNot gradedqualityAmaintenance62 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
- FlicenseNot gradedqualityCmaintenanceExposes ATTOM's real estate API as MCP tools, enabling property details, valuations, assessments, sales, and area data via natural language.2-
- FlicenseNot gradedqualityCmaintenanceMCP server for Moody's Commercial Real Estate API, providing 37 tools for property lookups, market analytics, comps, CMBS data, tax records, and more.-