@sfranalytics/mcp 0.6.2 → 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/README.md +67 -50
- package/dist/analytics/logger.d.ts +3 -0
- package/dist/analytics/logger.js +39 -0
- package/dist/analytics/logger.js.map +1 -0
- package/dist/analytics/requestContext.d.ts +21 -0
- package/dist/analytics/requestContext.js +39 -0
- package/dist/analytics/requestContext.js.map +1 -0
- package/dist/analytics/sanitize.d.ts +1 -0
- package/dist/analytics/sanitize.js +78 -0
- package/dist/analytics/sanitize.js.map +1 -0
- package/dist/http.js +260 -41
- package/dist/http.js.map +1 -1
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/dist/landing.d.ts +3 -0
- package/dist/landing.js +904 -0
- package/dist/landing.js.map +1 -0
- package/dist/server.d.ts +5 -1
- package/dist/server.js +12 -4
- package/dist/server.js.map +1 -1
- package/dist/services/httpClient.d.ts +22 -0
- package/dist/services/httpClient.js +147 -26
- package/dist/services/httpClient.js.map +1 -1
- package/dist/tools/formatters.js +33 -1
- package/dist/tools/formatters.js.map +1 -1
- package/dist/tools/health.js +84 -7
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/plr/borrowerContacts.js +47 -10
- package/dist/tools/plr/borrowerContacts.js.map +1 -1
- package/dist/tools/plr/borrowerProfile.js +11 -5
- package/dist/tools/plr/borrowerProfile.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/registerToolSafe.d.ts +5 -1
- package/dist/tools/registerToolSafe.js +110 -4
- package/dist/tools/registerToolSafe.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/rentalStats.js +19 -3
- package/dist/tools/sfr/rentalStats.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 -0
- 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/dist/tools/welcome.d.ts +3 -0
- package/dist/tools/welcome.js +58 -0
- package/dist/tools/welcome.js.map +1 -0
- package/package.json +2 -2
|
@@ -18,21 +18,49 @@ export function registerBorrowerContactsTool(server, plr) {
|
|
|
18
18
|
inputSchema: Input,
|
|
19
19
|
}, async (args) => {
|
|
20
20
|
// API requires borrower_names as a JSON-encoded array in query param
|
|
21
|
-
const
|
|
21
|
+
const normalize = (v) => String(v ?? "").trim().toLowerCase();
|
|
22
|
+
const names = args.borrowerNames
|
|
23
|
+
.split(",")
|
|
24
|
+
.map((s) => s.trim())
|
|
25
|
+
.filter(Boolean);
|
|
26
|
+
const uniqueNames = [...new Set(names)];
|
|
22
27
|
const query = {
|
|
23
|
-
borrower_names: JSON.stringify(
|
|
28
|
+
borrower_names: JSON.stringify(uniqueNames),
|
|
24
29
|
page: args.page,
|
|
25
30
|
page_size: Math.min(args.pageSize, 25),
|
|
26
31
|
};
|
|
27
32
|
if (args.state)
|
|
28
33
|
query.state = args.state;
|
|
29
34
|
const data = await plr.borrowerContacts(query);
|
|
30
|
-
const
|
|
35
|
+
const rawItems = data?.results ?? data?.data ?? (Array.isArray(data) ? data : []);
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const items = rawItems.filter((c) => {
|
|
38
|
+
const key = [
|
|
39
|
+
normalize(c.buyer_borrower1_name ?? c.borrower_name),
|
|
40
|
+
normalize(c.owner_name),
|
|
41
|
+
normalize(c.first_phone),
|
|
42
|
+
normalize(c.first_email),
|
|
43
|
+
].join("|");
|
|
44
|
+
if (seen.has(key))
|
|
45
|
+
return false;
|
|
46
|
+
seen.add(key);
|
|
47
|
+
return true;
|
|
48
|
+
});
|
|
49
|
+
const foundBorrowers = new Set(items
|
|
50
|
+
.map((c) => normalize(c.buyer_borrower1_name ?? c.borrower_name))
|
|
51
|
+
.filter(Boolean));
|
|
52
|
+
const missingBorrowers = uniqueNames.filter((n) => !foundBorrowers.has(normalize(n)));
|
|
31
53
|
const lines = [
|
|
32
54
|
`## Borrower Contacts — ${args.borrowerNames}`,
|
|
33
|
-
`**Results:** ${items.length}`,
|
|
55
|
+
`**Results:** ${items.length} unique contacts (${rawItems.length} raw rows)`,
|
|
34
56
|
"",
|
|
35
57
|
];
|
|
58
|
+
if (rawItems.length > items.length) {
|
|
59
|
+
lines.push(`_Deduplicated ${rawItems.length - items.length} duplicate row(s)._`, "");
|
|
60
|
+
}
|
|
61
|
+
if (missingBorrowers.length > 0) {
|
|
62
|
+
lines.push(`**Missing requested entities:** ${missingBorrowers.join(", ")}`, "");
|
|
63
|
+
}
|
|
36
64
|
if (items.length > 0) {
|
|
37
65
|
const rows = items.slice(0, 20).map((c) => [
|
|
38
66
|
c.buyer_borrower1_name ?? c.borrower_name ?? "—",
|
|
@@ -62,12 +90,21 @@ export function registerBorrowerContactsTool(server, plr) {
|
|
|
62
90
|
lines.push(truncatedJson(data, 3000));
|
|
63
91
|
lines.push("```");
|
|
64
92
|
}
|
|
65
|
-
const firstName =
|
|
66
|
-
const actions =
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
93
|
+
const firstName = uniqueNames[0];
|
|
94
|
+
const actions = firstName
|
|
95
|
+
? [
|
|
96
|
+
action("plr_borrower_profile", "Full borrower profile", { borrowerName: firstName }),
|
|
97
|
+
action("plr_borrower_loans", "Loan history", { borrowerNames: firstName }),
|
|
98
|
+
]
|
|
99
|
+
: [];
|
|
100
|
+
return structuredResult(lines.join("\n"), {
|
|
101
|
+
items,
|
|
102
|
+
total: items.length,
|
|
103
|
+
rawTotal: rawItems.length,
|
|
104
|
+
page: args.page,
|
|
105
|
+
requestedBorrowers: uniqueNames,
|
|
106
|
+
missingBorrowers,
|
|
107
|
+
}, actions);
|
|
71
108
|
});
|
|
72
109
|
}
|
|
73
110
|
//# sourceMappingURL=borrowerContacts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"borrowerContacts.js","sourceRoot":"","sources":["../../../src/tools/plr/borrowerContacts.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;AAE3C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gIAAgI,CAAC;IACpK,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;CAC1F,CAAC,CAAC;AAEH,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,GAAc;IAC5E,gBAAgB,CAAC,MAAM,EACrB,uBAAuB,EACvB;QACE,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EACT,kFAAkF;YAClF,6FAA6F;YAC7F,4EAA4E;YAC5E,oEAAoE;QACtE,WAAW,EAAE,KAAK;KACnB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACX,qEAAqE;QACrE,MAAM,
|
|
1
|
+
{"version":3,"file":"borrowerContacts.js","sourceRoot":"","sources":["../../../src/tools/plr/borrowerContacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,12 +21,18 @@ export function registerBorrowerProfileTool(server, plr) {
|
|
|
21
21
|
};
|
|
22
22
|
if (args.state)
|
|
23
23
|
query.state = args.state;
|
|
24
|
-
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
// Profile endpoint has a known backend bug (json.loads on ARRAY_AGG list)
|
|
25
|
+
// that causes 500 for most borrowers. Try it first, fall back to composite.
|
|
26
|
+
try {
|
|
27
|
+
const data = await plr.borrowerProfile(query);
|
|
28
|
+
if (!data?.error) {
|
|
29
|
+
return formatProfileResponse(args, data);
|
|
30
|
+
}
|
|
28
31
|
}
|
|
29
|
-
|
|
32
|
+
catch {
|
|
33
|
+
// Expected — backend 500 for most borrowers
|
|
34
|
+
}
|
|
35
|
+
// Build composite profile from working endpoints
|
|
30
36
|
return compositeFallback(plr, args);
|
|
31
37
|
});
|
|
32
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"borrowerProfile.js","sourceRoot":"","sources":["../../../src/tools/plr/borrowerProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8GAA8G,CAAC;IACjJ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,GAAc;IAC3E,gBAAgB,CAAC,MAAM,EACrB,sBAAsB,EACtB;QACE,KAAK,EAAE,kEAAkE;QACzE,WAAW,EACT,qEAAqE;YACrE,iFAAiF;YACjF,0CAA0C;YAC1C,2DAA2D;YAC3D,mGAAmG;QACrG,WAAW,EAAE,KAAK;KACnB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACX,MAAM,KAAK,GAA4B;YACrC,aAAa,EAAE,IAAI,CAAC,YAAY;SACjC,CAAC;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,KAAK,CAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"borrowerProfile.js","sourceRoot":"","sources":["../../../src/tools/plr/borrowerProfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,13 @@ import { structuredResult, markdownTable } from "../formatters.js";
|
|
|
3
3
|
import { registerToolSafe } from "../registerToolSafe.js";
|
|
4
4
|
import { autoFillPlrDates } from "../dateHelper.js";
|
|
5
5
|
import { action } from "../nextActions.js";
|
|
6
|
+
import { ApiError } from "../../services/httpClient.js";
|
|
6
7
|
const Input = z.object({
|
|
7
8
|
propertyAddress: z
|
|
8
9
|
.string()
|
|
9
|
-
.describe("Full property address
|
|
10
|
+
.describe("Full property address (e.g. '123 Main St, Phoenix, AZ 85004'). " +
|
|
11
|
+
"Used for geocoding — must be close enough to resolve. " +
|
|
12
|
+
"If geocoding fails, try a nearby address or use plr_borrower_search with geographic filters."),
|
|
10
13
|
radius: z.coerce.number().default(1).describe("Search radius in miles (default 1)"),
|
|
11
14
|
limit: z.coerce.number().default(25).describe("Maximum results (default 25)"),
|
|
12
15
|
startDate: z.string().optional().describe("Start date, e.g. '2023-01-01'"),
|
|
@@ -22,92 +25,105 @@ export function registerLoansNearbyTool(server, plr) {
|
|
|
22
25
|
"For a specific property's lending history, use plr_transaction_history.",
|
|
23
26
|
inputSchema: Input,
|
|
24
27
|
}, async (args) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
28
|
+
try {
|
|
29
|
+
const query = {
|
|
30
|
+
property_address: args.propertyAddress,
|
|
31
|
+
radius: args.radius,
|
|
32
|
+
limit: args.limit,
|
|
33
|
+
};
|
|
34
|
+
if (args.startDate)
|
|
35
|
+
query.start_date = args.startDate;
|
|
36
|
+
if (args.endDate)
|
|
37
|
+
query.end_date = args.endDate;
|
|
38
|
+
autoFillPlrDates(query);
|
|
39
|
+
const data = await plr.loansNearby(query);
|
|
40
|
+
const rawItems = data?.results ?? data?.data ?? (Array.isArray(data) ? data : []);
|
|
41
|
+
// Deduplicate: API returns duplicate rows (same lender+borrower+address+amount+date)
|
|
42
|
+
const seen = new Set();
|
|
43
|
+
const items = rawItems.filter((l) => {
|
|
44
|
+
const key = `${l.lender}|${l.buyer_borrower1_name}|${l.full_street_address}|${l.mtg_amt ?? l.loan_amount}|${l.recording_date}`;
|
|
45
|
+
if (seen.has(key))
|
|
46
|
+
return false;
|
|
47
|
+
seen.add(key);
|
|
48
|
+
return true;
|
|
49
|
+
});
|
|
50
|
+
const lines = [
|
|
51
|
+
`## Loans Nearby — ${args.propertyAddress}`,
|
|
52
|
+
`**Radius:** ${args.radius} mi | **Found:** ${items.length}`,
|
|
53
|
+
"",
|
|
54
|
+
];
|
|
55
|
+
// Distinguish "address not geocoded" from "no loans in area"
|
|
56
|
+
if (items.length === 0 && data?.property_details === null) {
|
|
57
|
+
lines.push("_Could not geocode this address — the property was not found in the SFR database. " +
|
|
58
|
+
"Try a nearby address or use plr_borrower_search with geographic filters instead._");
|
|
59
|
+
return structuredResult(lines.join("\n"), { items, total: items.length, page: 1 });
|
|
60
|
+
}
|
|
61
|
+
if (items.length > 0) {
|
|
62
|
+
const fmt$ = (v) => v != null && Number(v) > 0 ? `$${Number(v).toLocaleString()}` : "—";
|
|
63
|
+
const rows = items.slice(0, 25).map((l) => [
|
|
64
|
+
l.full_street_address ?? l.address ?? "—",
|
|
65
|
+
`${l.city ?? ""}, ${l.state ?? ""}`.replace(/^, |, $/, "") || "—",
|
|
66
|
+
l.lender ?? "—",
|
|
67
|
+
l.buyer_borrower1_name ?? l.borrower ?? "—",
|
|
68
|
+
fmt$(l.loan_amount ?? l.mtg_amt),
|
|
69
|
+
l.recording_date ?? "—",
|
|
70
|
+
]);
|
|
71
|
+
lines.push(markdownTable(["Address", "Location", "Lender", "Borrower", "Amount", "Date"], rows));
|
|
72
|
+
// Show subject property details if available at top level
|
|
73
|
+
if (data?.property_details) {
|
|
74
|
+
lines.push("");
|
|
75
|
+
lines.push("### Subject Property Details");
|
|
76
|
+
const pd = data.property_details;
|
|
77
|
+
const detailLines = [
|
|
78
|
+
pd.avm_value ? `**AVM:** $${Number(pd.avm_value).toLocaleString()}` : null,
|
|
79
|
+
pd.market_value ? `**Market Value:** $${Number(pd.market_value).toLocaleString()}` : null,
|
|
80
|
+
pd.owner ? `**Owner:** ${pd.owner}` : null,
|
|
81
|
+
pd.owner_occupied != null ? `**Owner Occupied:** ${pd.owner_occupied}` : null,
|
|
82
|
+
pd.pfc_flag ? `**Pre-Foreclosure:** Yes (${pd.pfc_recording_date ?? ""})` : null,
|
|
83
|
+
pd.vacant_flag ? `**Vacant:** Yes` : null,
|
|
84
|
+
].filter(Boolean);
|
|
85
|
+
lines.push(detailLines.join(" | "));
|
|
86
|
+
}
|
|
82
87
|
}
|
|
88
|
+
else {
|
|
89
|
+
lines.push("_No loans found within radius._");
|
|
90
|
+
}
|
|
91
|
+
// Slim items for structured output
|
|
92
|
+
const slimItems = items.slice(0, 25).map((l) => ({
|
|
93
|
+
address: l.full_street_address,
|
|
94
|
+
city: l.city,
|
|
95
|
+
state: l.state,
|
|
96
|
+
zip: l.zip_code,
|
|
97
|
+
lender: l.lender,
|
|
98
|
+
borrower: l.buyer_borrower1_name,
|
|
99
|
+
amount: l.mtg_amt ?? l.loan_amount,
|
|
100
|
+
recording_date: l.recording_date,
|
|
101
|
+
loan_type: l.loan_type ?? l.land_use_category,
|
|
102
|
+
}));
|
|
103
|
+
const firstBorrower = items[0]?.buyer_borrower1_name ?? items[0]?.borrower;
|
|
104
|
+
const actions = [
|
|
105
|
+
...(firstBorrower ? [action("plr_borrower_profile", "Profile nearest borrower", { borrowerName: firstBorrower })] : []),
|
|
106
|
+
action("sfr_get_property", "Full property details", { address: args.propertyAddress }),
|
|
107
|
+
action("plr_transaction_history", "Property lending history", { propertyAddress: args.propertyAddress }),
|
|
108
|
+
];
|
|
109
|
+
return structuredResult(lines.join("\n"), {
|
|
110
|
+
items: slimItems,
|
|
111
|
+
total: items.length,
|
|
112
|
+
deduped: rawItems.length - items.length > 0 ? rawItems.length - items.length : undefined,
|
|
113
|
+
page: 1,
|
|
114
|
+
}, actions);
|
|
83
115
|
}
|
|
84
|
-
|
|
85
|
-
|
|
116
|
+
catch (err) {
|
|
117
|
+
if (err instanceof ApiError && err.status === 404) {
|
|
118
|
+
const zipMatch = args.propertyAddress.match(/\b(\d{5})\b/);
|
|
119
|
+
const zip = zipMatch?.[1];
|
|
120
|
+
return structuredResult(`## Loans Nearby — ${args.propertyAddress}\n\n` +
|
|
121
|
+
`_Address not found or could not be geocoded. Verify the exact address format. ` +
|
|
122
|
+
`Use sfr_search_properties with the zip code to find the canonical address, ` +
|
|
123
|
+
`or use plr_borrower_search with geographic filters instead._`, { address: args.propertyAddress, error: "not_found" }, [action("sfr_search_properties", "Search by zip to find correct address", zip ? { search_type: "zip", zips: zip } : undefined)]);
|
|
124
|
+
}
|
|
125
|
+
throw err;
|
|
86
126
|
}
|
|
87
|
-
// Slim items for structured output
|
|
88
|
-
const slimItems = items.slice(0, 25).map((l) => ({
|
|
89
|
-
address: l.full_street_address,
|
|
90
|
-
city: l.city,
|
|
91
|
-
state: l.state,
|
|
92
|
-
zip: l.zip_code,
|
|
93
|
-
lender: l.lender,
|
|
94
|
-
borrower: l.buyer_borrower1_name,
|
|
95
|
-
amount: l.mtg_amt ?? l.loan_amount,
|
|
96
|
-
recording_date: l.recording_date,
|
|
97
|
-
loan_type: l.loan_type ?? l.land_use_category,
|
|
98
|
-
}));
|
|
99
|
-
const firstBorrower = items[0]?.buyer_borrower1_name ?? items[0]?.borrower;
|
|
100
|
-
const actions = [
|
|
101
|
-
...(firstBorrower ? [action("plr_borrower_profile", "Profile nearest borrower", { borrowerName: firstBorrower })] : []),
|
|
102
|
-
action("sfr_get_property", "Full property details", { address: args.propertyAddress }),
|
|
103
|
-
action("plr_transaction_history", "Property lending history", { propertyAddress: args.propertyAddress }),
|
|
104
|
-
];
|
|
105
|
-
return structuredResult(lines.join("\n"), {
|
|
106
|
-
items: slimItems,
|
|
107
|
-
total: items.length,
|
|
108
|
-
deduped: rawItems.length - items.length > 0 ? rawItems.length - items.length : undefined,
|
|
109
|
-
page: 1,
|
|
110
|
-
}, actions);
|
|
111
127
|
});
|
|
112
128
|
}
|
|
113
129
|
//# sourceMappingURL=loansNearby.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loansNearby.js","sourceRoot":"","sources":["../../../src/tools/plr/loansNearby.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"loansNearby.js","sourceRoot":"","sources":["../../../src/tools/plr/loansNearby.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,CACP,iEAAiE;QACjE,wDAAwD;QACxD,8FAA8F,CAC/F;IACH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACnF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC7E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC1E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,GAAc;IACvE,gBAAgB,CAAC,MAAM,EACrB,kBAAkB,EAClB;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EACT,8EAA8E;YAC9E,6EAA6E;YAC7E,iFAAiF;YACjF,kDAAkD;YAClD,yEAAyE;QAC3E,WAAW,EAAE,KAAK;KACnB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,KAAK,GAA4B;gBACrC,gBAAgB,EAAE,IAAI,CAAC,eAAe;gBACtC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;YACF,IAAI,IAAI,CAAC,SAAS;gBAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;YACtD,IAAI,IAAI,CAAC,OAAO;gBAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAChD,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAExB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,CAAQ,CAAC;YACjD,MAAM,QAAQ,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAElF,qFAAqF;YACrF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE;gBACvC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;gBAC/H,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG;gBACZ,qBAAqB,IAAI,CAAC,eAAe,EAAE;gBAC3C,eAAe,IAAI,CAAC,MAAM,oBAAoB,KAAK,CAAC,MAAM,EAAE;gBAC5D,EAAE;aACH,CAAC;YAEF,6DAA6D;YAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,EAAE,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC1D,KAAK,CAAC,IAAI,CACR,oFAAoF;oBACpF,mFAAmF,CACpF,CAAC;gBACF,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC7F,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC;oBAC9C,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG;oBACzC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,GAAG;oBACjE,CAAC,CAAC,MAAM,IAAI,GAAG;oBACf,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG;oBAC3C,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC;oBAChC,CAAC,CAAC,cAAc,IAAI,GAAG;iBACxB,CAAC,CAAC;gBAEH,KAAK,CAAC,IAAI,CAAC,aAAa,CACtB,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC/D,IAAI,CACL,CAAC,CAAC;gBAEH,0DAA0D;gBAC1D,IAAI,IAAI,EAAE,gBAAgB,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;oBAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;oBACjC,MAAM,WAAW,GAAG;wBAClB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;wBAC1E,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;wBACzF,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;wBAC1C,EAAE,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI;wBAC7E,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,kBAAkB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI;wBAChF,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI;qBAC1C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAClB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,CAAC;YAED,mCAAmC;YACnC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACpD,OAAO,EAAE,CAAC,CAAC,mBAAmB;gBAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,GAAG,EAAE,CAAC,CAAC,QAAQ;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,oBAAoB;gBAChC,MAAM,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW;gBAClC,cAAc,EAAE,CAAC,CAAC,cAAc;gBAChC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,iBAAiB;aAC9C,CAAC,CAAC,CAAC;YAEJ,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,oBAAoB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;YAC3E,MAAM,OAAO,GAAG;gBACd,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,sBAAsB,EAAE,0BAA0B,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvH,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACtF,MAAM,CAAC,yBAAyB,EAAE,0BAA0B,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;aACzG,CAAC;YAEF,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxC,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACxF,IAAI,EAAE,CAAC;aACR,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC3D,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC1B,OAAO,gBAAgB,CACrB,qBAAqB,IAAI,CAAC,eAAe,MAAM;oBAC/C,gFAAgF;oBAChF,6EAA6E;oBAC7E,8DAA8D,EAC9D,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,EACrD,CAAC,MAAM,CAAC,uBAAuB,EAAE,uCAAuC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAChI,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|
|
@@ -19,11 +19,15 @@ type ToolCallbackResult = {
|
|
|
19
19
|
structuredContent?: Record<string, unknown>;
|
|
20
20
|
isError?: boolean;
|
|
21
21
|
};
|
|
22
|
+
/** Clear the registry — call before each createServer() in HTTP mode. */
|
|
23
|
+
export declare function clearToolRegistry(): void;
|
|
24
|
+
/** Returns a snapshot of all registered tool names. */
|
|
25
|
+
export declare function getRegisteredToolNames(): string[];
|
|
22
26
|
/**
|
|
23
27
|
* Wrapper around `server.registerTool` that adds:
|
|
24
28
|
* - readOnlyHint + idempotentHint annotations by default
|
|
25
29
|
* - automatic try/catch → handleToolError
|
|
26
|
-
* -
|
|
30
|
+
* - structured analytics logging to stderr
|
|
27
31
|
*/
|
|
28
32
|
export declare function registerToolSafe<InputArgs extends undefined | ZodRawShapeCompat | AnySchema = undefined>(server: McpServer, toolName: string, config: ToolConfig<InputArgs>, cb: (args: any) => Promise<ToolCallbackResult>): void;
|
|
29
33
|
export {};
|