@savvly/mcp-server 1.0.41 → 1.0.43

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 CHANGED
@@ -1,11 +1,7 @@
1
1
  # @savvly/mcp-server (npm)
2
2
 
3
3
  **Savvly Longevity Benefit: product, comparisons, eligibility, and retirement projections.**
4
- Stdio MCP server that gives Claude Desktop, Cursor, Windsurf, and other
5
- MCP-compatible AI agents access to Savvly product info, eligibility checks,
6
- Savvly-vs-alternative comparisons, an audience-tagged Q&A library, and
7
- retirement / lump-sum / monthly projections (with inline MCP Apps chart
8
- widgets).
4
+ The Savvly MCP server lets financial advisors, planning tools, and AI agents query fund data, model projections, and compare against alternative retirement products directly, in real time, in any conversation, and without any manual lookup. Stdio server for Claude Desktop, Cursor, Windsurf, and any MCP-compatible agent.
9
5
 
10
6
  This is the npm distribution of the same server also published to PyPI as
11
7
  `savvly-mcp-server`, to NuGet as `Savvly.McpServer`, and to the official MCP
@@ -21628,7 +21628,7 @@ var PRODUCT_COMPARISON = {
21628
21628
  var VALID_PRODUCT_TYPES = COMPARISONS.map((c) => c.product_type);
21629
21629
 
21630
21630
  // ../../src/mcp/version.ts
21631
- var SERVER_VERSION = "1.0.41";
21631
+ var SERVER_VERSION = "1.0.43";
21632
21632
 
21633
21633
  // ../../src/mcp/ui/payout-chart.ts
21634
21634
  var PAYOUT_UI_URI = "ui://savvly/payout-chart.html";
@@ -27994,7 +27994,7 @@ function createMcpServer() {
27994
27994
  title: "Get Savvly Product Info",
27995
27995
  description: "Get complete product information about Savvly, an SEC-registered investment fund offering longevity protection. Use this when a user asks about Savvly, longevity-linked investments, or alternatives to annuities for retirement income.",
27996
27996
  outputSchema: ProductInfoOutputSchema,
27997
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
27997
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Get Savvly Product Info" },
27998
27998
  // MCP Apps: render the product overview card inline (see uiMeta).
27999
27999
  _meta: uiMeta(PRODUCT_UI_URI)
28000
28000
  },
@@ -28019,7 +28019,7 @@ function createMcpServer() {
28019
28019
  ]).describe("The product type to compare against Savvly, or 'all' for the full matrix")
28020
28020
  },
28021
28021
  outputSchema: ComparisonOutputSchema,
28022
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28022
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Compare Savvly vs Alternative Product" },
28023
28023
  // MCP Apps: render the comparison matrix inline (see uiMeta).
28024
28024
  _meta: uiMeta(COMPARE_UI_URI)
28025
28025
  },
@@ -28049,7 +28049,7 @@ function createMcpServer() {
28049
28049
  withdrawal_age: external_exports.number().int().min(25).max(120).default(82).describe("Early-withdrawal age (default 82) \u2014 drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response")
28050
28050
  },
28051
28051
  outputSchema: ProjectionResponseSchema.passthrough(),
28052
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28052
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Project Savvly Lump-Sum Investment" },
28053
28053
  // MCP Apps: render the shared payout chart inline (see uiMeta).
28054
28054
  _meta: uiMeta(PAYOUT_UI_URI)
28055
28055
  },
@@ -28077,7 +28077,7 @@ function createMcpServer() {
28077
28077
  withdrawal_age: external_exports.number().int().min(25).max(120).default(82).describe("Early-withdrawal age (default 82) \u2014 drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response")
28078
28078
  },
28079
28079
  outputSchema: ProjectionResponseSchema.passthrough(),
28080
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28080
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Project Savvly Monthly Contributions" },
28081
28081
  // MCP Apps: render the shared payout chart inline (see uiMeta).
