@sfranalytics/mcp 0.6.3 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/http.js +69 -3
- package/dist/http.js.map +1 -1
- package/dist/landing.js +17 -4
- package/dist/landing.js.map +1 -1
- package/dist/tools/formatters.js +4 -0
- package/dist/tools/formatters.js.map +1 -1
- package/dist/tools/plr/loansNearby.js +100 -84
- package/dist/tools/plr/loansNearby.js.map +1 -1
- package/dist/tools/plr/transactionHistory.js +67 -50
- package/dist/tools/plr/transactionHistory.js.map +1 -1
- package/dist/tools/sfr/bestBuyers.js +58 -41
- package/dist/tools/sfr/bestBuyers.js.map +1 -1
- package/dist/tools/sfr/buyerProfile.js +6 -3
- package/dist/tools/sfr/buyerProfile.js.map +1 -1
- package/dist/tools/sfr/getProperty.js +147 -124
- package/dist/tools/sfr/getProperty.js.map +1 -1
- package/dist/tools/sfr/propertyBatch.js +3 -1
- package/dist/tools/sfr/propertyBatch.js.map +1 -1
- package/dist/tools/sfr/propertyComps.js +51 -34
- package/dist/tools/sfr/propertyComps.js.map +1 -1
- package/dist/tools/sfr/propertyTransactions.js +48 -31
- package/dist/tools/sfr/propertyTransactions.js.map +1 -1
- package/dist/tools/sfr/rentalComparables.js +83 -66
- package/dist/tools/sfr/rentalComparables.js.map +1 -1
- package/dist/tools/sfr/rentalMarketAnalysis.js +5 -2
- package/dist/tools/sfr/rentalMarketAnalysis.js.map +1 -1
- package/dist/tools/sfr/searchProperties.js +3 -1
- package/dist/tools/sfr/searchProperties.js.map +1 -1
- package/dist/tools/sfr/topBuyers.js +4 -1
- package/dist/tools/sfr/topBuyers.js.map +1 -1
- package/dist/tools/sfr/zipDetail.js +83 -72
- package/dist/tools/sfr/zipDetail.js.map +1 -1
- package/dist/tools/sfr/zipFinder.js +24 -15
- package/dist/tools/sfr/zipFinder.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,8 +2,12 @@ import { z } from "zod";
|
|
|
2
2
|
import { structuredResult, markdownTable, truncatedJson } from "../formatters.js";
|
|
3
3
|
import { registerToolSafe } from "../registerToolSafe.js";
|
|
4
4
|
import { action } from "../nextActions.js";
|
|
5
|
+
import { ApiError } from "../../services/httpClient.js";
|
|
5
6
|
const Input = z.object({
|
|
6
|
-
propertyAddress: z.string().describe("Full property address
|
|
7
|
+
propertyAddress: z.string().describe("Full property address exactly as recorded (e.g. '123 Main St, Phoenix, AZ 85004'). " +
|
|
8
|
+
"Must match dataset precisely — abbreviations (St/Ave/Blvd), directional prefixes (N/S/E/W), " +
|
|
9
|
+
"and unit numbers matter. If unsure, use sfr_search_properties with the zip code first to find " +
|
|
10
|
+
"the canonical address."),
|
|
7
11
|
page: z.coerce.number().default(1).describe("Page number (default 1)"),
|
|
8
12
|
pageSize: z.coerce.number().default(10).describe("Results per page (default 10, max 25)"),
|
|
9
13
|
});
|
|
@@ -16,59 +20,72 @@ export function registerTransactionHistoryTool(server, plr) {
|
|
|
16
20
|
"Complements sfr_property_transactions which shows deeds/sales.",
|
|
17
21
|
inputSchema: Input,
|
|
18
22
|
}, async (args) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
23
|
+
try {
|
|
24
|
+
const body = {
|
|
25
|
+
property_address: args.propertyAddress,
|
|
26
|
+
page: args.page,
|
|
27
|
+
page_size: Math.min(args.pageSize, 25),
|
|
28
|
+
};
|
|
29
|
+
const data = await plr.transactionHistory(body);
|
|
30
|
+
const items = data?.results ?? data?.data ?? (Array.isArray(data) ? data : []);
|
|
31
|
+
const total = data?.count ?? items.length;
|
|
32
|
+
const lines = [
|
|
33
|
+
`## Private Lending History — ${args.propertyAddress}`,
|
|
34
|
+
`**Total:** ${total} transactions`,
|
|
35
|
+
"",
|
|
36
|
+
];
|
|
37
|
+
if (items.length > 0) {
|
|
38
|
+
const fmt$ = (v) => v != null && Number(v) > 0 ? `$${Number(v).toLocaleString()}` : "—";
|
|
39
|
+
const rows = items.slice(0, 20).map((t) => [
|
|
40
|
+
t.recording_date ?? "—",
|
|
41
|
+
t.tx_type ?? t.transaction_type_clean ?? "—",
|
|
42
|
+
fmt$(t.sale_amt),
|
|
43
|
+
t.buyer_borrower1_name ?? "—",
|
|
44
|
+
t.seller1_name ?? "—",
|
|
45
|
+
t.lender_clean ?? t.first_mtg_lender_name ?? "—",
|
|
46
|
+
fmt$(t.first_mtg_amt),
|
|
47
|
+
]);
|
|
48
|
+
lines.push(markdownTable(["Date", "Type", "Sale Price", "Buyer", "Seller", "Lender", "Mortgage"], rows));
|
|
49
|
+
if (data.property_details) {
|
|
50
|
+
const pd = data.property_details;
|
|
51
|
+
lines.push("", "### Property Details");
|
|
52
|
+
const detailLines = [
|
|
53
|
+
pd.avm_value ? `**AVM:** $${Number(pd.avm_value).toLocaleString()}` : null,
|
|
54
|
+
pd.market_value ? `**Market Value:** $${Number(pd.market_value).toLocaleString()}` : null,
|
|
55
|
+
pd.owner ? `**Owner:** ${pd.owner}` : null,
|
|
56
|
+
pd.property_type ? `**Type:** ${pd.property_type}` : null,
|
|
57
|
+
pd.beds ? `**Beds:** ${pd.beds}` : null,
|
|
58
|
+
pd.total_sqft ? `**Sqft:** ${pd.total_sqft}` : null,
|
|
59
|
+
].filter(Boolean);
|
|
60
|
+
lines.push(detailLines.join(" | "));
|
|
61
|
+
}
|
|
56
62
|
}
|
|
63
|
+
else {
|
|
64
|
+
lines.push("_No private lending transactions found for this property._");
|
|
65
|
+
if (data && typeof data === "object") {
|
|
66
|
+
lines.push("```json");
|
|
67
|
+
lines.push(truncatedJson(data, 2000));
|
|
68
|
+
lines.push("```");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const actions = [
|
|
72
|
+
action("sfr_get_property", "Full property details & valuation", { address: args.propertyAddress }),
|
|
73
|
+
action("plr_loans_nearby", "Other loans in the area", { propertyAddress: args.propertyAddress }),
|
|
74
|
+
action("sfr_property_transactions", "Deed & sale history", { address: args.propertyAddress }),
|
|
75
|
+
];
|
|
76
|
+
return structuredResult(lines.join("\n"), { items, total, page: args.page }, actions);
|
|
57
77
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
78
|
+
catch (err) {
|
|
79
|
+
if (err instanceof ApiError && err.status === 404) {
|
|
80
|
+
const zipMatch = args.propertyAddress.match(/\b(\d{5})\b/);
|
|
81
|
+
const zip = zipMatch?.[1];
|
|
82
|
+
return structuredResult(`## Private Lending History — ${args.propertyAddress}\n\n` +
|
|
83
|
+
`_Property not found at this address. The address must exactly match the dataset ` +
|
|
84
|
+
`(including directional prefixes like 'E'/'W', abbreviations like 'St'/'Ave', and unit numbers). ` +
|
|
85
|
+
`Use sfr_search_properties with the zip code to find the canonical address._`, { address: args.propertyAddress, error: "not_found" }, [action("sfr_search_properties", "Search by zip to find correct address", zip ? { search_type: "zip", zips: zip } : undefined)]);
|
|
64
86
|
}
|
|
87
|
+
throw err;
|
|
65
88
|
}
|
|
66
|
-
const actions = [
|
|
67
|
-
action("sfr_get_property", "Full property details & valuation", { address: args.propertyAddress }),
|
|
68
|
-
action("plr_loans_nearby", "Other loans in the area", { propertyAddress: args.propertyAddress }),
|
|
69
|
-
action("sfr_property_transactions", "Deed & sale history", { address: args.propertyAddress }),
|
|
70
|
-
];
|
|
71
|
-
return structuredResult(lines.join("\n"), { items, total, page: args.page }, actions);
|
|
72
89
|
});
|
|
73
90
|
}
|
|
74
91
|
//# sourceMappingURL=transactionHistory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionHistory.js","sourceRoot":"","sources":["../../../src/tools/plr/transactionHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"transactionHistory.js","sourceRoot":"","sources":["../../../src/tools/plr/transactionHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,12 @@ import { z } from "zod";
|
|
|
2
2
|
import { structuredResult, markdownTable, truncatedJson } from "../formatters.js";
|
|
3
3
|
import { action } from "../nextActions.js";
|
|
4
4
|
import { registerToolSafe } from "../registerToolSafe.js";
|
|
5
|
+
import { ApiError } from "../../services/httpClient.js";
|
|
5
6
|
const Input = z.object({
|
|
6
|
-
address: z.string().describe("Full property address
|
|
7
|
+
address: z.string().describe("Full property address exactly as recorded (e.g. '123 Main St, Phoenix, AZ 85004'). " +
|
|
8
|
+
"Must match dataset precisely — abbreviations (St/Ave/Blvd), directional prefixes (N/S/E/W), " +
|
|
9
|
+
"and unit numbers matter. If unsure, use sfr_search_properties with the zip code first to find " +
|
|
10
|
+
"the canonical address."),
|
|
7
11
|
});
|
|
8
12
|
export function registerBestBuyersTool(server, sfr) {
|
|
9
13
|
registerToolSafe(server, "sfr_best_buyers", {
|
|
@@ -13,48 +17,61 @@ export function registerBestBuyersTool(server, sfr) {
|
|
|
13
17
|
"Ideal for sellers, wholesalers, or agents matching properties to active buyers.",
|
|
14
18
|
inputSchema: Input,
|
|
15
19
|
}, async (args) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
i
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
20
|
+
try {
|
|
21
|
+
const data = await sfr.getBestBuyers(args.address);
|
|
22
|
+
const buyers = data?.data ?? data?.buyers ?? (Array.isArray(data) ? data : []);
|
|
23
|
+
const lines = [
|
|
24
|
+
`## Best Buyers — ${args.address}`,
|
|
25
|
+
`**Matches:** ${buyers.length} investors`,
|
|
26
|
+
"",
|
|
27
|
+
];
|
|
28
|
+
if (buyers.length > 0) {
|
|
29
|
+
// API returns {name, matchScore, totalAcquisitions, recentPurchasesCount, matchReasons}
|
|
30
|
+
const rows = buyers.slice(0, 25).map((b, i) => [
|
|
31
|
+
i + 1,
|
|
32
|
+
b.name ?? b.buyer_name ?? "—",
|
|
33
|
+
b.totalAcquisitions ?? b.acquisitions ?? "—",
|
|
34
|
+
b.recentPurchasesCount ?? "—",
|
|
35
|
+
b.matchScore != null ? `${b.matchScore}%` : "—",
|
|
36
|
+
Array.isArray(b.matchReasons) ? b.matchReasons[0] ?? "—" : "—",
|
|
37
|
+
]);
|
|
38
|
+
lines.push(markdownTable(["#", "Buyer", "Total Acq.", "Recent", "Match", "Reason"], rows));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
lines.push("```json");
|
|
42
|
+
lines.push(truncatedJson(data, 3000));
|
|
43
|
+
lines.push("```");
|
|
44
|
+
}
|
|
45
|
+
// Slim buyers — keep match-specific fields, strip URL slugs
|
|
46
|
+
const slimBuyers = buyers.slice(0, 25).map((b) => ({
|
|
47
|
+
name: b.name ?? b.buyer_name,
|
|
48
|
+
totalAcquisitions: b.totalAcquisitions ?? b.acquisitions,
|
|
49
|
+
recentPurchasesCount: b.recentPurchasesCount,
|
|
50
|
+
purchasesWithinQuarterMile: b.purchasesWithinQuarterMile || undefined,
|
|
51
|
+
matchScore: b.matchScore,
|
|
52
|
+
matchReasons: b.matchReasons,
|
|
53
|
+
hasProfile: b.hasProfilePage || undefined,
|
|
54
|
+
hasContact: b.hasContactInfo || undefined,
|
|
55
|
+
}));
|
|
56
|
+
const firstName = buyers[0]?.name ?? buyers[0]?.buyer_name;
|
|
57
|
+
const actions = [
|
|
58
|
+
...(firstName ? [action("sfr_buyer_profile", "Profile top match", { name: firstName })] : []),
|
|
59
|
+
...(firstName ? [action("sfr_buyer_growth", "Growth trend for top match", { name: firstName })] : []),
|
|
60
|
+
action("sfr_get_property", "Full property details", { address: args.address }),
|
|
61
|
+
];
|
|
62
|
+
return structuredResult(lines.join("\n"), { items: slimBuyers, total: buyers.length, page: 1 }, actions);
|
|
34
63
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err instanceof ApiError && err.status === 404) {
|
|
66
|
+
const zipMatch = args.address.match(/\b(\d{5})\b/);
|
|
67
|
+
const zip = zipMatch?.[1];
|
|
68
|
+
return structuredResult(`## Best Buyers — ${args.address}\n\n` +
|
|
69
|
+
`_Property not found at this address. The address must exactly match the dataset ` +
|
|
70
|
+
`(including directional prefixes like 'E'/'W', abbreviations like 'St'/'Ave', and unit numbers). ` +
|
|
71
|
+
`Use sfr_search_properties with the zip code to find the canonical address._`, { address: args.address, error: "not_found" }, [action("sfr_search_properties", "Search by zip to find correct address", zip ? { search_type: "zip", zips: zip } : undefined)]);
|
|
72
|
+
}
|
|
73
|
+
throw err;
|
|
39
74
|
}
|
|
40
|
-
// Slim buyers — keep match-specific fields, strip URL slugs
|
|
41
|
-
const slimBuyers = buyers.slice(0, 25).map((b) => ({
|
|
42
|
-
name: b.name ?? b.buyer_name,
|
|
43
|
-
totalAcquisitions: b.totalAcquisitions ?? b.acquisitions,
|
|
44
|
-
recentPurchasesCount: b.recentPurchasesCount,
|
|
45
|
-
purchasesWithinQuarterMile: b.purchasesWithinQuarterMile || undefined,
|
|
46
|
-
matchScore: b.matchScore,
|
|
47
|
-
matchReasons: b.matchReasons,
|
|
48
|
-
hasProfile: b.hasProfilePage || undefined,
|
|
49
|
-
hasContact: b.hasContactInfo || undefined,
|
|
50
|
-
}));
|
|
51
|
-
const firstName = buyers[0]?.name ?? buyers[0]?.buyer_name;
|
|
52
|
-
const actions = [
|
|
53
|
-
...(firstName ? [action("sfr_buyer_profile", "Profile top match", { name: firstName })] : []),
|
|
54
|
-
...(firstName ? [action("sfr_buyer_growth", "Growth trend for top match", { name: firstName })] : []),
|
|
55
|
-
action("sfr_get_property", "Full property details", { address: args.address }),
|
|
56
|
-
];
|
|
57
|
-
return structuredResult(lines.join("\n"), { items: slimBuyers, total: buyers.length, page: 1 }, actions);
|
|
58
75
|
});
|
|
59
76
|
}
|
|
60
77
|
//# sourceMappingURL=bestBuyers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bestBuyers.js","sourceRoot":"","sources":["../../../src/tools/sfr/bestBuyers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"bestBuyers.js","sourceRoot":"","sources":["../../../src/tools/sfr/bestBuyers.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,8 +16,10 @@ export function registerBuyerProfileTool(server, sfr) {
|
|
|
16
16
|
"target property type, price range), geographic focus, related LLCs, and contact info. " +
|
|
17
17
|
"Includes flip vs hold percentages and target margin ranges. " +
|
|
18
18
|
"Returns relatedLLCs — use these names with sfr_flip_activity(buyer_name=) to find flip transactions across all entities. " +
|
|
19
|
+
"Note: relatedLLCs may return simplified/slug names rather than exact deed-recorded entity names for some investors. " +
|
|
19
20
|
"For iBuyer/flipper margin analysis, chain: buyer_profile → get relatedLLCs → sfr_flip_activity per LLC. " +
|
|
20
|
-
"
|
|
21
|
+
"Profiles exist for investors with significant recorded transaction volume (typically 50+ acquisitions). " +
|
|
22
|
+
"Smaller investors won't have profiles — use sfr_top_buyers to discover names. " +
|
|
21
23
|
"For acquisition trends over time, use sfr_buyer_growth. " +
|
|
22
24
|
"CHAIN: Use plr_borrower_search with the investor name to check if they borrow from private lenders.",
|
|
23
25
|
inputSchema: Input,
|
|
@@ -152,8 +154,9 @@ export function registerBuyerProfileTool(server, sfr) {
|
|
|
152
154
|
if (err instanceof ApiError && err.status === 404) {
|
|
153
155
|
const slug = slugifyBuyerName(args.name);
|
|
154
156
|
return structuredResult(`## Investor Profile — ${args.name}\n\n` +
|
|
155
|
-
`_No profile found (slug: "${slug}").
|
|
156
|
-
`
|
|
157
|
+
`_No profile found (slug: "${slug}"). Profiles exist only for investors with significant transaction volume ` +
|
|
158
|
+
`(typically 50+ acquisitions). Note: sfr_top_buyers may show hasProfile=true for buyers whose profiles ` +
|
|
159
|
+
`don't resolve — this is a known upstream data inconsistency. Use sfr_top_buyers to discover names._`, { name: args.name, slug, error: "not_found" }, [action("sfr_top_buyers", "Find buyers with profiles", {})]);
|
|
157
160
|
}
|
|
158
161
|
throw err;
|
|
159
162
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyerProfile.js","sourceRoot":"","sources":["../../../src/tools/sfr/buyerProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACvB,yEAAyE;QACzE,qEAAqE,CACtE;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,GAAc;IACxE,gBAAgB,CAAC,MAAM,EACrB,mBAAmB,EACnB;QACE,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EACT,oEAAoE;YACpE,wFAAwF;YACxF,wFAAwF;YACxF,8DAA8D;YAC9D,2HAA2H;YAC3H,0GAA0G;YAC1G,
|
|
1
|
+
{"version":3,"file":"buyerProfile.js","sourceRoot":"","sources":["../../../src/tools/sfr/buyerProfile.ts"],"names":[],"mappings":"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"}
|