dealflowpro-mcp-server
This server lets you underwrite and screen multifamily real estate deals through four read-only MCP tools.
Analyze a deal in depth: cap rate, cash-on-cash, DSCR, IRR, DFP Score, max offer price, and yearly cashflows.
Quick-score a deal with the DFP 0–100 scale and key metrics for fast screening.
Reverse-calculate a maximum offer price from target cap rate, cash-on-cash, DSCR, and/or IRR.
Look up market data for an address, including flood zone, neighborhood income vs. state median, and job growth.
DealFlowPro MCP Server
Analyze multifamily real estate deals from Claude Code, Cursor, Claude Desktop, or any MCP-compatible client.
DealFlowPro is an AI-powered multifamily deal analysis platform. This MCP server wraps the DealFlowPro REST API, giving AI agents access to institutional-grade underwriting calculations.
Demo
Related MCP server: Estaite Solutions
What You Can Do
Ask Claude naturally and it calls the right tool:
"Analyze this 24-unit deal in Charlotte — asking $2M, $13.6K/mo rent, $5.5K expenses"
"Score this deal: 12 units, $1.5M, $9K monthly income"
"What's the max I should offer on a property with $28.8K/mo rent if I want 8% cash-on-cash?"
"Is this property in a flood zone? 2909 Burgess Dr, Charlotte, NC"
Tools
Tool | Description |
| Full deal analysis: cap rate, DSCR, cash-on-cash, IRR, DFP Score (0-100), max offer price, yearly cashflows |
| Quick screening: DFP Score + key metrics |
| Max offer price from target returns (cap rate, CoC, DSCR, IRR) and an optional price-per-unit ceiling |
| Flood zone, neighborhood income vs state median, job growth for any address |
All four carry MCP 2025-06-18 annotations (title, readOnlyHint, destructiveHint, idempotentHint, openWorldHint). Every tool is read-only.
Install as a Claude plugin
This repo doubles as a Claude Code / Cowork plugin. The plugin connects to the
remote server at https://dealflowpro.io/mcp rather than the npm package above,
which means:
Eight tools instead of four. Adds
list_my_deals,get_deal_analysis,get_my_criteria, andportfolio_summary— your saved deals, buy-box criteria, and pipeline, scoped to your account.OAuth instead of an API key. No
DFP_API_KEYto export; you sign in to your DealFlowPro account when the plugin connects.
claude --plugin-dir /path/to/dealflowpro-mcp-serverUse the npm package below instead if you want a local stdio server, prefer API key auth, or are wiring DealFlowPro into a non-Claude MCP client.
For Institutional AI Teams
DealFlowPro is built to slot into AI eval pipelines and production AI stacks. The MCP server (this package, plus the remote endpoint at https://dealflowpro.io/mcp) wraps the same engine as the REST API — schema-strict, idempotent, predictable.
Auth + scoping. Every tool call is authenticated, with a Bearer API key or, on the remote endpoint, an OAuth sign-in. Calls are scoped to the account that issued the key or signed in — no cross-tenant access path. Per-tool audit lines land in your account's logs/mcp_tool_calls.log capturing tool name + flattened arg keys (not values) — usage is auditable without exposing deal contents.
Rate limits per tier.
Tier | Daily limit | Monthly | Cost |
Free | 5 requests, lifetime | — | free, no card |
Pay-as-you-go | balance-based | per credits | $1/request |
Essentials | 50 req/day | ~1,500 | $79/mo |
Premium | 200 req/day | ~6,000 | $149/mo |
Enterprise | 1,000 req/day | ~30,000 | $399/mo |
Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) returned on every response. 429 responses include Retry-After.
Error codes. Stable, documented at dealflowpro.io/api/docs/#errors — all errors are JSON {success: false, error: {code, message}} shape. Codes: invalid_input (400), invalid_json (400), unauthorized (401), tier_required (403), method_not_allowed (405), payload_too_large (413), rate_limit_exceeded (429), internal_error (500).
Tool schemas. Each MCP tool has a schema-strict input definition. Call tools/list against the remote endpoint to get the canonical schemas at runtime; the REST OpenAPI spec covers the same shapes for the four compute tools (analyze_deal, score_deal, reverse_calc, market_data). The four saved-pipeline tools on the remote server (list_my_deals, get_deal_analysis, get_my_criteria, portfolio_summary) are MCP-only and need an Essentials plan or higher.
Eval harness pattern. For benchmarking, the recommended pattern: maintain a fixture set of (deal payload → expected metrics) pairs, run each against score_deal (the lightest tool; each call still counts as one request, so budget for it under the tier table above), assert metrics within tolerance. The endpoint is deterministic — same inputs produce the same outputs.
Data handling. Request payloads are processed in memory and not persisted to disk. TLS 1.2+ in transit. Anthropic API calls (when DealFlowPro internally uses Claude for document extraction) flow through DealFlowPro's zero-data-retention Anthropic workspace. Full posture: dealflowpro.io/security#api-mcp-data-handling.
Setup
You have two install paths — pick the one that matches your client.
Path A — Remote MCP URL (no local install)
Use this for claude.ai web (Custom Connectors), Claude Code with HTTP transport, or Claude API mcp_servers. The endpoint is https://dealflowpro.io/mcp (Streamable HTTP, MCP 2025-06-18).
claude.ai web / Claude Desktop: DealFlowPro is listed in the Claude Connectors Directory, where you can add it directly, or you can add it yourself as a custom connector — Customize → Connectors → "Add custom connector" → name it DealFlowPro, paste https://dealflowpro.io/mcp → Add → Connect → sign in to DealFlowPro → click Allow. OAuth handles auth automatically (no API key to manage). Then in a chat, click "+" → Connectors → toggle DealFlowPro on.
Add DealFlowPro to Claude → — opens the dialog with the name and URL pre-filled. You still review and confirm before anything is added.
Team / Enterprise plans: members cannot add custom connectors themselves. An organization Owner adds it once under Organization settings → Connectors → Add → Custom (type: Web), and each member then connects their own DealFlowPro account from Customize → Connectors.
Claude Code (HTTP):
claude mcp add dealflowpro \
--transport http \
--url https://dealflowpro.io/mcp \
--header "Authorization: Bearer dfp_sk_your_key_here"Claude API:
POST https://api.anthropic.com/v1/messages
anthropic-beta: mcp-client-2025-11-20
{
"mcp_servers": [{
"type": "url",
"url": "https://dealflowpro.io/mcp",
"name": "dealflowpro",
"authorization_token": "dfp_sk_your_key_here"
}],
...
}Get a Bearer key (free 5-request key, no card, or pay-as-you-go credits) at dealflowpro.io/api.
Full setup details + Connected Apps revocation: dealflowpro.io/api/docs#mcp.
Path B — Local stdio (this npm package)
Use this anywhere you want the MCP server running locally instead of remote — or for a client that has no remote-URL path of its own. Claude Desktop supports both: remote via Settings → Connectors, or the local config below.
1. Get an API key. Visit dealflowpro.io/api to claim a free 5-request key (no card) or buy pay-as-you-go credits. Delivered by email.
2. Add to your client.
Claude Desktop — claude_desktop_config.json:
{
"mcpServers": {
"dealflowpro": {
"command": "npx",
"args": ["-y", "dealflowpro-mcp"],
"env": {
"DFP_API_KEY": "dfp_sk_your_key_here"
}
}
}
}Claude Code:
claude mcp add dealflowpro -e DFP_API_KEY=dfp_sk_your_key_here -- npx -y dealflowpro-mcpUse It
Just ask Claude about a deal. It automatically picks the right tool.
Example Output
## Deal Analysis Results
**DFP Score: 19/100 (Poor)**
### Key Metrics
| Metric | Value |
|--------|-------|
| Cap Rate | 4.48% |
| DSCR | 0.86 |
| Cash-on-Cash | -1.95% |
| IRR | -12.17% |
| NOI | $89,524 |
### Max Offer Price
**$1,197,476** (binding constraint: cash-on-cash)API Documentation
Full REST API docs at dealflowpro.io/api/docs
Pricing
Pay-as-you-go: $1/API request, starting at $5
Essentials: 50 API requests/day included ($79/mo)
Premium: 200 requests/day + reverse calculator ($149/mo)
Enterprise: 1,000 requests/day ($399/mo)
Requirements
Node.js 18+
DealFlowPro API key
About DealFlowPro
DealFlowPro automates multifamily underwriting for 2-200 unit properties. Upload a broker email or OM and get a full investment analysis in 10 minutes instead of 2 hours. Used by operators, syndicators, and PE firms to screen deals faster.
License
MIT
Available Tools
4 toolsanalyze_dealAnalyze Multifamily DealARead-onlyIdempotent
Analyze a multifamily real estate deal. Returns cap rate, cash-on-cash, DSCR, IRR, DFP Score (0-100), max offer price, and full financial projections. Use this when someone asks about analyzing a property, evaluating a deal, or running the numbers on a multifamily investment.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Number of apartment units | |
| scenario | No | Defaults to current: in-place numbers with DFP's default 7% vacancy. proforma applies forward-looking defaults (5% vacancy) and returns more favorable figures for the same deal. Pass it explicitly when comparing results. | |
| year_built | No | Year the property was built | |
| assumptions | No | Override default underwriting assumptions | |
| income_source | No | Where monthly_income came from, e.g. RentRoll, T12, OM, Screen. Raises the confidence rating on the result. | |
| expense_source | No | Where monthly_expenses came from, e.g. T12, OperatingStatement, OM, Screen. Raises the confidence rating on the result. | |
| monthly_income | Yes | Total monthly rental income in dollars | |
| purchase_price | Yes | Asking/purchase price in dollars | |
| monthly_expenses | No | Total monthly operating expenses in dollars (if omitted, 50% of income is assumed) | |
| property_address | No | Full street address. Drives the market data behind the DFP Score; without it the market component is understated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so side-effect concerns are covered. The description adds the return payload contents, which annotations cannot express, but says nothing about computation caveats (defaults applied silently, confidence rating, market data dependency) that a caller should know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with purpose and outputs before the usage hint; there is no filler. The only marginal waste is the usage clause, which largely repeats the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, a nested assumptions object, and no output schema, the description does the important work of listing return values and framing the tool as a full underwriting run. It stops short of noting required inputs (purchase_price, monthly_income) or the confidence-rating mechanics, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including nuanced documentation for scenario, interest-basis, and the expense default, so the schema carries the parameter burden. The description adds no parameter guidance of its own (e.g., which fields are required or how source fields affect confidence), making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Analyze a multifamily real estate deal') and enumerates the concrete outputs (cap rate, cash-on-cash, DSCR, IRR, DFP Score, max offer price, projections), which tells an agent what it gets back. It does not, however, differentiate itself from the sibling score_deal, which presumably also produces the DFP Score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage sentence gives trigger phrasings ('analyzing a property, evaluating a deal, running the numbers'), but those are essentially restatements of the tool name rather than real selection criteria. With siblings reverse_calc, market_data, and score_deal present, no exclusion or alternative routing is offered, so the agent must infer boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_dataLookup Property Market DataARead-only
Look up market intelligence for a property address. Returns flood zone, neighborhood income relative to state median, and job growth rate. Use this when someone asks about a market, neighborhood, or location.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ZIP code (extracted from address if not provided) | |
| address | Yes | Full property address including city and state (e.g., '2909 Burgess Dr, Charlotte, NC 28208') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, and idempotentHint=false, covering the safety and world-awareness profile. The description adds the specific return fields (flood zone, income relative to state median, job growth rate), which is useful context beyond annotations. However, it does not describe any additional behavioral nuances such as data freshness, rate limits, or edge cases (e.g., missing data for some addresses). Given the annotations handle the core safety traits, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero wasted words. It leads with the primary action ('Look up market intelligence for a property address'), then lists the specific returned data, and finally gives usage guidance. Each sentence earns its place; there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with no output schema, the description adequately covers what the tool does, what it returns, and when to use it. The parameter schema fully documents inputs. However, it doesn't mention potential caveats such as data availability for certain addresses or any limitations on geographic coverage. While not critical, this leaves a small gap in completeness for an agent that might need to handle edge cases. A score of 4 reflects this minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both 'address' and 'zip' have descriptive text in the schema (address includes full property address example, zip mentions auto-extraction). The description does not add any parameter-specific semantics beyond what the schema already provides. Baseline 3 is correct when the schema carries the full parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'look up' and the resource 'market intelligence for a property address', and explicitly lists the specific data returned (flood zone, neighborhood income relative to state median, job growth rate). This distinguishes it from sibling tools like analyze_deal, score_deal, and reverse_calc, which focus on deal analysis and calculations rather than property market data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use this when someone asks about a market, neighborhood, or location.' This gives a clear trigger for when to invoke the tool. It does not explicitly mention alternatives or when not to use it, but the context of siblings (deal analysis, scoring, reverse calc) makes the distinction implicit. A clear usage trigger without exclusions earns a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reverse_calcReverse-Calculate Max Offer PriceARead-onlyIdempotent
Calculate the maximum offer price for a multifamily deal based on target return metrics. Back-solves from your desired cap rate, cash-on-cash, DSCR, and/or IRR to find what you should pay. Use this when someone asks 'what should I offer?' or 'what's the max price?'
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Number of apartment units | |
| targets | Yes | Target return metrics — provide at least one | |
| scenario | No | Defaults to current: in-place numbers with DFP's default 7% vacancy. proforma applies forward-looking defaults (5% vacancy) and returns more favorable figures for the same deal. Pass it explicitly when comparing results. | |
| assumptions | No | Override default underwriting assumptions | |
| monthly_income | Yes | Total monthly rental income in dollars | |
| monthly_expenses | No | Total monthly operating expenses in dollars |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true and closed-world, so the safety profile needs no restating. The description adds only the general 'back-solves' framing; it does not disclose output shape, what happens when no target is reachable, or how conflicts among multiple targets are resolved — notable for a nested, constraint-solving tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then the mechanism, then the trigger phrasing. No filler and no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param tool with a nested targets object, the description gives enough intent-level framing and the schema covers semantics in full. With no output schema, the description could say more about what comes back (e.g., a max price plus the binding constraint), which is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the nuanced 'at least one' constraint on targets and the scenario defaults, so the schema carries the parameter burden. The description repeats the target metric names but adds nothing about scenario, price_per_unit, or assumption overrides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('calculate the maximum offer price for a multifamily deal') and names the mechanism ('back-solves from your desired cap rate, cash-on-cash, DSCR, and/or IRR'). This cleanly separates it from sibling tools analyze_deal and score_deal, which read as forward analyses rather than a price solve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrases ('what should I offer?' / 'what's the max price?') that map an intent directly onto the tool. It stops short of naming alternatives or stating exclusions — e.g., when to prefer analyze_deal or score_deal instead — so it lands at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_dealScore Multifamily Deal (Quick)ARead-onlyIdempotent
Quick-score a multifamily deal on the DFP 0-100 scale. Returns the DFP Score and key metrics. Faster than full analysis — use this for quick screening.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Number of apartment units | |
| assumptions | No | Only the interest basis can be overridden on a quick score (it feeds IRR and cash-on-cash); use analyze_deal for other assumptions | |
| income_source | No | Where monthly_income came from, e.g. RentRoll, T12, OM, Screen. Raises the confidence rating on the result. | |
| expense_source | No | Where monthly_expenses came from, e.g. T12, OperatingStatement, OM, Screen. Raises the confidence rating on the result. | |
| monthly_income | Yes | Total monthly rental income in dollars | |
| purchase_price | Yes | Asking/purchase price in dollars | |
| monthly_expenses | No | Total monthly operating expenses in dollars | |
| property_address | No | Full street address. Drives the market data behind the DFP Score; without it the market component is understated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds that it returns a DFP Score plus 'key metrics' and that it is faster, but says nothing about how the confidence rating is affected, what 'key metrics' includes, or how missing optional data degrades the score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero padding, with the core purpose and scale front-loaded and the speed/screening guidance last. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with a nested assumptions object and no output schema, the description covers the headline return value but leaves 'key metrics' undefined and does not warn that omitting property_address understates the market component — a caveat that only appears buried in the schema. Adequate against a fully documented schema, but not complete on its own.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the nested `assumptions` object is documented in the schema itself. The description adds no parameter-level meaning of its own (no mention of the required purchase_price/monthly_income pair or that property_address drives the market component), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Quick-score a multifamily deal') plus the output scale ('DFP 0-100'), which is concrete enough to distinguish it from generic analysis tools. It differentiates itself from full analysis by calling itself 'quick', but never names the sibling `analyze_deal` that is the actual alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Faster than full analysis — use this for quick screening' gives a clear usage context and implicitly routes deep work elsewhere. It never states an explicit when-not-to-use condition (e.g. when assumptions other than interest basis are needed, which the schema hints at via `analyze_deal`).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.4.0- Changed
reverse_calc1 field changed- added
Input schema / properties / targets / properties / price_per_unitAdded value: +{ + "description": "Maximum price per unit in dollars (e.g., 120000). Requires units.", + "type": "number" +}
3 tool updates
v1.3.0- Changed
analyze_deal2 fields changed- added
Input schema / properties / assumptions / properties / interest-basisAdded value: +{ + "description": "First mortgage interest basis. 365-360: interest accrues at rate x 365/360 (commercial / agency convention); 30-360: every month counts as 30 days. Omitted: the account's Settings default", + "enum": [ + "365-360", + "30-360" + ], + "type": "string" +} - added
Input schema / properties / assumptions / properties / second-mortgage-interest-basisAdded value: +{ + "description": "Second mortgage interest basis, same values", + "enum": [ + "365-360", + "30-360" + ], + "type": "string" +}
- Changed
reverse_calc2 fields changed- added
Input schema / properties / assumptions / properties / interest-basisAdded value: +{ + "description": "First mortgage interest basis. 365-360: interest accrues at rate x 365/360 (commercial / agency convention); 30-360: every month counts as 30 days. Omitted: the account's Settings default", + "enum": [ + "365-360", + "30-360" + ], + "type": "string" +} - added
Input schema / properties / assumptions / properties / second-mortgage-interest-basisAdded value: +{ + "description": "Second mortgage interest basis, same values", + "enum": [ + "365-360", + "30-360" + ], + "type": "string" +}
- Changed
score_deal1 field changed- added
Input schema / properties / assumptionsAdded value: +{ + "description": "Only the interest basis can be overridden on a quick score (it feeds IRR and cash-on-cash); use analyze_deal for other assumptions", + "properties": { + "interest-basis": { + "description": "First mortgage interest basis. 365-360: interest accrues at rate x 365/360 (commercial / agency convention); 30-360: every month counts as 30 days. Omitted: the account's Settings default", + "enum": [ + "365-360", + "30-360" + ], + "type": "string" + }, + "second-mortgage-interest-basis": { + "description": "Second mortgage interest basis, same values", + "enum": [ + "365-360", + "30-360" + ], + "type": "string" + } + }, + "type": "object" +}
3 tool updates
v1.2.9- Changed
analyze_deal4 fields changed- added
Input schema / properties / expense_sourceAdded value: +{ + "description": "Where monthly_expenses came from, e.g. T12, OperatingStatement, OM, Screen. Raises the confidence rating on the result.", + "type": "string" +} - added
Input schema / properties / income_sourceAdded value: +{ + "description": "Where monthly_income came from, e.g. RentRoll, T12, OM, Screen. Raises the confidence rating on the result.", + "type": "string" +} - changed
Input schema / properties / property_address / descriptionPrevious value: -"Property location (city, state)"New value: +"Full street address. Drives the market data behind the DFP Score; without it the market component is understated." - added
Input schema / properties / scenarioAdded value: +{ + "description": "Defaults to current: in-place numbers with DFP's default 7% vacancy. proforma applies forward-looking defaults (5% vacancy) and returns more favorable figures for the same deal. Pass it explicitly when comparing results.", + "enum": [ + "current", + "proforma" + ], + "type": "string" +}
- Changed
reverse_calc1 field changed- added
Input schema / properties / scenarioAdded value: +{ + "description": "Defaults to current: in-place numbers with DFP's default 7% vacancy. proforma applies forward-looking defaults (5% vacancy) and returns more favorable figures for the same deal. Pass it explicitly when comparing results.", + "enum": [ + "current", + "proforma" + ], + "type": "string" +}
- Changed
score_deal3 fields changed- added
Input schema / properties / expense_sourceAdded value: +{ + "description": "Where monthly_expenses came from, e.g. T12, OperatingStatement, OM, Screen. Raises the confidence rating on the result.", + "type": "string" +} - added
Input schema / properties / income_sourceAdded value: +{ + "description": "Where monthly_income came from, e.g. RentRoll, T12, OM, Screen. Raises the confidence rating on the result.", + "type": "string" +} - changed
Input schema / properties / property_address / descriptionPrevious value: -"Property location"New value: +"Full street address. Drives the market data behind the DFP Score; without it the market component is understated."
4 tool updates
v0.1.0- First observed
analyze_deal - First observed
market_data - First observed
reverse_calc - First observed
score_deal
TDQS
Scored across 4 tools
analyze_deal and score_deal overlap because both return DFP scores and key metrics, and analyze_deal also returns max offer price, which overlaps with reverse_calc. The descriptions do clarify quick screening vs. full analysis vs. target-return back-solving, so boundaries are mostly clear but not perfectly distinct.
All tool names use lowercase snake_case, which is consistent and readable. However the patterns vary slightly: analyze_deal and score_deal are verb_noun, market_data is noun_noun, and reverse_calc uses an abbreviation.
Four tools are well-scoped for a focused multifamily deal-analysis server. Each covers a distinct workflow stage: quick screening, full analysis, max-offer calculation, and market intelligence.
The core deal workflow is covered: quick score, full analysis, reverse max-offer calculation, and market data lookup. Minor gaps include comparing multiple deals, saving/retrieving deals, or richer rental comps, but agents can work around these with the current surface.
Maintenance
Related MCP Connectors
Real estate deal underwriting, rent rolls, T12s and portfolio data for your DeCyph team.
Free real-estate underwriting, no key or account. 6 strategies, stress tests, max offer.
Real-estate underwriting, BRRRR, comps, valuation, distress search, rent-roll and T12 parsing.
Lender-grade real estate underwriting and deal reports: fix and flip, BRRRR, new construction.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceLive real estate market data for 895 US metros. Ask your AI assistant about home prices, rental yields, investment health scores, migration trends, and affordability. Free tier covers top 50 markets (no account needed). Premium tier unlocks all 895 markets, HUD Fair Market Rents, side-by-side market comparison, and filtered market search.MIT
- AlicenseNot gradedqualityDmaintenanceSubmarket-level US residential rental intelligence for AI agents. Search, compare, rank, and analyze rent data, trends, vacancy, affordability, and days on market across 1,000+ named submarkets in the 20+ largest US metros. ZIP-level and metro-level queries included. Always current, always expanding. Free tier available.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to analyze rental property deals using DoorVault IDEAL Scoring v2.0, including Section 8 FMR lookup, tax deduction checklists, and rental metrics calculations.MIT
- FlicenseNot gradedqualityDmaintenanceA headless MCP connector that lets you underwrite commercial and multifamily deals inside a Claude chat, providing exact arithmetic for NOI, valuation, debt sizing, DSCR, and returns.-