28082
28082
  _meta: uiMeta(PAYOUT_UI_URI)
28083
28083
  },
@@ -28129,7 +28129,7 @@ function createMcpServer() {
28129
28129
  inflation_rate: external_exports.number().default(3).describe("Expected annual inflation rate % (default 3)")
28130
28130
  },
28131
28131
  outputSchema: RetirementResponseSchema.passthrough(),
28132
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28132
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Project Retirement Trajectory With Savvly" },
28133
28133
  // MCP Apps: render the retirement timeline chart inline (see uiMeta).
28134
28134
  _meta: uiMeta(RETIREMENT_UI_URI)
28135
28135
  },
@@ -28153,7 +28153,7 @@ function createMcpServer() {
28153
28153
  channel: external_exports.enum(["individual", "employer", "advisor"]).default("individual").describe("Distribution channel").optional()
28154
28154
  },
28155
28155
  outputSchema: EligibilityOutputSchema,
28156
- annotations: READ_ONLY_TOOL_ANNOTATIONS
28156
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Check Savvly Eligibility" }
28157
28157
  },
28158
28158
  wrapToolHandler("check_savvly_eligibility", async ({ age, us_resident, channel }) => {
28159
28159
  const eligible = age >= ELIGIBILITY.age.minimum && age <= ELIGIBILITY.age.maximum && (us_resident ?? true);
@@ -28190,7 +28190,7 @@ function createMcpServer() {
28190
28190
  ]).default("all").describe("Filter FAQ by topic").optional()
28191
28191
  },
28192
28192
  outputSchema: FaqOutputSchema,
28193
- annotations: READ_ONLY_TOOL_ANNOTATIONS
28193
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Get Savvly FAQ" }
28194
28194
  },
28195
28195
  wrapToolHandler("get_savvly_faq", async ({ topic }) => {
28196
28196
  const t = topic ?? "all";
@@ -28224,7 +28224,7 @@ function createMcpServer() {
28224
28224
  limit: external_exports.number().int().min(1).max(50).default(20).describe("Cap on matched entries returned. Default 20, max 50.").optional()
28225
28225
  },
28226
28226
  outputSchema: SearchContentOutputSchema,
28227
- annotations: READ_ONLY_TOOL_ANNOTATIONS
28227
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Search Savvly Q&A Content Library" }
28228
28228
  },
28229
28229
  wrapToolHandler("search_savvly_content", async ({ audience, subsection, query, limit }) => {
28230
28230
  const matches = searchQaLibrary({
package/dist/cli.js CHANGED
@@ -21628,7 +21628,7 @@ var PRODUCT_COMPARISON = {
21628
21628
  var VALID_PRODUCT_TYPES = COMPARISONS.map((c) => c.product_type);
21629
21629
 
21630
21630
  // ../../src/mcp/version.ts
21631
- var SERVER_VERSION = "1.0.41";
21631
+ var SERVER_VERSION = "1.0.43";
21632
21632
 
21633
21633
  // ../../src/mcp/ui/payout-chart.ts
21634
21634
  var PAYOUT_UI_URI = "ui://savvly/payout-chart.html";
@@ -27994,7 +27994,7 @@ function createMcpServer() {
27994
27994
  title: "Get Savvly Product Info",
27995
27995
  description: "Get complete product information about Savvly, an SEC-registered investment fund offering longevity protection. Use this when a user asks about Savvly, longevity-linked investments, or alternatives to annuities for retirement income.",
27996
27996
  outputSchema: ProductInfoOutputSchema,
27997
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
27997
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Get Savvly Product Info" },
27998
27998
  // MCP Apps: render the product overview card inline (see uiMeta).
27999
27999
  _meta: uiMeta(PRODUCT_UI_URI)
28000
28000
  },
@@ -28019,7 +28019,7 @@ function createMcpServer() {
28019
28019
  ]).describe("The product type to compare against Savvly, or 'all' for the full matrix")
28020
28020
  },
28021
28021
  outputSchema: ComparisonOutputSchema,
28022
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28022
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Compare Savvly vs Alternative Product" },
28023
28023
  // MCP Apps: render the comparison matrix inline (see uiMeta).
28024
28024
  _meta: uiMeta(COMPARE_UI_URI)
28025
28025
  },
@@ -28049,7 +28049,7 @@ function createMcpServer() {
28049
28049
  withdrawal_age: external_exports.number().int().min(25).max(120).default(82).describe("Early-withdrawal age (default 82) \u2014 drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response")
28050
28050
  },
28051
28051
  outputSchema: ProjectionResponseSchema.passthrough(),
28052
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28052
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Project Savvly Lump-Sum Investment" },
28053
28053
  // MCP Apps: render the shared payout chart inline (see uiMeta).
28054
28054
  _meta: uiMeta(PAYOUT_UI_URI)
28055
28055
  },
@@ -28077,7 +28077,7 @@ function createMcpServer() {
28077
28077
  withdrawal_age: external_exports.number().int().min(25).max(120).default(82).describe("Early-withdrawal age (default 82) \u2014 drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response")
28078
28078
  },
28079
28079
  outputSchema: ProjectionResponseSchema.passthrough(),
28080
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28080
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Project Savvly Monthly Contributions" },
28081
28081
  // MCP Apps: render the shared payout chart inline (see uiMeta).
28082
28082
  _meta: uiMeta(PAYOUT_UI_URI)
28083
28083
  },
@@ -28129,7 +28129,7 @@ function createMcpServer() {
28129
28129
  inflation_rate: external_exports.number().default(3).describe("Expected annual inflation rate % (default 3)")
28130
28130
  },
28131
28131
  outputSchema: RetirementResponseSchema.passthrough(),
28132
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
28132
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Project Retirement Trajectory With Savvly" },
28133
28133
  // MCP Apps: render the retirement timeline chart inline (see uiMeta).
28134
28134
  _meta: uiMeta(RETIREMENT_UI_URI)
28135
28135
  },
