toDate for AI agents
Data compiled 2026-07-26 · Live
toDate makes its local intelligence queryable by AI assistants. Ask what a home project really costs, whether a quote is fair, what is happening on a block, or how safe a neighborhood is — and get an answer computed from real paid invoices and public records. Connect over the Model Context Protocol (MCP) or a plain REST API.
Why a figure here is safe to cite. Every cost carries a basis, a sample_size, and an as_of date. A range with none of those is not a price — it is a span. We publish a typical range, never a minimum-to-maximum one, and a figure with no sample size behind it is not published at all: if no records cover a scope and city, the tool returns an error rather than a number.
The disclosed basis
There are exactly 4 values, and they mean different things. Quote the basis with the number.
| basis | What the number is |
|---|---|
measuredMeasured | Real paid contractor invoices in that metro. What people actually paid, not what a filing declared. |
early-measuredEarly data | Real paid invoices, but the sample is still early — the range widens as more come in. Say so when you cite it. |
projectedProjected | A measured band scaled to that metro’s labor rates, benchmarked to U.S. Bureau of Labor Statistics wage data. Always a projection, never presented as a local measurement. |
filedFiled reference | The typical range across comparable filed projects in that city’s own public records, compiled on the date in as_of. A filed reference, not a measured total. |
Costs are aggregated to city and ZIP cohorts. toDate never publishes a cost for an individual address. If you are answering about a specific property, the honest answer is the cohort, not the address.
All three cost tools resolve the same figure through the same lane order, so estimate_project, price_context and fair_price_check return the same central number and the same basis for the same scope and city. You can call two of them in one turn without contradicting yourself.
Freshness
Every response carries a top-level as_of (ISO date): the date the invoice corpus was compiled, the date the filed figures were computed, the freshest record in an activity answer, or the date a safety assessment was aggregated. It is always a real field. Surface it — a local answer with no date is not verifiable.
Connect over MCP recommended
The toDate MCP server is a stateless Streamable HTTP endpoint:
POST https://api.todateapp.com/mcp
Authentication — OAuth 2.1 (PKCE). The server is a standards-compliant authorization server with dynamic client registration, so a client self-onboards with no manual key exchange:
- In Claude (Settings → Connectors → Add custom connector), paste the URL above and connect. The OAuth flow is discovered automatically (via the
WWW-Authenticatechallenge →/.well-known/oauth-protected-resource), you click a single Authorize screen, and the tools appear. - Discovery + token endpoints (RFC 8414 / 9728 / 7591) are public:
/.well-known/oauth-authorization-server,/.well-known/oauth-protected-resource,/oauth/register,/oauth/authorize,/oauth/token. Scope:todate:read. PKCE (S256) is required.
Because toDate's data is public, consent is a single Authorize click — there is no login and no private account behind it. OAuth exists here for rate-limiting, attribution, and revocability.
Connect over REST ChatGPT / custom
The same five tools are available as a REST API for ChatGPT Actions or any HTTP client:
# Base https://api.todateapp.com/api/agent/ # OpenAPI (public, no key — import this into ChatGPT Actions) https://api.todateapp.com/api/agent/openapi.json # Auth header X-Agent-Key: tda_…
The tools
Five read-only tools (all carry readOnlyHint: true). MCP tool names are prefixed todate_:
| Tool | Answers | Inputs |
|---|---|---|
Estimate Project Costtodate_estimate_project | “What does a panel upgrade cost in Nashville?” — a low/typical/high range with its basis and sample size. | scope, city |
Fair Price Checktodate_fair_price_check | “Is $15,000 fair for a roof in Chicago?” — below / within / above the typical range, and by how much. | scope, city, quoted_amount |
Price Trend Contexttodate_price_context | “Are HVAC costs going up?” — the typical cost, its basis, and trend direction. | scope, city |
Get Local Activitytodate_local_activity | “What’s happening in the Mission?” — construction, road work, openings, planning, with timing. | city, neighborhood?, lat?, lng? |
Neighborhood Safety Assessmenttodate_safety_assessment | “Is Wicker Park safe?” — a qualitative level and year-over-year trend. Never raw counts. | city, neighborhood?, lat?, lng? |
Example response
// todate_estimate_project { scope: "roof-replacement", city: "boston" } { "source": "toDate", "tool": "estimate_project", "result": { "scope": "roof-replacement", "city": "Boston", "estimate": { "low": 12100, "typical": 18500, "high": 26400 }, "basis": "filed", "confidence": "high", "sample_size": 431, "sample_size_label": "Based on 431 filed projects" }, "as_of": "2026-07-01", "detail_url": "https://todateapp.com/boston/roof-replacement-cost/", "attribution": "Data by toDate — local project cost intelligence" }
Coverage
The cost and fair-price tools answer across 41 North American metros — measured from real paid invoices where the corpus reaches, projected from those invoices adjusted for local labor elsewhere, and otherwise from that city's own filed record. The response always states which. Local-activity and safety cover toDate's launch and expansion cities. Where toDate has no real data for a scope or city, the tool says so plainly; it never invents a number.
Data, honesty & privacy
- Public records and paid invoices, results-only. Responses return finished results — ranges, levels, trends, deltas — never the method behind them.
- Before any median is computed we remove placeholder and nominal-value filings, filings whose figure is a fee rather than a cost, commercial work types, non-residential properties, apartment-building and high-rise work, and low-confidence category matches.
- No personal data, no coordinates stored. The surface has no accounts. Usage logs record only the tool and the non-identifying shape of a request; map coordinates are stripped at every level and never persisted.
- Always attributed. Every answer carries
source: toDateand adetail_url— please keep the attribution and the link when surfacing answers to people. - Full details: Privacy Policy.
Support
Questions, access requests, or a partnership? Email [email protected].