Skip to content

Connect via MCP

The full agentic real-estate toolset inside Claude (or any MCP client), backed by live Cook + Lake County data — read tools, authenticated write tools, and UI-controller tools. Endpoint: https://mcp.plantedmoney.ai/mcp · transport: streamable HTTP · manifest: GET /mcp/v2/manifest · auth: Authorization: Bearer pm_<key> for scopes — OAuth 2.1 consent, or keyless read while the beta lasts (30 calls/min/IP)

Catalog auto-generated from GET /api/mcp-tools / GET /mcp/v2/manifest. Plan-named tools with the old names kept as deprecated aliases that still work (they carry deprecated:true + replacement in the manifest; removal gets a changelog entry and >=90-day notice).

Tool Scope What it does
search_investment_inventory read Scored inventory by strategy percentile, filtered by bbox or named geography, min_percentile, max_price, min_confidence; fields selector + cursor pagination. (replaces search_deals)
deep_underwrite_asset underwrite Full pro-forma for a property_id/address/point + a 5-year cashflow array (rent +2%/yr, opex +2.5%/yr); honors custom_assumptions{purchase_price,rehab_budget,rate,down_pct,rent_override,financing_type,hold_months}. (replaces underwrite)
get_comps underwrite Tiered ARV + full explainability (comps, adjustments, dispersion, tier, confidence, rejected-with-reasons). (replaces comps)
get_tract_report read Every signal for a tract, labeled.
market_pulse read County pulse: percentile-ranked leaders, S8 arbitrage ZIPs, reassessment-shock townships.
risk_report read Separate 0-100 risk score + flags.
save_favorite_property, update_underwriting_preset, create_strategy_profile, add_note write-state Persist state server-side; syncs live to the open web map via GET /api/events.
update_map_filters, fly_to_location, highlight_properties read UI-controller tools: drive the caller’s open map (appended to the sync stream).

Every numeric answer carries as_of, model_versions, and confidence. Write tools require the write-state scope; alert subscriptions created via create_strategy_profile deliver signed webhooks. See the error taxonomy and scopes & limits.

Settings → Connectors → Add custom connector → paste the URL below, then approve the consent screen when Claude opens it (or dismiss it and connect keyless while the beta lasts):

https://mcp.plantedmoney.ai/mcp
claude mcp add --transport http planted https://mcp.plantedmoney.ai/mcp
{"type":"http","url":"https://mcp.plantedmoney.ai/mcp"}

Paste into Claude: “Use market_pulse to show me this week’s top BRRRR tracts.” A correct response names tracts with geoids, scores, S8-arbitrage ZIPs, and reassessment-shock townships.

  1. “Underwrite 3214 W Fullerton at $450k as a 2-flat — give me both offers and the risk flags.”
  2. “Pull comps for this address and show me what you rejected and why.”
  3. “Compare tract 17031222900 vs 17031840300 for BRRRR.”
  4. “Which ZIPs pay MORE in Section-8 voucher than market rent right now?”
  5. “Screen live deals: 2-4 units, offer at/below ask, DSCR ≥ 1.1.”
  6. “What’s the reassessment-shock story for Berwyn township?”
  7. “Risk report for a 1908 3-flat near 63rd & Woodlawn.”
  8. “Explain why this listing scored 58 — decompose it.”
Symptom Cause → fix
401 unauthorized Only private endpoints (state/deals/run-listings) need a key — /mcp is open in beta
Connector shows “requires authentication” Expected — approve the OAuth consent screen Claude opens (leaf-green “Planted Money” page, one Approve click). Or connect keyless while the beta lasts.
429 rate limited Public beta cap: 30 calls/min per IP → wait a minute
Tool not found Client cached an old catalog → remove + re-add the connector
“Cannot value — no confident comps” Working as designed: dispersion/similarity gates refused a garbage comp set. Use the tract heuristic number or widen the search.
Empty search_deals Filters too tight, or the daily 13:00 UTC run hasn’t populated yet — check /api/health last_run

Read-only access to property valuations and market data is the free beta tier. Connect with OAuth 2.1 (authorization code + PKCE, read+underwrite via a minted pm_ key) or keyless read while the beta lasts. Keyed access adds write tools, an rpm_limit token bucket, and per-key metering — scopes read/underwrite/write-state/webhooks (scopes & limits). Outputs may not be used for tenant screening or credit decisions (FCRA). Every valuation is an automated model, not an appraisal — error rates: /methodology/accuracy.

Not live yet; published early so the flow isn’t a surprise. Today you connect keyless (beta) or via the anonymous OAuth 2.1 consent screen — nothing below is required.

When self-serve keys ship (Phase 8):

  1. Issue: plantedmoney.ai/connect → create a key → pick scopes (read now; alerts:write when webhooks land) → the key (pmt_…) is shown once and stored hashed on our side.
  2. Use: either paste it into your client config (Authorization: Bearer pmt_…) or keep using OAuth — issued keys and OAuth tokens hit the same tools with the same schemas. Nothing about the endpoint URL ever changes: https://mcp.plantedmoney.ai/mcp.
  3. Manage: rotate or revoke your own keys anytime; per-key usage visible to you; per-key audit records kept 12 months (privacy).
  4. Limits: keyed access gets a higher ceiling than the anonymous 30 calls/min/IP; exact numbers published here at launch, not before.

Keyless beta access does not disappear the day keys ship — deprecation, if it comes, gets its own changelog entry and notice period.

Wire these into your agent’s behavior, not just your reading of this page:

  • Relay the disclosure. Every valuation payload carries a disclosure string (AVM, not an appraisal, published error rates). An agent that strips it and presents bare numbers is misrepresenting the data — surface it whenever a human sees the number. Canonical wording: /legal/avm-disclosure.
  • Refusals are answers. “Insufficient comps” / “unscored” means the gates refused to invent a number. Do not retry-loop or fabricate a substitute; report the refusal and its reason.
  • No autonomous transactions. These are ±20% screening numbers. An agent should never make offers, sign, or move money on them without a human decision in the loop (terms, draft §11).
  • Prohibited uses are yours to enforce too: no tenant screening, credit, employment, or insurance decisions with any output (FCRA). Building an agent that does this violates the terms — and the point.
  • Check the vintage. Payloads carry as_of/vintage fields; a rent anchor from last fiscal year is a fact your agent should mention, not hide.
  • Budget calls. Beta limit is 30 calls/min/IP; a well-built agent batches (one search_deals, then targeted underwrite) instead of underwriting a whole ZIP in a loop.