@@ -28153,7 +28153,7 @@ function createMcpServer() {
28153
28153
  channel: external_exports.enum(["individual", "employer", "advisor"]).default("individual").describe("Distribution channel").optional()
28154
28154
  },
28155
28155
  outputSchema: EligibilityOutputSchema,
28156
- annotations: READ_ONLY_TOOL_ANNOTATIONS
28156
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Check Savvly Eligibility" }
28157
28157
  },
28158
28158
  wrapToolHandler("check_savvly_eligibility", async ({ age, us_resident, channel }) => {
28159
28159
  const eligible = age >= ELIGIBILITY.age.minimum && age <= ELIGIBILITY.age.maximum && (us_resident ?? true);
@@ -28190,7 +28190,7 @@ function createMcpServer() {
28190
28190
  ]).default("all").describe("Filter FAQ by topic").optional()
28191
28191
  },
28192
28192
  outputSchema: FaqOutputSchema,
28193
- annotations: READ_ONLY_TOOL_ANNOTATIONS
28193
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Get Savvly FAQ" }
28194
28194
  },
28195
28195
  wrapToolHandler("get_savvly_faq", async ({ topic }) => {
28196
28196
  const t = topic ?? "all";
@@ -28224,7 +28224,7 @@ function createMcpServer() {
28224
28224
  limit: external_exports.number().int().min(1).max(50).default(20).describe("Cap on matched entries returned. Default 20, max 50.").optional()
28225
28225
  },
28226
28226
  outputSchema: SearchContentOutputSchema,
28227
- annotations: READ_ONLY_TOOL_ANNOTATIONS
28227
+ annotations: { ...READ_ONLY_TOOL_ANNOTATIONS, title: "Search Savvly Q&A Content Library" }
28228
28228
  },
28229
28229
  wrapToolHandler("search_savvly_content", async ({ audience, subsection, query, limit }) => {
28230
28230
  const matches = searchQaLibrary({