@sfranalytics/mcp 0.6.2 → 0.6.3
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 +193 -40
- 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 +891 -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 +29 -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/registerToolSafe.d.ts +5 -1
- package/dist/tools/registerToolSafe.js +110 -4
- package/dist/tools/registerToolSafe.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/topBuyers.js +1 -0
- package/dist/tools/sfr/topBuyers.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":"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,SAAS,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa;aAC7B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAExC,MAAM,KAAK,GAA4B;YACrC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAC3C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;SACvC,CAAC;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAQ,CAAC;QACtD,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;QAClF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG;gBACV,SAAS,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,aAAa,CAAC;gBACpD,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;gBACvB,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;gBACxB,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;aACzB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,KAAK;aACF,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC;aACrE,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;QACF,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtF,MAAM,KAAK,GAAG;YACZ,0BAA0B,IAAI,CAAC,aAAa,EAAE;YAC9C,gBAAgB,KAAK,CAAC,MAAM,qBAAqB,QAAQ,CAAC,MAAM,YAAY;YAC5E,EAAE;SACH,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,mCAAmC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC;gBAC9C,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,aAAa,IAAI,GAAG;gBAChD,CAAC,CAAC,UAAU,IAAI,GAAG;gBACnB,CAAC,CAAC,WAAW,IAAI,GAAG;gBACpB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;gBACnC,CAAC,CAAC,WAAW,IAAI,GAAG;gBACpB,CAAC,CAAC,eAAe,IAAI,GAAG;aACzB,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,aAAa,CACtB,CAAC,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,CAAC,EACpF,IAAI,CACL,CAAC,CAAC;YAEH,iCAAiC;YACjC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,aAAa,EAAE,MAAM;oBAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7E,IAAI,CAAC,CAAC,aAAa,EAAE,MAAM;oBAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7E,IAAI,CAAC,CAAC,cAAc,EAAE,MAAM;oBAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,oBAAoB,IAAI,GAAG,eAAe,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,SAAS;YACvB,CAAC,CAAC;gBACE,MAAM,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;gBACpF,MAAM,CAAC,oBAAoB,EAAE,cAAc,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;aAC3E;YACH,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,gBAAgB,CACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAChB;YACE,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,kBAAkB,EAAE,WAAW;YAC/B,gBAAgB;SACjB,EACD,OAAO,CACR,CAAC;IACN,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|
|
@@ -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 {};
|
|
@@ -1,13 +1,94 @@
|
|
|
1
|
+
import { getCtx } from "../analytics/requestContext.js";
|
|
2
|
+
import { sanitizeArgs } from "../analytics/sanitize.js";
|
|
3
|
+
import { logEvent } from "../analytics/logger.js";
|
|
4
|
+
import { ApiError } from "../services/httpClient.js";
|
|
1
5
|
import { handleToolError } from "./formatters.js";
|
|
6
|
+
function truncateErrorMessage(message, maxLen = 500) {
|
|
7
|
+
return message.length > maxLen ? `${message.slice(0, maxLen)}...[truncated]` : message;
|
|
8
|
+
}
|
|
9
|
+
function toToolErrorEvent(err) {
|
|
10
|
+
if (err instanceof ApiError) {
|
|
11
|
+
return {
|
|
12
|
+
kind: "api_error",
|
|
13
|
+
message: truncateErrorMessage(err.message || `HTTP ${err.status}`),
|
|
14
|
+
status: err.status,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const maybeObj = err;
|
|
18
|
+
if (typeof maybeObj?.name === "string" && maybeObj.name === "ZodError") {
|
|
19
|
+
return {
|
|
20
|
+
kind: "validation",
|
|
21
|
+
message: truncateErrorMessage(typeof maybeObj.message === "string" ? maybeObj.message : "Validation error"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (err instanceof Error) {
|
|
25
|
+
return { kind: "unknown", message: truncateErrorMessage(err.message || "Unknown error") };
|
|
26
|
+
}
|
|
27
|
+
return { kind: "unknown", message: truncateErrorMessage(String(err)) };
|
|
28
|
+
}
|
|
29
|
+
function inferErrorFromResult(result) {
|
|
30
|
+
if (!result.isError)
|
|
31
|
+
return null;
|
|
32
|
+
const text = result.content.find((item) => item.type === "text")?.text;
|
|
33
|
+
const message = text ? text.replace(/^Error:\s*/i, "") : "Tool returned isError=true";
|
|
34
|
+
return {
|
|
35
|
+
kind: "tool_error",
|
|
36
|
+
message: truncateErrorMessage(message),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function toolCategory(name) {
|
|
40
|
+
if (name === "sfra_health" || name === "sfra_welcome")
|
|
41
|
+
return "health";
|
|
42
|
+
if (name.startsWith("plr_"))
|
|
43
|
+
return "plr";
|
|
44
|
+
if (name.startsWith("sfr_"))
|
|
45
|
+
return "sfr";
|
|
46
|
+
return "other";
|
|
47
|
+
}
|
|
48
|
+
function extractOutputText(result) {
|
|
49
|
+
const texts = result.content
|
|
50
|
+
.filter((c) => c.type === "text" && c.text)
|
|
51
|
+
.map((c) => c.text);
|
|
52
|
+
return texts.length > 0 ? texts.join("\n") : null;
|
|
53
|
+
}
|
|
54
|
+
function extractOutputMeta(result) {
|
|
55
|
+
const raw = JSON.stringify(result);
|
|
56
|
+
const bytes = raw.length;
|
|
57
|
+
const text = extractOutputText(result);
|
|
58
|
+
const sc = result.structuredContent;
|
|
59
|
+
if (!sc)
|
|
60
|
+
return { items: null, bytes, truncated: false, keys: null, text };
|
|
61
|
+
const keys = Object.keys(sc).filter((k) => !k.startsWith("_"));
|
|
62
|
+
const truncated = !!sc._outputMeta?.truncated;
|
|
63
|
+
let items = null;
|
|
64
|
+
if (Array.isArray(sc.items)) {
|
|
65
|
+
items = sc.items.length;
|
|
66
|
+
}
|
|
67
|
+
else if (typeof sc.total === "number") {
|
|
68
|
+
items = sc.total;
|
|
69
|
+
}
|
|
70
|
+
return { items, bytes, truncated, keys, text };
|
|
71
|
+
}
|
|
72
|
+
/** Names of all tools registered via registerToolSafe (populated during createServer). */
|
|
73
|
+
const registeredToolNames = [];
|
|
74
|
+
/** Clear the registry — call before each createServer() in HTTP mode. */
|
|
75
|
+
export function clearToolRegistry() {
|
|
76
|
+
registeredToolNames.length = 0;
|
|
77
|
+
}
|
|
78
|
+
/** Returns a snapshot of all registered tool names. */
|
|
79
|
+
export function getRegisteredToolNames() {
|
|
80
|
+
return [...registeredToolNames];
|
|
81
|
+
}
|
|
2
82
|
/**
|
|
3
83
|
* Wrapper around `server.registerTool` that adds:
|
|
4
84
|
* - readOnlyHint + idempotentHint annotations by default
|
|
5
85
|
* - automatic try/catch → handleToolError
|
|
6
|
-
* -
|
|
86
|
+
* - structured analytics logging to stderr
|
|
7
87
|
*/
|
|
8
88
|
export function registerToolSafe(server, toolName, config,
|
|
9
89
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
90
|
cb) {
|
|
91
|
+
registeredToolNames.push(toolName);
|
|
11
92
|
const mergedConfig = {
|
|
12
93
|
...config,
|
|
13
94
|
annotations: {
|
|
@@ -18,18 +99,43 @@ cb) {
|
|
|
18
99
|
};
|
|
19
100
|
server.registerTool(toolName, mergedConfig, async (args) => {
|
|
20
101
|
const t0 = performance.now();
|
|
102
|
+
const ctx = getCtx();
|
|
103
|
+
const input = sanitizeArgs(args);
|
|
104
|
+
let ok = true;
|
|
105
|
+
let error = null;
|
|
106
|
+
let output = null;
|
|
21
107
|
try {
|
|
22
108
|
const result = await cb(args);
|
|
109
|
+
error = inferErrorFromResult(result);
|
|
110
|
+
if (error)
|
|
111
|
+
ok = false;
|
|
112
|
+
output = extractOutputMeta(result);
|
|
23
113
|
return result;
|
|
24
114
|
}
|
|
25
115
|
catch (err) {
|
|
116
|
+
ok = false;
|
|
117
|
+
error = toToolErrorEvent(err);
|
|
26
118
|
return handleToolError(err, toolName);
|
|
27
119
|
}
|
|
28
120
|
finally {
|
|
29
121
|
const elapsed = performance.now() - t0;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
122
|
+
logEvent({
|
|
123
|
+
v: 1,
|
|
124
|
+
event: "tool_call",
|
|
125
|
+
ts: new Date().toISOString(),
|
|
126
|
+
tool: toolName,
|
|
127
|
+
tool_category: toolCategory(toolName),
|
|
128
|
+
latency_ms: Number(elapsed.toFixed(1)),
|
|
129
|
+
ok,
|
|
130
|
+
token_hash: ctx?.tokenHash ?? null,
|
|
131
|
+
token_hash_sfr: ctx?.tokenHashSfr ?? null,
|
|
132
|
+
token_hash_plr: ctx?.tokenHashPlr ?? null,
|
|
133
|
+
request_id: ctx?.requestId ?? null,
|
|
134
|
+
mode: ctx?.mode ?? "stdio",
|
|
135
|
+
input,
|
|
136
|
+
output,
|
|
137
|
+
error,
|
|
138
|
+
});
|
|
33
139
|
}
|
|
34
140
|
});
|
|
35
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerToolSafe.js","sourceRoot":"","sources":["../../src/tools/registerToolSafe.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"registerToolSafe.js","sourceRoot":"","sources":["../../src/tools/registerToolSafe.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { structuredResult, kvSummary, markdownTable, truncatedJson } from "../formatters.js";
|
|
3
3
|
import { action, locationArgs } from "../nextActions.js";
|
|
4
4
|
import { registerToolSafe } from "../registerToolSafe.js";
|
|
5
|
+
const MAX_STATE_LOOKBACK_DAYS = 90;
|
|
5
6
|
const Input = z.object({
|
|
6
7
|
search_type: z
|
|
7
8
|
.enum(["state", "city", "zip", "county", "neighborhood"])
|
|
@@ -24,9 +25,13 @@ export function registerRentalStatsTool(server, sfr) {
|
|
|
24
25
|
"For individual rental comps near a specific address, use sfr_rental_comparables.",
|
|
25
26
|
inputSchema: Input,
|
|
26
27
|
}, async (args) => {
|
|
28
|
+
const requestedLookBack = args.look_back;
|
|
29
|
+
const effectiveLookBack = args.search_type === "state" && requestedLookBack > MAX_STATE_LOOKBACK_DAYS
|
|
30
|
+
? MAX_STATE_LOOKBACK_DAYS
|
|
31
|
+
: requestedLookBack;
|
|
27
32
|
const query = {
|
|
28
33
|
search_type: args.search_type,
|
|
29
|
-
look_back:
|
|
34
|
+
look_back: effectiveLookBack,
|
|
30
35
|
};
|
|
31
36
|
if (args.state)
|
|
32
37
|
query.state = args.state;
|
|
@@ -44,9 +49,12 @@ export function registerRentalStatsTool(server, sfr) {
|
|
|
44
49
|
const loc = args.zips ?? args.city ?? args.county ?? args.state ?? "All";
|
|
45
50
|
const lines = [
|
|
46
51
|
`## Rental Market Stats — ${loc}`,
|
|
47
|
-
`_${
|
|
52
|
+
`_${effectiveLookBack}-day lookback_`,
|
|
48
53
|
"",
|
|
49
54
|
];
|
|
55
|
+
if (effectiveLookBack !== requestedLookBack) {
|
|
56
|
+
lines.push(`_Adjusted lookback from ${requestedLookBack} to ${effectiveLookBack} days for state-level scope to avoid upstream timeouts/crashes. For wider history, use city/zip queries._`, "");
|
|
57
|
+
}
|
|
50
58
|
if (data == null) {
|
|
51
59
|
lines.push("_No data returned. The query may be too broad (e.g. state-level) — try narrowing to a city or zip._");
|
|
52
60
|
return structuredResult(lines.join("\n"), { location: { search_type: args.search_type, value: loc }, error: "no_data" });
|
|
@@ -105,7 +113,15 @@ export function registerRentalStatsTool(server, sfr) {
|
|
|
105
113
|
.map(([price, count]) => ({ price, count }));
|
|
106
114
|
}
|
|
107
115
|
structured.location = { search_type: args.search_type, value: loc };
|
|
108
|
-
structured.lookBack =
|
|
116
|
+
structured.lookBack = effectiveLookBack;
|
|
117
|
+
if (effectiveLookBack !== requestedLookBack) {
|
|
118
|
+
structured.lookBackRequested = requestedLookBack;
|
|
119
|
+
structured.queryAdjustment = {
|
|
120
|
+
field: "look_back",
|
|
121
|
+
reason: "state_scope_guardrail",
|
|
122
|
+
maxAllowed: MAX_STATE_LOOKBACK_DAYS,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
109
125
|
const locArgs = locationArgs(args);
|
|
110
126
|
const actions = [
|
|
111
127
|
...(args.zips ? [action("sfr_zip_detail", "Deep-dive zip metrics", { zipCode: args.zips.split(",")[0] })] : []),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rentalStats.js","sourceRoot":"","sources":["../../../src/tools/sfr/rentalStats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;SACxD,QAAQ,CAAC,sBAAsB,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IACtE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAC/E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACrD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2HAA2H,CAAC;IACzK,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC/E,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CAC/F,CAAC,CAAC;AAEH,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,GAAc;IACvE,gBAAgB,CAAC,MAAM,EACrB,kBAAkB,EAClB;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,uFAAuF;YACvF,gFAAgF;YAChF,uEAAuE;YACvE,2CAA2C;YAC3C,kFAAkF;QACpF,WAAW,EAAE,KAAK;KACnB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACX,MAAM,KAAK,GAA4B;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"rentalStats.js","sourceRoot":"","sources":["../../../src/tools/sfr/rentalStats.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,6 +66,7 @@ export function registerTopBuyersTool(server, sfr) {
|
|
|
66
66
|
b.hasProfilePage ? "Yes" : "No",
|
|
67
67
|
]);
|
|
68
68
|
lines.push(markdownTable(["#", "Buyer", "Acquisitions", "Contact Info", "Profile"], rows));
|
|
69
|
+
lines.push("", "_Note: 'Profile=Yes' is an upstream signal and may still return not_found for some buyers._");
|
|
69
70
|
}
|
|
70
71
|
else {
|
|
71
72
|
lines.push("_No buyers found for this location._ " +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topBuyers.js","sourceRoot":"","sources":["../../../src/tools/sfr/topBuyers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"topBuyers.js","sourceRoot":"","sources":["../../../src/tools/sfr/topBuyers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { structuredResult } from "./formatters.js";
|
|
3
|
+
import { registerToolSafe } from "./registerToolSafe.js";
|
|
4
|
+
export function registerWelcomeTool(server, config) {
|
|
5
|
+
const hasSfr = config.sfr !== null;
|
|
6
|
+
const hasPlr = config.plr !== null;
|
|
7
|
+
registerToolSafe(server, "sfra_welcome", {
|
|
8
|
+
title: "SFR Analytics: Welcome & Setup Check",
|
|
9
|
+
description: "Shows which APIs are connected (SFR, PLR, or both) and recommends the best next steps. " +
|
|
10
|
+
"Call this first to confirm your setup is working.",
|
|
11
|
+
inputSchema: z.object({}),
|
|
12
|
+
}, async () => {
|
|
13
|
+
const lines = ["## Welcome to SFR Analytics MCP", ""];
|
|
14
|
+
const tokenMode = !hasSfr && !hasPlr ? "none" : hasSfr && hasPlr ? "both" : hasSfr ? "sfr" : "plr";
|
|
15
|
+
// Auth status
|
|
16
|
+
lines.push(`**Connected APIs:** ${tokenMode === "both" ? "SFR + PLR (full access)"
|
|
17
|
+
: tokenMode === "sfr" ? "SFR only (21 property & market tools)"
|
|
18
|
+
: tokenMode === "plr" ? "PLR only (17 lending & borrower tools)"
|
|
19
|
+
: "None configured"}`, "");
|
|
20
|
+
// Recommended next steps based on auth
|
|
21
|
+
const actions = [];
|
|
22
|
+
if (tokenMode === "none") {
|
|
23
|
+
lines.push("No API tokens detected. Add at least one token to your MCP configuration:", " - `SFR-Api-Token` header (or `SFR_API_TOKEN` env var) for property data", " - `PLR-Api-Token` header (or `PLR_API_TOKEN` env var) for lending data", "", "Get API keys at https://www.sfranalytics.com");
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
lines.push("### Recommended Next Steps", "");
|
|
27
|
+
if (hasSfr) {
|
|
28
|
+
actions.push({ title: "Screen markets by yield", type: "prompt", id: "market-screen", why: "Find the best zip codes for SFR investment" }, { title: "Analyze a property", type: "prompt", id: "property-analysis", why: "Underwrite a specific address with rent comps and cap rate" });
|
|
29
|
+
}
|
|
30
|
+
if (hasPlr) {
|
|
31
|
+
actions.push({ title: "Lending market overview", type: "prompt", id: "lending-overview", why: "See private lending volumes, top lenders, and market trends" }, { title: "Find borrowers", type: "prompt", id: "borrower-outreach", why: "Search and contact active private lending borrowers" });
|
|
32
|
+
}
|
|
33
|
+
if (hasSfr && hasPlr) {
|
|
34
|
+
actions.push({ title: "Research a buyer", type: "prompt", id: "buyer-research", why: "Deep-dive an investor's portfolio, strategy, and lending activity" });
|
|
35
|
+
}
|
|
36
|
+
for (const a of actions) {
|
|
37
|
+
lines.push(`${actions.indexOf(a) + 1}. **${a.title}** — ${a.why}`, ` Use prompt: \`${a.id}\``);
|
|
38
|
+
}
|
|
39
|
+
// Upsell missing API
|
|
40
|
+
if (!hasPlr) {
|
|
41
|
+
lines.push("", "Add a PLR API token to unlock 17 lending and borrower intelligence tools.", " Learn more: https://www.sfranalytics.com/products/private-lender");
|
|
42
|
+
}
|
|
43
|
+
if (!hasSfr) {
|
|
44
|
+
lines.push("", "Add an SFR API token to unlock 21 property, buyer, and market tools.", " Learn more: https://www.sfranalytics.com/products/api");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
lines.push("", "Run `sfra_health` to check API connectivity and latency.");
|
|
48
|
+
const structured = {
|
|
49
|
+
tokenMode,
|
|
50
|
+
sfrEnabled: hasSfr,
|
|
51
|
+
plrEnabled: hasPlr,
|
|
52
|
+
toolCount: (hasSfr ? 21 : 0) + (hasPlr ? 17 : 0) + 1,
|
|
53
|
+
recommendedActions: actions,
|
|
54
|
+
};
|
|
55
|
+
return structuredResult(lines.join("\n"), structured);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=welcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/tools/welcome.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sfranalytics/mcp",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "MCP server for SFR Analytics — single-family
|
|
3
|
+
"version": "0.6.3",
|
|
4
|
+
"description": "MCP server for SFR Analytics — single-family residential property data, buyer intelligence, and private lending insights",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
7
7
|
"author": "SFR Analytics <support@sfranalytics.com> (https://www.sfranalytics.com)",
|