Install
Sign up at dealpacket.com and your API key arrives by email along with the block below, already filled in. No card required.
Claude Desktop
Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"dealpacket": {
"command": "npx",
"args": ["-y", "dealpacket-mcp"],
"env": { "DEALPACKET_API_KEY": "dp_live_…" }
}
}
}
Restart Claude Desktop. DealPacket appears in the tools menu.
Claude Code
claude mcp add dealpacket -e DEALPACKET_API_KEY=dp_live_… -- npx -y dealpacket-mcp
Cursor, Windsurf, and other MCP clients
Any client that speaks MCP over stdio works — the config shape is the same three keys
(command, args, env). Cursor reads
.cursor/mcp.json; most others read .mcp.json in the project root.
node --version. The server
runs on your machine; your API key never travels anywhere except to DealPacket.
Your first packet
Ask in plain language. The client picks the tool.
"Run 3598 Ingledale Dr SW, Atlanta GA through DealPacket
and give me the lender view."
That is two tool calls — get_deal to build the packet, then
render_packet to shape it for a lender. The second one is free, and so is every
other render of that same packet for the next 30 days.
Other things that work without you naming a tool:
"Screen these 40 addresses against my flip buybox."
"Give me the GC view on the third one."
"Set my buybox: max purchase 120k, ARV floor 250k, brick only,
1200 to 1700 square feet, 70k equity target."
"How many packets do I have left this month?"
Go uncapped — bring your own data key
Your first three packets each month are funded by us. After that, add your own RentCast key and metering stops entirely — on any plan, including Free. RentCast's Developer plan is $0/month with 50 calls included, which is about 16 packets, and takes a minute: app.rentcast.io/app/api.
"Set my DealPacket data key to <your RentCast key>"
The key is verified against RentCast before it's stored — a key that doesn't work is worse than
no key. It's then encrypted at rest with AES-256-GCM, decrypted only in memory for the duration
of one call, never logged, and never returned by any tool. set_data_key echoes a
masked prefix only. Pass clear: true to remove it.
Tools
Nine tools. Two of them cost anything.
| Tool | Cost | What it does |
|---|---|---|
get_deal |
1 packet | The product. Address → property facts, ownership, owner contact with DNC flags (Pro/Team), ARV and rent with comps, distress score, full underwriting, and pass/fail against your buybox. Every field carries its source and fetch time. Re-reads within 30 days are free and served from storage. |
screen_deals |
⅓ each | Sweep up to 250 addresses against a buybox, returning pass/fail with the reason. Makes one valuation call per address instead of three, and is priced to match. Addresses that fail to look up aren't charged. Pro and Team. |
render_packet |
free | Reshape a stored packet for gc, lender, cpa,
title or investor. No vendor calls, so it costs nothing on
every plan. |
get_packet | free | A stored packet as JSON, with a stable schema_version. |
list_packets | free | Recent packets on the account. |
set_buybox | free | Create or update the rules every packet is scored against. |
list_buyboxes | free | — |
get_usage | free | Plan, packets used and remaining, overage, and which data key is funding your calls.
Reports metered: false when your own key is in use. |
set_data_key | free | Store or clear your own RentCast key. See above. |
Packet schema
get_packet returns this shape. schema_version is "1.0"
and will change if the structure does.
DealPacket
├─ address normalized + county, FIPS, APN, lat/lon
├─ property beds, baths, sqft, lot, year, construction, zoning
├─ ownership owner name & type (individual/entity/trust), occupancy,
│ mailing address, years owned, last sale, estimated equity %
├─ contact phones w/ type + DNC flag + confidence, emails
│ └─ redacted:true on Free
├─ valuation ARV + range + $/sf + up to 8 comps
├─ rental market rent + range + comps + gross yield
├─ distress absentee / high-equity / long-tenure / trust / vintage
│ → 0–100 score WITH the reasons, never a bare number
├─ underwriting MAO under the 70% rule AND your own equity target,
│ rehab all-in, projected equity, DSCR, cash left in
│ after refi, cash-on-cash
├─ buybox_fit per-rule expected vs. actual, hard vs. soft, match + score
├─ provenance field → { source, fetched_at, confidence, cached }
└─ attribution vendor strings displayed on every packet
Two things there are the point, and neither is the data. buybox_fit turns a lookup into a decision by showing the arithmetic per rule. provenance turns a decision into something forwardable: the recipient doesn't have to trust you, they can check you.
Underwriting
Deterministic arithmetic on vendor data. No model calls, no guessing — which is what keeps re-renders free and the numbers reproducible.
Maximum allowable offer
Both are returned, because investors argue about which one to use:
mao_70 = ARV × 0.70 − rehab_all_in
mao_buybox = ARV − rehab_all_in − your_equity_target
rehab_all_in = rehab_budget × (1 + contingency_pct/100)
When you don't supply a purchase price, the packet solves for the lower of the two and reports
it as assumed_purchase_price.
The rental hold
Hard-money-to-DSCR-refinance is the common exit, so debt service is modelled on the refinance rather than the acquisition loan. The refi is sized at the lesser of ARV × LTV and total basis — a just-finished flip has no seasoning for a cash-out above basis.
basis = purchase + rehab_all_in
refi_loan = min(ARV × 0.75, basis)
NOI/mo = rent × 0.92 − (ARV × 0.018)/12
DSCR = NOI / principal+interest
cash_left_in = basis − refi_loan
When cash_left_in reaches zero the refinance returned your whole basis. That's
full capital recovery, so cash-on-cash has no denominator: the packet sets
capital_recovered: true rather than leaving the field blank.
Every assumption above is named in underwriting.assumptions on each packet,
including the DSCR convention (NOI over principal and interest, with taxes and insurance
carried inside NOI). A lender will ask.
Buyboxes
A buybox is the set of rules everything gets scored against. Hard rules fail the whole packet; soft rules only reduce the score. Free includes one, Pro three, Team unlimited.
| Field | Type | Rule |
|---|---|---|
purchase_min / purchase_max | number | hard |
arv_min | number | hard |
sqft_min / sqft_max | number | hard |
beds_exact | number | hard |
baths_min | number | hard |
year_built_min | number | soft — reduces score, doesn't fail |
construction_in | string[] | hard, substring match |
rehab_budget_default | number | drives rehab all-in |
rehab_contingency_pct | number | default 10 |
equity_target | number | hard, drives mao_buybox |
states, center_lat, center_lon, radius_mi |
— | stored, not yet enforced |
What costs what
Two tools consume packets: get_deal (one) and screen_deals (one third
per address). Everything else is free, forever, on every plan. Overage is off by default on
paid plans and takes a ceiling you set, so an agent stuck in a retry loop gets refused rather
than billed. Full detail on the pricing page.
Compliance
Owner contact data is returned for property-acquisition outreach. It is not a consumer report and is not for credit, employment, insurance or tenant-screening decisions. Every packet says so on its face.
Every number found is returned. Numbers on the National Do Not Call registry are flagged loudly rather than silently dropped — you need to know a number exists even when you shouldn't dial it. The outreach notice leads with mail and email. Your TCPA and state-level obligations for how you contact people remain yours.
The title and CPA views state plainly that they are starting points, not opinions. Valuation and rent figures are automated estimates, not appraisals. See the Acceptable Use section.
Troubleshooting
The server doesn't appear in my client
Check node --version is 20 or newer, then restart the client completely — most
MCP clients only read their config at launch. Claude Desktop logs to
~/Library/Logs/Claude/mcp*.log on macOS.
"Invalid or revoked API key"
The key in DEALPACKET_API_KEY doesn't match an active key. Keys start
dp_live_. Email hello@dealpacket.com
and we'll reissue.
"That key was rejected by RentCast"
set_data_key verifies before storing. Confirm the key at
app.rentcast.io/app/api,
and confirm you're on an API plan rather than the platform subscription.
I've hit my packet limit
Two ways forward, and the first is free: add your own RentCast key with
set_data_key and metering stops entirely, or
upgrade so we run the data account and you get
owner contact and bulk screening.
A field came back empty
Coverage varies by county. Check provenance for that field — it names the source
and the fetch time, and distinguishes what was measured from what was derived. Nothing in a
packet is invented to fill a gap.