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)
Tool surface (v2)
Section titled “Tool surface (v2)”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.
Connect — Claude (web/desktop/mobile)
Section titled “Connect — Claude (web/desktop/mobile)”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/mcpConnect — Claude Code
Section titled “Connect — Claude Code”claude mcp add --transport http planted https://mcp.plantedmoney.ai/mcpConnect — any MCP client
Section titled “Connect — any MCP client”{"type":"http","url":"https://mcp.plantedmoney.ai/mcp"}Verify
Section titled “Verify”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.
Prompt cookbook
Section titled “Prompt cookbook”- “Underwrite 3214 W Fullerton at $450k as a 2-flat — give me both offers and the risk flags.”
- “Pull comps for this address and show me what you rejected and why.”
- “Compare tract 17031222900 vs 17031840300 for BRRRR.”
- “Which ZIPs pay MORE in Section-8 voucher than market rent right now?”
- “Screen live deals: 2-4 units, offer at/below ask, DSCR ≥ 1.1.”
- “What’s the reassessment-shock story for Berwyn township?”
- “Risk report for a 1908 3-flat near 63rd & Woodlawn.”
- “Explain why this listing scored 58 — decompose it.”
Troubleshooting
Section titled “Troubleshooting”| 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 |
Scopes & fair use
Section titled “Scopes & fair use”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.
Get a key
Section titled “Get a key”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):
- Issue: plantedmoney.ai/connect → create a key → pick scopes (
readnow;alerts:writewhen webhooks land) → the key (pmt_…) is shown once and stored hashed on our side. - 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. - Manage: rotate or revoke your own keys anytime; per-key usage visible to you; per-key audit records kept 12 months (privacy).
- 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.
Safety notes for agent builders
Section titled “Safety notes for agent builders”Wire these into your agent’s behavior, not just your reading of this page:
- Relay the disclosure. Every valuation payload carries a
disclosurestring (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 targetedunderwrite) instead of underwriting a whole ZIP in a loop.
