@sfranalytics/mcp 0.6.0

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.
Files changed (198) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +147 -0
  3. package/dist/config.d.ts +28 -0
  4. package/dist/config.js +101 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/http.d.ts +2 -0
  7. package/dist/http.js +252 -0
  8. package/dist/http.js.map +1 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.js +41 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/server.d.ts +3 -0
  13. package/dist/server.js +213 -0
  14. package/dist/server.js.map +1 -0
  15. package/dist/services/httpClient.d.ts +19 -0
  16. package/dist/services/httpClient.js +73 -0
  17. package/dist/services/httpClient.js.map +1 -0
  18. package/dist/services/plr.d.ts +26 -0
  19. package/dist/services/plr.js +75 -0
  20. package/dist/services/plr.js.map +1 -0
  21. package/dist/services/sfr.d.ts +33 -0
  22. package/dist/services/sfr.js +124 -0
  23. package/dist/services/sfr.js.map +1 -0
  24. package/dist/services/snowflake.d.ts +12 -0
  25. package/dist/services/snowflake.js +71 -0
  26. package/dist/services/snowflake.js.map +1 -0
  27. package/dist/tools/dateHelper.d.ts +26 -0
  28. package/dist/tools/dateHelper.js +86 -0
  29. package/dist/tools/dateHelper.js.map +1 -0
  30. package/dist/tools/formatters.d.ts +66 -0
  31. package/dist/tools/formatters.js +219 -0
  32. package/dist/tools/formatters.js.map +1 -0
  33. package/dist/tools/health.d.ts +5 -0
  34. package/dist/tools/health.js +38 -0
  35. package/dist/tools/health.js.map +1 -0
  36. package/dist/tools/nextActions.d.ts +10 -0
  37. package/dist/tools/nextActions.js +23 -0
  38. package/dist/tools/nextActions.js.map +1 -0
  39. package/dist/tools/plr/borrowerContacts.d.ts +3 -0
  40. package/dist/tools/plr/borrowerContacts.js +73 -0
  41. package/dist/tools/plr/borrowerContacts.js.map +1 -0
  42. package/dist/tools/plr/borrowerLoans.d.ts +3 -0
  43. package/dist/tools/plr/borrowerLoans.js +115 -0
  44. package/dist/tools/plr/borrowerLoans.js.map +1 -0
  45. package/dist/tools/plr/borrowerProfile.d.ts +3 -0
  46. package/dist/tools/plr/borrowerProfile.js +201 -0
  47. package/dist/tools/plr/borrowerProfile.js.map +1 -0
  48. package/dist/tools/plr/borrowerRankings.d.ts +3 -0
  49. package/dist/tools/plr/borrowerRankings.js +123 -0
  50. package/dist/tools/plr/borrowerRankings.js.map +1 -0
  51. package/dist/tools/plr/borrowerSearch.d.ts +3 -0
  52. package/dist/tools/plr/borrowerSearch.js +128 -0
  53. package/dist/tools/plr/borrowerSearch.js.map +1 -0
  54. package/dist/tools/plr/churnedBorrowers.d.ts +3 -0
  55. package/dist/tools/plr/churnedBorrowers.js +86 -0
  56. package/dist/tools/plr/churnedBorrowers.js.map +1 -0
  57. package/dist/tools/plr/lenderBorrowers.d.ts +3 -0
  58. package/dist/tools/plr/lenderBorrowers.js +71 -0
  59. package/dist/tools/plr/lenderBorrowers.js.map +1 -0
  60. package/dist/tools/plr/lenderRankings.d.ts +3 -0
  61. package/dist/tools/plr/lenderRankings.js +74 -0
  62. package/dist/tools/plr/lenderRankings.js.map +1 -0
  63. package/dist/tools/plr/loansNearby.d.ts +3 -0
  64. package/dist/tools/plr/loansNearby.js +113 -0
  65. package/dist/tools/plr/loansNearby.js.map +1 -0
  66. package/dist/tools/plr/marketTrends.d.ts +3 -0
  67. package/dist/tools/plr/marketTrends.js +95 -0
  68. package/dist/tools/plr/marketTrends.js.map +1 -0
  69. package/dist/tools/plr/msaRankings.d.ts +3 -0
  70. package/dist/tools/plr/msaRankings.js +74 -0
  71. package/dist/tools/plr/msaRankings.js.map +1 -0
  72. package/dist/tools/plr/negativeRemarks.d.ts +3 -0
  73. package/dist/tools/plr/negativeRemarks.js +94 -0
  74. package/dist/tools/plr/negativeRemarks.js.map +1 -0
  75. package/dist/tools/plr/ownerSearch.d.ts +3 -0
  76. package/dist/tools/plr/ownerSearch.js +57 -0
  77. package/dist/tools/plr/ownerSearch.js.map +1 -0
  78. package/dist/tools/plr/portfolioSummary.d.ts +3 -0
  79. package/dist/tools/plr/portfolioSummary.js +99 -0
  80. package/dist/tools/plr/portfolioSummary.js.map +1 -0
  81. package/dist/tools/plr/topBorrowers.d.ts +3 -0
  82. package/dist/tools/plr/topBorrowers.js +69 -0
  83. package/dist/tools/plr/topBorrowers.js.map +1 -0
  84. package/dist/tools/plr/topLenders.d.ts +3 -0
  85. package/dist/tools/plr/topLenders.js +75 -0
  86. package/dist/tools/plr/topLenders.js.map +1 -0
  87. package/dist/tools/plr/transactionHistory.d.ts +3 -0
  88. package/dist/tools/plr/transactionHistory.js +74 -0
  89. package/dist/tools/plr/transactionHistory.js.map +1 -0
  90. package/dist/tools/prompts.d.ts +7 -0
  91. package/dist/tools/prompts.js +157 -0
  92. package/dist/tools/prompts.js.map +1 -0
  93. package/dist/tools/registerToolSafe.d.ts +29 -0
  94. package/dist/tools/registerToolSafe.js +36 -0
  95. package/dist/tools/registerToolSafe.js.map +1 -0
  96. package/dist/tools/sfr/activityHighlights.d.ts +3 -0
  97. package/dist/tools/sfr/activityHighlights.js +70 -0
  98. package/dist/tools/sfr/activityHighlights.js.map +1 -0
  99. package/dist/tools/sfr/bestBuyers.d.ts +3 -0
  100. package/dist/tools/sfr/bestBuyers.js +60 -0
  101. package/dist/tools/sfr/bestBuyers.js.map +1 -0
  102. package/dist/tools/sfr/buyerGrowth.d.ts +3 -0
  103. package/dist/tools/sfr/buyerGrowth.js +68 -0
  104. package/dist/tools/sfr/buyerGrowth.js.map +1 -0
  105. package/dist/tools/sfr/buyerProfile.d.ts +3 -0
  106. package/dist/tools/sfr/buyerProfile.js +162 -0
  107. package/dist/tools/sfr/buyerProfile.js.map +1 -0
  108. package/dist/tools/sfr/distressSearch.d.ts +3 -0
  109. package/dist/tools/sfr/distressSearch.js +173 -0
  110. package/dist/tools/sfr/distressSearch.js.map +1 -0
  111. package/dist/tools/sfr/flipActivity.d.ts +3 -0
  112. package/dist/tools/sfr/flipActivity.js +110 -0
  113. package/dist/tools/sfr/flipActivity.js.map +1 -0
  114. package/dist/tools/sfr/flipStats.d.ts +3 -0
  115. package/dist/tools/sfr/flipStats.js +98 -0
  116. package/dist/tools/sfr/flipStats.js.map +1 -0
  117. package/dist/tools/sfr/getProperty.d.ts +3 -0
  118. package/dist/tools/sfr/getProperty.js +142 -0
  119. package/dist/tools/sfr/getProperty.js.map +1 -0
  120. package/dist/tools/sfr/institutionalOwners.d.ts +3 -0
  121. package/dist/tools/sfr/institutionalOwners.js +88 -0
  122. package/dist/tools/sfr/institutionalOwners.js.map +1 -0
  123. package/dist/tools/sfr/investorActivity.d.ts +3 -0
  124. package/dist/tools/sfr/investorActivity.js +130 -0
  125. package/dist/tools/sfr/investorActivity.js.map +1 -0
  126. package/dist/tools/sfr/marketHighlights.d.ts +3 -0
  127. package/dist/tools/sfr/marketHighlights.js +100 -0
  128. package/dist/tools/sfr/marketHighlights.js.map +1 -0
  129. package/dist/tools/sfr/msaResolver.d.ts +15 -0
  130. package/dist/tools/sfr/msaResolver.js +109 -0
  131. package/dist/tools/sfr/msaResolver.js.map +1 -0
  132. package/dist/tools/sfr/propertyBatch.d.ts +3 -0
  133. package/dist/tools/sfr/propertyBatch.js +73 -0
  134. package/dist/tools/sfr/propertyBatch.js.map +1 -0
  135. package/dist/tools/sfr/propertyComps.d.ts +3 -0
  136. package/dist/tools/sfr/propertyComps.js +56 -0
  137. package/dist/tools/sfr/propertyComps.js.map +1 -0
  138. package/dist/tools/sfr/propertyTransactions.d.ts +3 -0
  139. package/dist/tools/sfr/propertyTransactions.js +50 -0
  140. package/dist/tools/sfr/propertyTransactions.js.map +1 -0
  141. package/dist/tools/sfr/rentalComparables.d.ts +3 -0
  142. package/dist/tools/sfr/rentalComparables.js +91 -0
  143. package/dist/tools/sfr/rentalComparables.js.map +1 -0
  144. package/dist/tools/sfr/rentalMarketAnalysis.d.ts +3 -0
  145. package/dist/tools/sfr/rentalMarketAnalysis.js +134 -0
  146. package/dist/tools/sfr/rentalMarketAnalysis.js.map +1 -0
  147. package/dist/tools/sfr/rentalStats.d.ts +3 -0
  148. package/dist/tools/sfr/rentalStats.js +118 -0
  149. package/dist/tools/sfr/rentalStats.js.map +1 -0
  150. package/dist/tools/sfr/searchProperties.d.ts +3 -0
  151. package/dist/tools/sfr/searchProperties.js +157 -0
  152. package/dist/tools/sfr/searchProperties.js.map +1 -0
  153. package/dist/tools/sfr/topBuyers.d.ts +3 -0
  154. package/dist/tools/sfr/topBuyers.js +91 -0
  155. package/dist/tools/sfr/topBuyers.js.map +1 -0
  156. package/dist/tools/sfr/zipDetail.d.ts +3 -0
  157. package/dist/tools/sfr/zipDetail.js +85 -0
  158. package/dist/tools/sfr/zipDetail.js.map +1 -0
  159. package/dist/tools/sfr/zipFinder.d.ts +3 -0
  160. package/dist/tools/sfr/zipFinder.js +79 -0
  161. package/dist/tools/sfr/zipFinder.js.map +1 -0
  162. package/dist/tools/slugHelper.d.ts +2 -0
  163. package/dist/tools/slugHelper.js +5 -0
  164. package/dist/tools/slugHelper.js.map +1 -0
  165. package/dist/tools/snowflake/compareMarkets.d.ts +2 -0
  166. package/dist/tools/snowflake/compareMarkets.js +95 -0
  167. package/dist/tools/snowflake/compareMarkets.js.map +1 -0
  168. package/dist/tools/snowflake/hviTrend.d.ts +2 -0
  169. package/dist/tools/snowflake/hviTrend.js +77 -0
  170. package/dist/tools/snowflake/hviTrend.js.map +1 -0
  171. package/dist/tools/snowflake/investorActivity.d.ts +2 -0
  172. package/dist/tools/snowflake/investorActivity.js +138 -0
  173. package/dist/tools/snowflake/investorActivity.js.map +1 -0
  174. package/dist/tools/snowflake/marketSnapshot.d.ts +2 -0
  175. package/dist/tools/snowflake/marketSnapshot.js +185 -0
  176. package/dist/tools/snowflake/marketSnapshot.js.map +1 -0
  177. package/dist/tools/snowflake/marketTrends.d.ts +2 -0
  178. package/dist/tools/snowflake/marketTrends.js +81 -0
  179. package/dist/tools/snowflake/marketTrends.js.map +1 -0
  180. package/dist/tools/snowflake/rankRentalZips.d.ts +2 -0
  181. package/dist/tools/snowflake/rankRentalZips.js +94 -0
  182. package/dist/tools/snowflake/rankRentalZips.js.map +1 -0
  183. package/dist/tools/snowflake/rankZips.d.ts +2 -0
  184. package/dist/tools/snowflake/rankZips.js +86 -0
  185. package/dist/tools/snowflake/rankZips.js.map +1 -0
  186. package/dist/tools/snowflake/rentalMarket.d.ts +2 -0
  187. package/dist/tools/snowflake/rentalMarket.js +111 -0
  188. package/dist/tools/snowflake/rentalMarket.js.map +1 -0
  189. package/dist/tools/snowflake/rentalYield.d.ts +2 -0
  190. package/dist/tools/snowflake/rentalYield.js +143 -0
  191. package/dist/tools/snowflake/rentalYield.js.map +1 -0
  192. package/dist/tools/snowflake/zipProfile.d.ts +2 -0
  193. package/dist/tools/snowflake/zipProfile.js +110 -0
  194. package/dist/tools/snowflake/zipProfile.js.map +1 -0
  195. package/dist/version.d.ts +1 -0
  196. package/dist/version.js +5 -0
  197. package/dist/version.js.map +1 -0
  198. package/package.json +53 -0
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ import { sfQuery } from "../../services/snowflake.js";
3
+ import { structuredResult, kvSummary } from "../formatters.js";
4
+ import { action } from "../nextActions.js";
5
+ import { registerToolSafe } from "../registerToolSafe.js";
6
+ const DEMO = "MARKETPLACE_ZIP.PUBLIC.ZIP_CODE_DEMOGRAPHICS";
7
+ const HOUSING = "MARKETPLACE_ZIP.PUBLIC.ZIP_CODE_HOUSING";
8
+ const META = "MARKETPLACE_ZIP.PUBLIC.ZIP_CODE_META";
9
+ const Input = z.object({
10
+ zipCode: z.string().describe("5-digit ZIP code"),
11
+ });
12
+ function fmt$(v) { return v !== null ? "$" + Math.round(v).toLocaleString() : "—"; }
13
+ function fmtPct(v, d = 1) { return v !== null ? (v * 100).toFixed(d) + "%" : "—"; }
14
+ function fmtNum(v) { return v !== null ? Math.round(v).toLocaleString() : "—"; }
15
+ export function registerZipProfileTool(server) {
16
+ registerToolSafe(server, "sfr_zip_profile", {
17
+ title: "Census demographics + housing stock for a ZIP (Snowflake)",
18
+ description: "Comprehensive ZIP profile: population, median age/income/net worth, education, ethnicity, " +
19
+ "housing stock (owner vs renter %, vacancy, HVI, RE tax), SFH detail (avg beds/sqft/lot, " +
20
+ "year built, LTV, mortgage rate, HOA %, pool %, pre-foreclosure %), condo/MF counts.",
21
+ inputSchema: Input,
22
+ }, async (args) => {
23
+ const [demoRows, housingRows, metaRows] = await Promise.all([
24
+ sfQuery(`SELECT * FROM ${DEMO} WHERE ZIP_CODE = ?`, [args.zipCode]),
25
+ sfQuery(`SELECT * FROM ${HOUSING} WHERE ZIP_CODE = ?`, [args.zipCode]),
26
+ sfQuery(`SELECT ZIP_CODE, CITY, STATE, COUNTY, CBSA, FIPS, DMA_NAME, LAND_SQ_MILES, LATITUDE, LONGITUDE
27
+ FROM ${META} WHERE ZIP_CODE = ?`, [args.zipCode]),
28
+ ]);
29
+ const d = demoRows[0];
30
+ const h = housingRows[0];
31
+ const m = metaRows[0];
32
+ if (!d && !h && !m) {
33
+ return structuredResult(`## ZIP Profile — ${args.zipCode}\n\n_No data found._`, {});
34
+ }
35
+ const lines = [
36
+ `## ZIP Profile — ${args.zipCode}${m ? ` — ${m.CITY ?? ""}, ${m.STATE ?? ""}` : ""}`,
37
+ m?.COUNTY ? `_${m.COUNTY} County_` : "",
38
+ m?.CBSA ? `_Metro: ${m.CBSA}_` : "",
39
+ m?.LAND_SQ_MILES ? `_Land: ${m.LAND_SQ_MILES.toFixed(1)} sq mi_` : "",
40
+ ];
41
+ if (d) {
42
+ lines.push("", "### Demographics", kvSummary([
43
+ ["Population", `${fmtNum(d.TOTAL_POPULATION)}${d.POPULATION_PER_SQM ? ` (${fmtNum(d.POPULATION_PER_SQM)}/sq mi)` : ""}`],
44
+ ["Median Age", d.MEDIAN_AGE],
45
+ ["Avg HH Size", d.AVG_HH_SIZE],
46
+ ["Avg Residence Length", d.AVG_HH_LENGTH_RES !== null ? `${d.AVG_HH_LENGTH_RES} yrs` : undefined],
47
+ ]), "", "### Income & Education", kvSummary([
48
+ ["Median HH Income", fmt$(d.MED_HH_INCOME)],
49
+ ["Avg HH Income", fmt$(d.AVG_HH_INCOME)],
50
+ ["Avg HH Net Worth", fmt$(d.AVG_HH_NET_WORTH)],
51
+ ["Bachelor's+", fmtPct(d.PCT_BACHELORS_DEG)],
52
+ ["Graduate Degree", fmtPct(d.PCT_GRADUATE_DEG)],
53
+ ["HS Grad+", fmtPct(d.PCT_HS_GRAD)],
54
+ ]), "", "### Ethnicity", kvSummary([
55
+ ["White", fmtPct(d.PCT_RACE_WHITE)],
56
+ ["Hispanic", fmtPct(d.PCT_RACE_HISPANIC)],
57
+ ["Black", fmtPct(d.PCT_RACE_AFRICAN_AMERICAN)],
58
+ ["Asian", fmtPct(d.PCT_RACE_ASIAN)],
59
+ ]), "", "### Household", kvSummary([
60
+ ["Single Parent", fmtPct(d.PCT_HH_SINGLE_PARENT)],
61
+ ["Veteran", fmtPct(d.PCT_HH_VETERAN)],
62
+ ...(d.PCT_HH_POLITICS_DEM !== null
63
+ ? [["Political", `Dem ${fmtPct(d.PCT_HH_POLITICS_DEM)} | Rep ${fmtPct(d.PCT_HH_POLITICS_REP)} | Ind ${fmtPct(d.PCT_HH_POLITICS_IND)}`]]
64
+ : []),
65
+ ]));
66
+ }
67
+ if (h) {
68
+ lines.push("", "### Housing Stock", kvSummary([
69
+ ["Total Units", fmtNum(h.TOTAL_HOUSING_UNITS)],
70
+ ["Occupied", `${fmtNum(h.TOTAL_OCCUPIED_HOUSING)} (Owner: ${fmtPct(h.PCT_OWNER_OCC)} | Renter: ${fmtPct(h.PCT_RENTER_OCC)})`],
71
+ ["Vacant", fmtNum(h.TOTAL_VACANT_HOUSING)],
72
+ ["Blended HVI", fmt$(h.BLENDED_HVI)],
73
+ ["Median RE Tax", fmt$(h.MEDIAN_REAL_ESTATE_TAX)],
74
+ ]));
75
+ if (h.SFH_UNITS) {
76
+ lines.push("", "### Single Family Detail", kvSummary([
77
+ ["SFH Units", `${fmtNum(h.SFH_UNITS)} | HVI: ${fmt$(h.SFH_HVI)}`],
78
+ ["Avg Size", `${h.SFH_AVG_BEDS ?? "?"}bd / ${fmtNum(h.SFH_AVG_SQFT)} sqft / ${fmtNum(h.SFH_AVG_LOT_SIZE)} lot sqft`],
79
+ ["Avg Year Built", h.SFH_AVG_YEAR_BUILT ?? undefined],
80
+ ["Avg LTV", `${fmtPct(h.SFH_AVG_LTV)} | Free & Clear: ${fmtPct(h.SFH_PCT_FREE_AND_CLEAR)}`],
81
+ ["Avg Mortgage Rate", h.SFH_AVG_MTG_1_RATE !== null ? `${h.SFH_AVG_MTG_1_RATE}%` : undefined],
82
+ ["HOA", `${fmtPct(h.SFH_PCT_HOA_PRESENT)} | Pool: ${fmtPct(h.SFH_PCT_POOL_PRESENT)}`],
83
+ ["Listed", `${fmtPct(h.SFH_PCT_LISTED)} | Pre-Foreclosure: ${fmtPct(h.SFH_PCT_PRE_FORECLOSURE)}`],
84
+ ]));
85
+ }
86
+ const extras = [];
87
+ if (h.CONDO_UNITS)
88
+ extras.push(`Condos: ${fmtNum(h.CONDO_UNITS)} (HVI: ${fmt$(h.CONDO_HVI)})`);
89
+ if (h.MULTI_FAMILY_UNITS)
90
+ extras.push(`Multi-Family: ${fmtNum(h.MULTI_FAMILY_UNITS)}`);
91
+ if (h.DUPLEX_RES_UNITS)
92
+ extras.push(`Duplex: ${fmtNum(h.DUPLEX_RES_UNITS)}`);
93
+ if (extras.length > 0) {
94
+ lines.push("", "### Other Property Types", extras.join("\n"));
95
+ }
96
+ }
97
+ const actions = [
98
+ action("sfr_hvi_trend", "Home value trend", { zipCode: args.zipCode }),
99
+ action("sfr_market_snapshot", "Redfin market data", { zipCode: args.zipCode, state: m?.STATE ?? "" }),
100
+ action("sfr_rental_yield", "Rental yield", { zipCode: args.zipCode, state: m?.STATE ?? "" }),
101
+ action("sfr_zip_investor_activity", "Investor activity", { zipCode: args.zipCode, state: m?.STATE ?? "" }),
102
+ ];
103
+ return structuredResult(lines.filter(Boolean).join("\n"), {
104
+ zipCode: args.zipCode, city: m?.CITY, state: m?.STATE, county: m?.COUNTY, metro: m?.CBSA,
105
+ population: d?.TOTAL_POPULATION, medianIncome: d?.MED_HH_INCOME,
106
+ pctOwnerOcc: h?.PCT_OWNER_OCC, blendedHvi: h?.BLENDED_HVI, totalUnits: h?.TOTAL_HOUSING_UNITS,
107
+ }, actions);
108
+ });
109
+ }
110
+ //# sourceMappingURL=zipProfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zipProfile.js","sourceRoot":"","sources":["../../../src/tools/snowflake/zipProfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const VERSION: string;
@@ -0,0 +1,5 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ const pkg = require("../package.json");
4
+ export const VERSION = pkg.version;
5
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@sfranalytics/mcp",
3
+ "version": "0.6.0",
4
+ "description": "MCP server for SFR Analytics — single-family rental property data, buyer intelligence, and private lending insights",
5
+ "type": "module",
6
+ "license": "SEE LICENSE IN LICENSE",
7
+ "author": "SFR Analytics <support@sfranalytics.com> (https://www.sfranalytics.com)",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/SFR-Analytics/sfra-mcp.git"
11
+ },
12
+ "homepage": "https://www.sfranalytics.com",
13
+ "main": "dist/index.js",
14
+ "bin": {
15
+ "sfranalytics-mcp": "dist/index.js",
16
+ "sfranalytics-mcp-http": "dist/http.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "LICENSE",
21
+ "README.md"
22
+ ],
23
+ "engines": {
24
+ "node": ">=18.0.0"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc",
31
+ "dev": "tsx src/index.ts",
32
+ "dev:http": "tsx src/http.ts",
33
+ "start": "node dist/index.js",
34
+ "start:http": "node dist/http.js",
35
+ "lint": "tsc --noEmit",
36
+ "prepublishOnly": "npm run build"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.26.0",
40
+ "cors": "^2.8.6",
41
+ "express": "^5.2.1",
42
+ "snowflake-sdk": "^1.15.0",
43
+ "zod": "^3.24.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/cors": "^2.8.19",
47
+ "@types/express": "^5.0.6",
48
+ "@types/node": "^22.0.0",
49
+ "@types/snowflake-sdk": "^1.6.0",
50
+ "tsx": "^4.19.0",
51
+ "typescript": "^5.7.0"
52
+ }
53
+ }