Zip Estate — Agent Context
Free financial calculators for real estate investors, with tools an AI agent can call directly in the browser. No API, no key, no request to any server.
How it works
zip-estate.com publishes WebMCP tools on its pages. In a browser that supports WebMCP, open a page and the tools are registered — discover them with document.modelContext.getTools() or your agent's tool list. They run in the user's browser, on the page the user is looking at, so when you change a scenario the charts move in front of them.
Tools
On every page:
| Tool | Does |
|---|---|
navigate_to_page | Go to another page. Offers only the pages this user may see. |
On each calculator page — a read and a write:
| Page | Tools |
|---|---|
| /calculators/real-estate | get_property_scenario · set_property_scenario · get_property_balance_at · save_property_scenario |
| /calculators/compound | get_compound_scenario · set_compound_scenario |
| /calculators/doubling | get_doubling_scenario · set_doubling_scenario |
| /calculators/flip | get_flip_scenario · set_flip_scenario |
| /calculators/leverage | get_leverage_scenario · set_leverage_scenario |
| /calculators/pension | get_pension_scenario · set_pension_scenario |
| /calculators/tax | get_tax_scenario · set_tax_scenario |
| /calculators/loan-vs-sell | get_loan_vs_sell_scenario · set_loan_vs_sell_scenario |
get_* reads the inputs and results on screen, plus a link that reproduces the scenario — and, on the real estate calculator, which premium inputs are locked on the page. set_* changes one or more inputs — omitted ones keep their value, out-of-range ones are clamped to the slider — and returns the resulting figures in the same call. Every tool's inputs are described in its schema. get_property_balance_at reads the real estate projection chart at chosen years and months — value, loan balance, equity, cash flow and return since purchase. save_property_scenario keeps a real estate scenario in the user's account — a visitor is sent to sign in first.
For a logged-in member — on their deal pipeline (proposals: offers being pursued) and their portfolio (owned properties: the ones they hold and manage):
| Page | Tools |
|---|---|
| /Dashboard | get_portfolio_summary |
| /Proposals | search_proposals · open_proposal |
| /ProposalDetails | get_proposal_details · add_proposal_update · set_proposal_status · set_follow_up_date · log_seller_contact |
| /Properties | search_portfolio · open_owned_property |
| /PropertyDetails | get_owned_property_details |
| /Contacts | search_contacts · open_contact · get_contact_details |
| /Timeline | search_conversations · open_conversation · get_conversation |
search_proposals runs the page's own search and shows it on screen; open_proposal goes to one proposal, by id or by words that identify it. get_proposal_details reads the proposal on screen; add_proposal_update posts a note, task, question or call transcript to its Deal Feed; set_proposal_status, set_follow_up_date and log_seller_contact do what the edit, reminder and "Add Contact" forms do. The writes are offered only to a user who may edit the proposal. get_portfolio_summary reads the dashboard's tiles and recent activity. The portfolio tools do the same for owned properties: the page's address search under a status chip, go to one, read it with its lease, tenant and open maintenance requests. The contact tools do the same for people: search under a type chip, open one in the page's panel, read what the panel shows. The conversation tools do the same for the timeline: find a thread by the person's name, number or email, open it, read its five latest messages.
Workflow
navigate_to_pageto the calculator that answers the question.get_*_scenarioto see what is on screen.set_*_scenariowith the user's numbers. Quote the figures it returns — they are the page's own.- Give the user the
urlfrom the result so they can keep exploring.
Shareable links
Every calculator keeps its state in the URL, so any scenario is a link. For the real estate calculator:
| Param | Description | Default |
|---|---|---|
| pp | Purchase price ($) | 100000 |
| pvm | Price as % of market (60–120, 100 = at market) | 100 |
| mr | Monthly rent ($) | 1500 |
| ar | Appreciation rate (%) | 4 |
| rg | Rent growth rate (%) | 3 |
| dp | Down payment (%) | 25 |
| cc | Closing costs ($) | 8000 |
| vr | Vacancy rate (%) | 8 |
| it | Insurance + tax monthly ($) | 200 |
| pm | Property management (%) | 10 |
| mt | Maintenance (% of annual rent) | 4 |
| mi | Mortgage rate (%) | 6.5 |
| my | Mortgage term (years) | 30 |
Example: https://zip-estate.com/calculators/real-estate?pp=85000&mr=1100&pvm=70&dp=25
AI Estimator: comps and similarities & differences
Open /AiEstimator and select or create a subject first (saved links use ?id=<estimate-id>). get_property_analysis reads the complete estimate and repair IDs. get_comps_and_differences reads sale comps with IDs and similarities_and_differences. save_estimator_comparable adds with comparable.address or patches changed facts using id. save_similarity_or_difference adds with compId and comparison.feature, or patches one comparison using its id. remove_comp_comparison removes only that comparison; its comp and repair remain. Use comparison values similar, comp_better (comparable is better), subject_better (subject is better), or unknown. Keep unsupported facts unknown and cite evidenceUrl when available. save_estimator_renovation manages subject repairs; reuse its IDs for renovationItemId links. Before scoring photos, read get_estimator_guidelines. Use save_estimator_scores for independent condition and luxury scores (1–10, null = unknown), with confidence, coverage, reviewed photo count and evidence URL. Interior evidence is required for an overall rating; listing text alone is insufficient. Scores appear in the public report. Repairs support fixed cost or quantity × affected percentage × unit rate, with contingency. User planning defaults: LVP removal + installation $8/sq ft; roof installation $10/sq ft. Roof needs actual roof area, not living or lot area. These rates are editable assumptions. save_estimator_adjustment stores signed internal location value adjustments separately from repairs (highway -$5,000 is an editable example). No automatic ARV or offer change.
update_estimator_subject saves subject facts; update_estimator_offer_report saves public offer terms without sending or exporting. These writes persist to the signed-in user's account immediately. Await each save. Omitted fields on comp/comparison updates stay unchanged. Legacy comparable.observations replaces the whole list; prefer the individual comparison tools. Rental comps remain in the UI. get_property_photos returns saved photo IDs/URLs with pagination (omit compId for subject). get_renovation_references reads optional national cost ranges, sources and inspection prompts; it keeps user presets separate and changes no property data or calculations. open_estimator_photo_review opens a full image in the in-app gallery, optionally at photoId. Inspect photos before scoring: manifest access is not visual review; missing rooms and doors stay unknown. A failed image has a visible warning; no guessed high-resolution URL variants. get_estimator_readiness separates export blockers from advisory evidence warnings and gives next actions. Unknown doors/photos/scores do not silently exclude mixed-type comparables. prepare_comparable_selection previews every current comp exactly once in best-fit order, with an internal reason, weight, enabled and includeInReport flag. Fit rank is separate from photo scores. Show the preview to the user; only after their approval call apply_comparable_selection with the returned planId. One save applies the selection only; Any edit to the open estimate invalidates the preview. export_estimator_report creates a public-only PDF once readiness passes. It returns a browser-local download URL, file name, bytes, page count and omitted-photo count. Download before editing or leaving the estimate; the URL then expires. Nothing is uploaded or sent. Unavailable/CORS-blocked photos become explicit placeholders. Print remains available. PDF pages are rasterized for consistent RTL/font rendering; listing links remain clickable.
Without WebMCP
This is a client-side app: page routes return a JavaScript bundle, so there is nothing to scrape. If your browser cannot run WebMCP, give the user a pre-filled calculator link from the table above and let them read the result.