@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"landing.js","sourceRoot":"","sources":["../src/landing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,QAAQ,GAAG,04NAA04N,CAAC;AAE55N,MAAM,UAAU,iBAAiB,CAAC,IAAkC;IAClE,MAAM,OAAO,GAAG,IAAI,EAAE,cAAc,IAAI,EAAE,CAAC;IAC3C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uFAoc8E,QAAQ;;;;;uCAKxD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwJzB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA0PvB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;QAwBrB,CAAC;AACT,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { AppConfig } from "./config.js";
|
|
3
|
-
export
|
|
3
|
+
export type CreateServerResult = {
|
|
4
|
+
server: McpServer;
|
|
5
|
+
toolNames: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare function createServer(config: AppConfig): CreateServerResult;
|
package/dist/server.js
CHANGED
|
@@ -3,8 +3,10 @@ import { VERSION } from "./version.js";
|
|
|
3
3
|
import { HttpClient } from "./services/httpClient.js";
|
|
4
4
|
import { SfrClient } from "./services/sfr.js";
|
|
5
5
|
import { PlrClient } from "./services/plr.js";
|
|
6
|
-
|
|
6
|
+
import { clearToolRegistry, getRegisteredToolNames } from "./tools/registerToolSafe.js";
|
|
7
|
+
// Tool registrations — Health & Welcome
|
|
7
8
|
import { registerHealthTool } from "./tools/health.js";
|
|
9
|
+
import { registerWelcomeTool } from "./tools/welcome.js";
|
|
8
10
|
// SFR Tools
|
|
9
11
|
import { registerSearchPropertiesTool } from "./tools/sfr/searchProperties.js";
|
|
10
12
|
import { registerGetPropertyTool } from "./tools/sfr/getProperty.js";
|
|
@@ -60,7 +62,11 @@ import { registerHviTrendTool } from "./tools/snowflake/hviTrend.js";
|
|
|
60
62
|
import { initSnowflake } from "./services/snowflake.js";
|
|
61
63
|
function buildInstructions(hasSfr, hasPlr, hasSnowflake) {
|
|
62
64
|
const sections = [
|
|
63
|
-
"SFR Analytics MCP — real estate investment data for single-family
|
|
65
|
+
"SFR Analytics MCP — real estate investment data for single-family residential (SFR) markets.",
|
|
66
|
+
"",
|
|
67
|
+
"GETTING STARTED:",
|
|
68
|
+
" First time? Call sfra_welcome to confirm which APIs are connected and get recommended next steps.",
|
|
69
|
+
" Already set up? Jump to a workflow below or use a prompt (market-screen, property-analysis, lending-overview).",
|
|
64
70
|
"",
|
|
65
71
|
];
|
|
66
72
|
sections.push("DATA SOURCES:");
|
|
@@ -110,6 +116,7 @@ function buildInstructions(hasSfr, hasPlr, hasSnowflake) {
|
|
|
110
116
|
return sections.join("\n");
|
|
111
117
|
}
|
|
112
118
|
export function createServer(config) {
|
|
119
|
+
clearToolRegistry();
|
|
113
120
|
const hasSfr = config.sfr !== null;
|
|
114
121
|
const hasPlr = config.plr !== null;
|
|
115
122
|
const hasSnowflake = config.snowflake !== null;
|
|
@@ -138,8 +145,9 @@ export function createServer(config) {
|
|
|
138
145
|
capabilities: { logging: {} },
|
|
139
146
|
instructions: buildInstructions(hasSfr, hasPlr, hasSnowflake),
|
|
140
147
|
});
|
|
141
|
-
// Health — always registered, checks only configured APIs
|
|
148
|
+
// Health & Welcome — always registered, checks only configured APIs
|
|
142
149
|
registerHealthTool(server, sfrClient, plrClient, config);
|
|
150
|
+
registerWelcomeTool(server, config);
|
|
143
151
|
// SFR Tools
|
|
144
152
|
if (sfrClient) {
|
|
145
153
|
// Properties (6)
|
|
@@ -208,6 +216,6 @@ export function createServer(config) {
|
|
|
208
216
|
}
|
|
209
217
|
// Example prompts — scoped to available APIs
|
|
210
218
|
registerPrompts(server, hasSfr, hasPlr);
|
|
211
|
-
return server;
|
|
219
|
+
return { server, toolNames: getRegisteredToolNames() };
|
|
212
220
|
}
|
|
213
221
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,12 +8,34 @@ export type HttpClientOptions = {
|
|
|
8
8
|
baseUrl: string;
|
|
9
9
|
defaultHeaders: Record<string, string>;
|
|
10
10
|
timeoutMs: number;
|
|
11
|
+
circuitBreaker?: {
|
|
12
|
+
/** Consecutive transient failures required to open circuit (default: 3). */
|
|
13
|
+
failureThreshold?: number;
|
|
14
|
+
/** Open-state cooldown before half-open probe in ms (default: 30000). */
|
|
15
|
+
resetTimeoutMs?: number;
|
|
16
|
+
};
|
|
17
|
+
retry?: {
|
|
18
|
+
/** Number of retries after the first attempt (default: 2). */
|
|
19
|
+
maxRetries?: number;
|
|
20
|
+
/** Delay before first retry in ms (default: 1000). */
|
|
21
|
+
initialDelayMs?: number;
|
|
22
|
+
/** Multiplier applied per retry attempt (default: 3 => 1s, 3s). */
|
|
23
|
+
backoffMultiplier?: number;
|
|
24
|
+
/** HTTP status codes considered transient (default: 502/503/504). */
|
|
25
|
+
retryOnStatuses?: number[];
|
|
26
|
+
};
|
|
11
27
|
};
|
|
28
|
+
type CircuitState = "closed" | "open" | "half_open";
|
|
12
29
|
export declare class HttpClient {
|
|
13
30
|
private readonly opts;
|
|
31
|
+
private readonly circuitBreaker;
|
|
14
32
|
constructor(opts: HttpClientOptions);
|
|
33
|
+
getCircuitState(): CircuitState;
|
|
34
|
+
private isTransientNetworkError;
|
|
35
|
+
private isTransientForCircuit;
|
|
15
36
|
request<T>(method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", path: string, init?: {
|
|
16
37
|
query?: Record<string, string | number | boolean | undefined | unknown>;
|
|
17
38
|
body?: unknown;
|
|
18
39
|
}): Promise<T>;
|
|
19
40
|
}
|
|
41
|
+
export {};
|
|
@@ -11,10 +11,85 @@ export class ApiError extends Error {
|
|
|
11
11
|
this.name = "ApiError";
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
+
class CircuitBreaker {
|
|
15
|
+
failureThreshold;
|
|
16
|
+
resetTimeoutMs;
|
|
17
|
+
state = "closed";
|
|
18
|
+
failures = 0;
|
|
19
|
+
lastFailureTime = 0;
|
|
20
|
+
probeInFlight = false;
|
|
21
|
+
constructor(failureThreshold, resetTimeoutMs) {
|
|
22
|
+
this.failureThreshold = failureThreshold;
|
|
23
|
+
this.resetTimeoutMs = resetTimeoutMs;
|
|
24
|
+
}
|
|
25
|
+
canRequest(now = Date.now()) {
|
|
26
|
+
if (this.state === "closed")
|
|
27
|
+
return true;
|
|
28
|
+
if (this.state === "open") {
|
|
29
|
+
if (now - this.lastFailureTime >= this.resetTimeoutMs) {
|
|
30
|
+
this.state = "half_open";
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (this.probeInFlight)
|
|
37
|
+
return false;
|
|
38
|
+
this.probeInFlight = true;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
onSuccess() {
|
|
42
|
+
this.failures = 0;
|
|
43
|
+
this.state = "closed";
|
|
44
|
+
this.probeInFlight = false;
|
|
45
|
+
}
|
|
46
|
+
onTransientFailure(now = Date.now()) {
|
|
47
|
+
this.failures += 1;
|
|
48
|
+
this.lastFailureTime = now;
|
|
49
|
+
this.probeInFlight = false;
|
|
50
|
+
if (this.state === "half_open" || this.failures >= this.failureThreshold) {
|
|
51
|
+
this.state = "open";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
onNonTransientFailure() {
|
|
55
|
+
if (this.state === "half_open") {
|
|
56
|
+
// Service is reachable (e.g., 4xx). Close the circuit and reset counts.
|
|
57
|
+
this.state = "closed";
|
|
58
|
+
this.failures = 0;
|
|
59
|
+
}
|
|
60
|
+
this.probeInFlight = false;
|
|
61
|
+
}
|
|
62
|
+
getState() {
|
|
63
|
+
return this.state;
|
|
64
|
+
}
|
|
65
|
+
getFailures() {
|
|
66
|
+
return this.failures;
|
|
67
|
+
}
|
|
68
|
+
getRetryAfterMs(now = Date.now()) {
|
|
69
|
+
if (this.state !== "open")
|
|
70
|
+
return 0;
|
|
71
|
+
return Math.max(0, this.resetTimeoutMs - (now - this.lastFailureTime));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
14
74
|
export class HttpClient {
|
|
15
75
|
opts;
|
|
76
|
+
circuitBreaker;
|
|
16
77
|
constructor(opts) {
|
|
17
78
|
this.opts = opts;
|
|
79
|
+
this.circuitBreaker = new CircuitBreaker(opts.circuitBreaker?.failureThreshold ?? 3, opts.circuitBreaker?.resetTimeoutMs ?? 30_000);
|
|
80
|
+
}
|
|
81
|
+
getCircuitState() {
|
|
82
|
+
return this.circuitBreaker.getState();
|
|
83
|
+
}
|
|
84
|
+
isTransientNetworkError(err) {
|
|
85
|
+
return (err instanceof TypeError &&
|
|
86
|
+
/fetch failed|network|socket|econnreset|econnrefused/i.test(err.message));
|
|
87
|
+
}
|
|
88
|
+
isTransientForCircuit(err, retryStatuses) {
|
|
89
|
+
if (err instanceof ApiError) {
|
|
90
|
+
return err.status === 408 || retryStatuses.includes(err.status);
|
|
91
|
+
}
|
|
92
|
+
return this.isTransientNetworkError(err);
|
|
18
93
|
}
|
|
19
94
|
async request(method, path, init) {
|
|
20
95
|
const url = new URL(this.opts.baseUrl + path);
|
|
@@ -34,40 +109,86 @@ export class HttpClient {
|
|
|
34
109
|
}
|
|
35
110
|
}
|
|
36
111
|
}
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
112
|
+
const maxRetries = this.opts.retry?.maxRetries ?? 2;
|
|
113
|
+
const initialDelayMs = this.opts.retry?.initialDelayMs ?? 1000;
|
|
114
|
+
const backoffMultiplier = this.opts.retry?.backoffMultiplier ?? 3;
|
|
115
|
+
const retryStatuses = this.opts.retry?.retryOnStatuses ?? [502, 503, 504];
|
|
116
|
+
if (!this.circuitBreaker.canRequest()) {
|
|
117
|
+
const retryAfterMs = this.circuitBreaker.getRetryAfterMs();
|
|
118
|
+
throw new ApiError(`Service temporarily unavailable (circuit breaker open, retry in ~${Math.ceil(retryAfterMs / 1000)}s)`, 503, url.toString(), {
|
|
119
|
+
circuitBreaker: {
|
|
120
|
+
state: this.circuitBreaker.getState(),
|
|
121
|
+
failures: this.circuitBreaker.getFailures(),
|
|
122
|
+
retryAfterMs,
|
|
46
123
|
},
|
|
47
|
-
body: init?.body ? JSON.stringify(init.body) : undefined,
|
|
48
|
-
signal: controller.signal,
|
|
49
124
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
125
|
+
}
|
|
126
|
+
let attempt = 0;
|
|
127
|
+
// All current endpoints are read-only analytics queries, including POST filters.
|
|
128
|
+
// Retry transient gateway/service failures to smooth provider-side blips.
|
|
129
|
+
try {
|
|
130
|
+
while (true) {
|
|
131
|
+
const controller = new AbortController();
|
|
132
|
+
const t = setTimeout(() => controller.abort(), this.opts.timeoutMs);
|
|
133
|
+
try {
|
|
134
|
+
const res = await fetch(url, {
|
|
135
|
+
method,
|
|
136
|
+
headers: {
|
|
137
|
+
"User-Agent": `@sfranalytics/mcp/${VERSION}`,
|
|
138
|
+
...this.opts.defaultHeaders,
|
|
139
|
+
...(init?.body ? { "Content-Type": "application/json" } : {}),
|
|
140
|
+
},
|
|
141
|
+
body: init?.body ? JSON.stringify(init.body) : undefined,
|
|
142
|
+
signal: controller.signal,
|
|
143
|
+
});
|
|
144
|
+
const contentType = res.headers.get("content-type") ?? "";
|
|
145
|
+
const isJson = contentType.includes("application/json");
|
|
146
|
+
const payload = isJson
|
|
147
|
+
? await res.json().catch(() => undefined)
|
|
148
|
+
: await res.text().catch(() => "");
|
|
149
|
+
if (!res.ok) {
|
|
150
|
+
const apiErr = new ApiError(`HTTP ${res.status} ${method} ${path}`, res.status, url.toString(), payload);
|
|
151
|
+
const canRetry = attempt < maxRetries && retryStatuses.includes(res.status);
|
|
152
|
+
if (canRetry) {
|
|
153
|
+
const delayMs = Math.round(initialDelayMs * Math.pow(backoffMultiplier, attempt));
|
|
154
|
+
attempt += 1;
|
|
155
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
throw apiErr;
|
|
159
|
+
}
|
|
160
|
+
this.circuitBreaker.onSuccess();
|
|
161
|
+
return payload;
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (err instanceof ApiError)
|
|
165
|
+
throw err;
|
|
166
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
167
|
+
throw new ApiError(`Timeout after ${this.opts.timeoutMs}ms`, 408, url.toString());
|
|
168
|
+
}
|
|
169
|
+
const canRetryNetworkError = attempt < maxRetries && this.isTransientNetworkError(err);
|
|
170
|
+
if (canRetryNetworkError) {
|
|
171
|
+
const delayMs = Math.round(initialDelayMs * Math.pow(backoffMultiplier, attempt));
|
|
172
|
+
attempt += 1;
|
|
173
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
clearTimeout(t);
|
|
180
|
+
}
|
|
57
181
|
}
|
|
58
|
-
return payload;
|
|
59
182
|
}
|
|
60
183
|
catch (err) {
|
|
61
|
-
if (err
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
184
|
+
if (this.isTransientForCircuit(err, retryStatuses)) {
|
|
185
|
+
this.circuitBreaker.onTransientFailure();
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
this.circuitBreaker.onNonTransientFailure();
|
|
65
189
|
}
|
|
66
190
|
throw err;
|
|
67
191
|
}
|
|
68
|
-
finally {
|
|
69
|
-
clearTimeout(t);
|
|
70
|
-
}
|
|
71
192
|
}
|
|
72
193
|
}
|
|
73
194
|
//# sourceMappingURL=httpClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../src/services/httpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IACA;IAJlB,YACE,OAAe,EACC,MAAc,EACd,GAAW,EACX,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QACd,QAAG,GAAH,GAAG,CAAQ;QACX,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../src/services/httpClient.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/formatters.js
CHANGED
|
@@ -140,9 +140,36 @@ function sanitizeErrorDetail(raw, maxLen = 500) {
|
|
|
140
140
|
*/
|
|
141
141
|
export function handleToolError(err, toolName) {
|
|
142
142
|
let detail;
|
|
143
|
+
const hints = [];
|
|
143
144
|
if (err instanceof ApiError) {
|
|
145
|
+
const detailsRecord = typeof err.details === "object" && err.details !== null
|
|
146
|
+
? err.details
|
|
147
|
+
: null;
|
|
148
|
+
const breakerState = detailsRecord &&
|
|
149
|
+
typeof detailsRecord.circuitBreaker === "object" &&
|
|
150
|
+
detailsRecord.circuitBreaker !== null
|
|
151
|
+
? detailsRecord.circuitBreaker.state
|
|
152
|
+
: null;
|
|
144
153
|
const raw = err.details != null ? JSON.stringify(err.details) : (err.message || "unknown api error");
|
|
145
154
|
detail = `HTTP ${err.status} - ${sanitizeErrorDetail(raw)}`;
|
|
155
|
+
if (err.status === 408) {
|
|
156
|
+
if (toolName === "sfr_rental_stats") {
|
|
157
|
+
hints.push("State-level rental stats can timeout. Try city or zip scope instead.");
|
|
158
|
+
}
|
|
159
|
+
else if (toolName === "sfr_rental_market_analysis") {
|
|
160
|
+
hints.push("Try geography_type='city' with fewer locations and a shorter date range.");
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
hints.push("The query timed out. Try narrowing filters or reducing scope.");
|
|
164
|
+
}
|
|
165
|
+
hints.push("Use sfra_health to verify upstream responsiveness before retrying.");
|
|
166
|
+
}
|
|
167
|
+
if ([502, 503, 504].includes(err.status)) {
|
|
168
|
+
hints.push(`Upstream API unavailable (HTTP ${err.status}). Use sfra_health to check status, then retry in 30-60s.`);
|
|
169
|
+
}
|
|
170
|
+
if (breakerState === "open" || /circuit breaker/i.test(err.message)) {
|
|
171
|
+
hints.push("Multiple recent transient failures tripped the circuit breaker. Requests will auto-resume after cooldown.");
|
|
172
|
+
}
|
|
146
173
|
}
|
|
147
174
|
else if (err instanceof Error) {
|
|
148
175
|
detail = sanitizeErrorDetail(err.message);
|
|
@@ -150,7 +177,8 @@ export function handleToolError(err, toolName) {
|
|
|
150
177
|
else {
|
|
151
178
|
detail = sanitizeErrorDetail(String(err));
|
|
152
179
|
}
|
|
153
|
-
|
|
180
|
+
const hintText = hints.length > 0 ? ` Hint: ${hints.join(" ")}` : "";
|
|
181
|
+
return errorContent(`${toolName} failed: ${detail}${hintText}`);
|
|
154
182
|
}
|
|
155
183
|
/** Format a dollar amount with adaptive B/M/K suffix */
|
|
156
184
|
export function fmtDollars(v) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/tools/formatters.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/tools/formatters.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/health.js
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { ApiError } from "../services/httpClient.js";
|
|
2
3
|
import { structuredResult } from "./formatters.js";
|
|
3
4
|
import { registerToolSafe } from "./registerToolSafe.js";
|
|
5
|
+
function summarizeProbeError(err) {
|
|
6
|
+
if (err instanceof ApiError)
|
|
7
|
+
return `HTTP ${err.status}`;
|
|
8
|
+
if (err instanceof Error)
|
|
9
|
+
return err.message;
|
|
10
|
+
return String(err);
|
|
11
|
+
}
|
|
12
|
+
async function runSfrProbe(sfr) {
|
|
13
|
+
const t0 = Date.now();
|
|
14
|
+
const health = await sfr.healthCheck();
|
|
15
|
+
let dataProbeOk = null;
|
|
16
|
+
let dataProbeError;
|
|
17
|
+
const dataProbeName = "zip detail (85004)";
|
|
18
|
+
if (typeof sfr.getZipDetail === "function") {
|
|
19
|
+
try {
|
|
20
|
+
await sfr.getZipDetail("85004");
|
|
21
|
+
dataProbeOk = true;
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
dataProbeOk = false;
|
|
25
|
+
dataProbeError = summarizeProbeError(err);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
ok: health.ok && (dataProbeOk ?? true),
|
|
30
|
+
latencyMs: Date.now() - t0,
|
|
31
|
+
healthEndpointOk: health.ok,
|
|
32
|
+
dataProbeOk,
|
|
33
|
+
dataProbeName: typeof sfr.getZipDetail === "function" ? dataProbeName : null,
|
|
34
|
+
dataProbeError,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function runPlrProbe(plr) {
|
|
38
|
+
const t0 = Date.now();
|
|
39
|
+
const health = await plr.healthCheck();
|
|
40
|
+
let dataProbeOk = null;
|
|
41
|
+
let dataProbeError;
|
|
42
|
+
const dataProbeName = "portfolio summary (Jan 2024)";
|
|
43
|
+
if (typeof plr.portfolioSummary === "function") {
|
|
44
|
+
try {
|
|
45
|
+
await plr.portfolioSummary({
|
|
46
|
+
start_date: "2024-01-01",
|
|
47
|
+
end_date: "2024-01-31",
|
|
48
|
+
});
|
|
49
|
+
dataProbeOk = true;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
dataProbeOk = false;
|
|
53
|
+
dataProbeError = summarizeProbeError(err);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
ok: health.ok && (dataProbeOk ?? true),
|
|
58
|
+
latencyMs: Date.now() - t0,
|
|
59
|
+
healthEndpointOk: health.ok,
|
|
60
|
+
dataProbeOk,
|
|
61
|
+
dataProbeName: typeof plr.portfolioSummary === "function" ? dataProbeName : null,
|
|
62
|
+
dataProbeError,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
4
65
|
export function registerHealthTool(server, sfr, plr, config) {
|
|
5
66
|
registerToolSafe(server, "sfra_health", {
|
|
6
67
|
title: "SFRA MCP health check",
|
|
@@ -11,22 +72,38 @@ export function registerHealthTool(server, sfr, plr, config) {
|
|
|
11
72
|
}, async () => {
|
|
12
73
|
const lines = ["## SFRA MCP Health Check", ""];
|
|
13
74
|
const structured = {};
|
|
14
|
-
// Run
|
|
75
|
+
// Run probes in parallel when both are configured.
|
|
76
|
+
// A service is considered OK only if both health endpoint and a real
|
|
77
|
+
// data endpoint probe pass.
|
|
15
78
|
const [sfrHealth, plrHealth] = await Promise.all([
|
|
16
|
-
sfr && config.sfr ? sfr
|
|
17
|
-
plr && config.plr ? plr
|
|
79
|
+
sfr && config.sfr ? runSfrProbe(sfr) : null,
|
|
80
|
+
plr && config.plr ? runPlrProbe(plr) : null,
|
|
18
81
|
]);
|
|
19
82
|
if (sfrHealth) {
|
|
20
|
-
lines.push(`**SFR API**`, ` Status: ${sfrHealth.ok ? "OK" : "FAILED"}`, ` Latency: ${sfrHealth.latencyMs}ms`, "");
|
|
21
|
-
structured.sfr = {
|
|
83
|
+
lines.push(`**SFR API**`, ` Status: ${sfrHealth.ok ? "OK" : "FAILED"}`, ` Latency: ${sfrHealth.latencyMs}ms`, ` Health endpoint: ${sfrHealth.healthEndpointOk ? "OK" : "FAILED"}`, ` Data probe (${sfrHealth.dataProbeName ?? "not available"}): ${sfrHealth.dataProbeOk == null ? "SKIPPED" : (sfrHealth.dataProbeOk ? "OK" : "FAILED")}`, ...(sfrHealth.dataProbeError ? [` Probe error: ${sfrHealth.dataProbeError}`] : []), "");
|
|
84
|
+
structured.sfr = {
|
|
85
|
+
ok: sfrHealth.ok,
|
|
86
|
+
latencyMs: sfrHealth.latencyMs,
|
|
87
|
+
healthEndpointOk: sfrHealth.healthEndpointOk,
|
|
88
|
+
dataProbeOk: sfrHealth.dataProbeOk,
|
|
89
|
+
dataProbeName: sfrHealth.dataProbeName,
|
|
90
|
+
dataProbeError: sfrHealth.dataProbeError,
|
|
91
|
+
};
|
|
22
92
|
}
|
|
23
93
|
else {
|
|
24
94
|
lines.push("**SFR API** — not configured", " Add SFR_API_TOKEN to enable 21 property, buyer, and market tools", "");
|
|
25
95
|
structured.sfr = { configured: false };
|
|
26
96
|
}
|
|
27
97
|
if (plrHealth) {
|
|
28
|
-
lines.push(`**PLR API**`, ` Status: ${plrHealth.ok ? "OK" : "FAILED"}`, ` Latency: ${plrHealth.latencyMs}ms`);
|
|
29
|
-
structured.plr = {
|
|
98
|
+
lines.push(`**PLR API**`, ` Status: ${plrHealth.ok ? "OK" : "FAILED"}`, ` Latency: ${plrHealth.latencyMs}ms`, ` Health endpoint: ${plrHealth.healthEndpointOk ? "OK" : "FAILED"}`, ` Data probe (${plrHealth.dataProbeName ?? "not available"}): ${plrHealth.dataProbeOk == null ? "SKIPPED" : (plrHealth.dataProbeOk ? "OK" : "FAILED")}`, ...(plrHealth.dataProbeError ? [` Probe error: ${plrHealth.dataProbeError}`] : []));
|
|
99
|
+
structured.plr = {
|
|
100
|
+
ok: plrHealth.ok,
|
|
101
|
+
latencyMs: plrHealth.latencyMs,
|
|
102
|
+
healthEndpointOk: plrHealth.healthEndpointOk,
|
|
103
|
+
dataProbeOk: plrHealth.dataProbeOk,
|
|
104
|
+
dataProbeName: plrHealth.dataProbeName,
|
|
105
|
+
dataProbeError: plrHealth.dataProbeError,
|
|
106
|
+
};
|
|
30
107
|
}
|
|
31
108
|
else {
|
|
32
109
|
lines.push("**PLR API** — not configured", " Add PLR_API_TOKEN to enable 15 lending and borrower tools");
|
package/dist/tools/health.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"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"}
|