@nestpilot/mcp-app 1.0.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.
- package/README.md +350 -0
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.js +214 -0
- package/dist/cli/export-import.d.ts +6 -0
- package/dist/cli/export-import.js +132 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +168 -0
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.js +171 -0
- package/dist/host-configs/cowork.json +11 -0
- package/dist/host-configs/goose.yaml +22 -0
- package/dist/host-configs/openclaw-manifest.json +16 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +128 -0
- package/dist/mcp-app.html +155 -0
- package/dist/nestpilot-client.d.ts +44 -0
- package/dist/nestpilot-client.js +160 -0
- package/dist/planner.html +222 -0
- package/dist/server.d.ts +19 -0
- package/dist/server.js +245 -0
- package/dist/skills/SKILL.md +162 -0
- package/dist/skills/manifest.json +51 -0
- package/dist/skills/tools/activate_plan.md +36 -0
- package/dist/skills/tools/coach.md +59 -0
- package/dist/skills/tools/comprehensive_plan.md +65 -0
- package/dist/skills/tools/create_plan.md +59 -0
- package/dist/skills/tools/create_saved_plan.md +49 -0
- package/dist/skills/tools/delete_plan.md +42 -0
- package/dist/skills/tools/delete_scenario.md +38 -0
- package/dist/skills/tools/generate_proposal.md +63 -0
- package/dist/skills/tools/generate_retirement_report.md +50 -0
- package/dist/skills/tools/get_active_plan.md +44 -0
- package/dist/skills/tools/get_baseline_forecast.md +47 -0
- package/dist/skills/tools/get_plan.md +44 -0
- package/dist/skills/tools/get_plan_components.md +50 -0
- package/dist/skills/tools/get_scenario.md +46 -0
- package/dist/skills/tools/list_plans.md +44 -0
- package/dist/skills/tools/list_scenarios.md +42 -0
- package/dist/skills/tools/medicare-guardian.md +59 -0
- package/dist/skills/tools/nestpilot_run_plan.md +61 -0
- package/dist/skills/tools/optimize_roth_conversion.md +107 -0
- package/dist/skills/tools/optimize_ss_claiming.md +30 -0
- package/dist/skills/tools/rename_plan.md +34 -0
- package/dist/skills/tools/retirement-planner.md +55 -0
- package/dist/skills/tools/run_forecast.md +65 -0
- package/dist/skills/tools/run_saved_forecast.md +52 -0
- package/dist/skills/tools/run_scenario.md +66 -0
- package/dist/skills/tools/save_plan.md +48 -0
- package/dist/skills/tools/save_scenario.md +50 -0
- package/dist/skills/tools/verify_forecast.md +43 -0
- package/dist/src/config.d.ts +20 -0
- package/dist/src/config.js +44 -0
- package/dist/src/contracts/provenance.d.ts +37 -0
- package/dist/src/contracts/provenance.js +71 -0
- package/dist/src/contracts/tool-contract-registry.d.ts +43 -0
- package/dist/src/contracts/tool-contract-registry.js +282 -0
- package/dist/src/local/cloud-compute-client.d.ts +55 -0
- package/dist/src/local/cloud-compute-client.js +135 -0
- package/dist/src/local/encryption.d.ts +24 -0
- package/dist/src/local/encryption.js +105 -0
- package/dist/src/local/keychain.d.ts +41 -0
- package/dist/src/local/keychain.js +236 -0
- package/dist/src/local/local-config.d.ts +34 -0
- package/dist/src/local/local-config.js +61 -0
- package/dist/src/local/local-data-layer.d.ts +20 -0
- package/dist/src/local/local-data-layer.js +15 -0
- package/dist/src/local/local-plan-store.d.ts +66 -0
- package/dist/src/local/local-plan-store.js +195 -0
- package/dist/src/local/pii-scrubber.d.ts +26 -0
- package/dist/src/local/pii-scrubber.js +219 -0
- package/dist/src/policy/policy-engine.d.ts +44 -0
- package/dist/src/policy/policy-engine.js +119 -0
- package/dist/src/rate-limit.d.ts +17 -0
- package/dist/src/rate-limit.js +41 -0
- package/dist/src/security.d.ts +19 -0
- package/dist/src/security.js +118 -0
- package/dist/src/skills/index.d.ts +12 -0
- package/dist/src/skills/index.js +16 -0
- package/dist/src/skills/retirement-pack-v1.d.ts +28 -0
- package/dist/src/skills/retirement-pack-v1.js +295 -0
- package/dist/src/skills/skill-executor.d.ts +65 -0
- package/dist/src/skills/skill-executor.js +174 -0
- package/dist/src/skills/skill-manifest-schema.d.ts +337 -0
- package/dist/src/skills/skill-manifest-schema.js +94 -0
- package/dist/src/skills/skill-registry.d.ts +71 -0
- package/dist/src/skills/skill-registry.js +116 -0
- package/dist/src/telemetry.d.ts +12 -0
- package/dist/src/telemetry.js +59 -0
- package/dist/src/types.d.ts +46 -0
- package/dist/src/types.js +4 -0
- package/dist/tools/agent-tools.d.ts +12 -0
- package/dist/tools/agent-tools.js +141 -0
- package/dist/tools/forecast-management-tools.d.ts +9 -0
- package/dist/tools/forecast-management-tools.js +133 -0
- package/dist/tools/local-plan-tools.d.ts +8 -0
- package/dist/tools/local-plan-tools.js +357 -0
- package/dist/tools/mcp-helpers.d.ts +52 -0
- package/dist/tools/mcp-helpers.js +177 -0
- package/dist/tools/medicare-tools.d.ts +3 -0
- package/dist/tools/medicare-tools.js +162 -0
- package/dist/tools/optimize-roth-tools-test.d.ts +2 -0
- package/dist/tools/optimize-roth-tools-test.js +36 -0
- package/dist/tools/optimize-roth-tools.d.ts +3 -0
- package/dist/tools/optimize-roth-tools.js +818 -0
- package/dist/tools/plan-management-tools.d.ts +3 -0
- package/dist/tools/plan-management-tools.js +196 -0
- package/dist/tools/planning-tools.d.ts +3 -0
- package/dist/tools/planning-tools.js +290 -0
- package/dist/tools/proposal-tools.d.ts +3 -0
- package/dist/tools/proposal-tools.js +428 -0
- package/dist/tools/report-tools.d.ts +3 -0
- package/dist/tools/report-tools.js +245 -0
- package/dist/tools/scenario-management-tools.d.ts +3 -0
- package/dist/tools/scenario-management-tools.js +136 -0
- package/dist/views/verification-packet.html +211 -0
- package/host-configs/cowork.json +11 -0
- package/host-configs/goose.yaml +22 -0
- package/host-configs/openclaw-manifest.json +16 -0
- package/package.json +66 -0
- package/skills/SKILL.md +162 -0
- package/skills/manifest.json +51 -0
- package/skills/tools/activate_plan.md +36 -0
- package/skills/tools/coach.md +59 -0
- package/skills/tools/comprehensive_plan.md +65 -0
- package/skills/tools/create_plan.md +59 -0
- package/skills/tools/create_saved_plan.md +49 -0
- package/skills/tools/delete_plan.md +42 -0
- package/skills/tools/delete_scenario.md +38 -0
- package/skills/tools/generate_proposal.md +63 -0
- package/skills/tools/generate_retirement_report.md +50 -0
- package/skills/tools/get_active_plan.md +44 -0
- package/skills/tools/get_baseline_forecast.md +47 -0
- package/skills/tools/get_plan.md +44 -0
- package/skills/tools/get_plan_components.md +50 -0
- package/skills/tools/get_scenario.md +46 -0
- package/skills/tools/list_plans.md +44 -0
- package/skills/tools/list_scenarios.md +42 -0
- package/skills/tools/medicare-guardian.md +59 -0
- package/skills/tools/nestpilot_run_plan.md +61 -0
- package/skills/tools/optimize_roth_conversion.md +107 -0
- package/skills/tools/optimize_ss_claiming.md +30 -0
- package/skills/tools/rename_plan.md +34 -0
- package/skills/tools/retirement-planner.md +55 -0
- package/skills/tools/run_forecast.md +65 -0
- package/skills/tools/run_saved_forecast.md +52 -0
- package/skills/tools/run_scenario.md +66 -0
- package/skills/tools/save_plan.md +48 -0
- package/skills/tools/save_scenario.md +50 -0
- package/skills/tools/verify_forecast.md +43 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Tool Skill: optimize_roth_conversion
|
|
2
|
+
|
|
3
|
+
Optimizes Roth conversion strategies for retirement accounts. Analyzes tax brackets, required
|
|
4
|
+
minimum distributions (RMDs), and projected income to recommend a multi-year Roth conversion
|
|
5
|
+
ladder that minimizes lifetime tax burden.
|
|
6
|
+
|
|
7
|
+
## When to Suggest Roth Conversions
|
|
8
|
+
|
|
9
|
+
Use `optimize_roth_conversion` when the user:
|
|
10
|
+
- Is in a low-income year (between jobs, early retirement, before Social Security starts)
|
|
11
|
+
- Has a pre-RMD window (ages 60-72) where conversions can reduce future forced distributions
|
|
12
|
+
- Has a bracket gap: current income is below their expected retirement tax bracket
|
|
13
|
+
- Asks "How much should I convert to Roth each year?"
|
|
14
|
+
- Wants to minimize lifetime taxes through strategic conversions
|
|
15
|
+
- Asks about filling tax brackets or building a Roth conversion ladder
|
|
16
|
+
|
|
17
|
+
Do NOT use for general tax questions — use `coach` instead.
|
|
18
|
+
Do NOT use for basic forecasting — use `run_forecast` instead.
|
|
19
|
+
|
|
20
|
+
## Questions to Ask the User
|
|
21
|
+
|
|
22
|
+
Before calling the tool, gather these inputs:
|
|
23
|
+
|
|
24
|
+
### Required
|
|
25
|
+
- **Filing status**: SINGLE, MFJ (Married Filing Jointly), MFS (Married Filing Separately), HOH (Head of Household)
|
|
26
|
+
- **Current age** and **target retirement age**
|
|
27
|
+
- **Traditional IRA / 401k balance** (total pre-tax retirement account balance)
|
|
28
|
+
- **Annual income** (current gross income from employment)
|
|
29
|
+
|
|
30
|
+
### Optional but Valuable
|
|
31
|
+
- **Other income sources** (pensions, rental income, part-time work)
|
|
32
|
+
- **Expected Social Security benefit** (annual amount)
|
|
33
|
+
- **Roth IRA balance** (existing Roth assets)
|
|
34
|
+
- **Conversion policy preference**: conservative (fill 12% bracket), moderate (fill 22%), aggressive (fill 24%)
|
|
35
|
+
|
|
36
|
+
If the user doesn't specify a conversion policy, default to "moderate" (fill up to the 22% bracket).
|
|
37
|
+
|
|
38
|
+
## Presenting Results
|
|
39
|
+
|
|
40
|
+
Structure the response in four parts:
|
|
41
|
+
|
|
42
|
+
### 1. Lead with Savings
|
|
43
|
+
"Based on your tax situation, converting $X over Y years could save approximately $Z in
|
|
44
|
+
lifetime taxes compared to doing nothing."
|
|
45
|
+
|
|
46
|
+
### 2. Conversion Schedule
|
|
47
|
+
Present the year-by-year schedule as a table or summary:
|
|
48
|
+
- Year, age, conversion amount, tax cost, bracket filled
|
|
49
|
+
- Highlight the best conversion years (lowest income, most headroom)
|
|
50
|
+
|
|
51
|
+
### 3. Trade-offs
|
|
52
|
+
- **Upfront tax cost**: Total taxes paid on conversions
|
|
53
|
+
- **Break-even age**: When the tax-free Roth growth exceeds the upfront cost
|
|
54
|
+
- **RMD reduction**: How much lower Required Minimum Distributions will be at age 73+
|
|
55
|
+
|
|
56
|
+
### 4. Key Considerations
|
|
57
|
+
- IRMAA warnings (if any conversions push income near Medicare surcharge thresholds)
|
|
58
|
+
- State tax implications note
|
|
59
|
+
- Any caveats about the specific situation
|
|
60
|
+
|
|
61
|
+
## Safety Gates
|
|
62
|
+
|
|
63
|
+
### IRMAA Cliff Warning
|
|
64
|
+
When income with conversion approaches $103,000 (single) or $206,000 (MFJ), warn:
|
|
65
|
+
"Converting this amount may trigger Medicare IRMAA surcharges that add $X/month to your
|
|
66
|
+
Part B and Part D premiums. Consider converting less to stay below the threshold."
|
|
67
|
+
|
|
68
|
+
### ACA Subsidy Impact
|
|
69
|
+
If the user is pre-65 and on ACA marketplace insurance, note that conversions increase MAGI
|
|
70
|
+
and may reduce premium subsidies. Suggest coordinating with their insurance situation.
|
|
71
|
+
|
|
72
|
+
### State Tax Considerations
|
|
73
|
+
Always note: "This analysis uses federal tax brackets only. Your state may tax Roth conversions
|
|
74
|
+
differently. Some states (like Pennsylvania) do not tax Roth conversions."
|
|
75
|
+
|
|
76
|
+
## Required Disclaimers
|
|
77
|
+
|
|
78
|
+
ALWAYS include in every response:
|
|
79
|
+
- "This analysis is for educational purposes only and does not constitute tax advice."
|
|
80
|
+
- "Consult a qualified tax professional before making Roth conversion decisions."
|
|
81
|
+
- "Tax brackets and IRMAA thresholds are based on 2025 values and may change."
|
|
82
|
+
|
|
83
|
+
## Evidence Packet
|
|
84
|
+
|
|
85
|
+
The tool returns a full evidence packet containing:
|
|
86
|
+
- All input assumptions used in the calculation
|
|
87
|
+
- Step-by-step calculation methodology
|
|
88
|
+
- Tax bracket headroom analysis
|
|
89
|
+
- IRMAA threshold proximity for each conversion year
|
|
90
|
+
- Disclaimers and caveats
|
|
91
|
+
|
|
92
|
+
Present the evidence packet transparently when the user asks "show me the math" or
|
|
93
|
+
"what assumptions did you use?"
|
|
94
|
+
|
|
95
|
+
## Common Follow-Up Patterns
|
|
96
|
+
|
|
97
|
+
After presenting Roth conversion results, offer:
|
|
98
|
+
- "Want to see how this conversion strategy affects your overall retirement forecast?" → `run_forecast`
|
|
99
|
+
- "Want to compare this with a different conversion policy (conservative vs. aggressive)?" → re-run with different `conversionPolicy`
|
|
100
|
+
- "Want to coordinate this with your Social Security claiming strategy?" → `optimize_ss_claiming`
|
|
101
|
+
- "Want to explore a what-if scenario with these conversions?" → `run_scenario`
|
|
102
|
+
|
|
103
|
+
## Error Handling
|
|
104
|
+
|
|
105
|
+
Same as `run_forecast`. Validation errors should prompt clarification of the specific field.
|
|
106
|
+
If the backend tax API returns an error, explain what went wrong and ask the user to verify
|
|
107
|
+
their inputs (especially filing status and income figures).
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Tool Skill: optimize_ss_claiming
|
|
2
|
+
|
|
3
|
+
Optimizes Social Security claiming strategy. Analyzes benefit amounts across different claiming
|
|
4
|
+
ages (62–70) factoring in longevity estimates, spousal benefits, survivor benefits, and the
|
|
5
|
+
interaction with other retirement income sources.
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use `optimize_ss_claiming` when the user wants to:
|
|
10
|
+
- Determine the optimal age to start claiming Social Security
|
|
11
|
+
- Compare the cumulative benefit of early vs delayed claiming
|
|
12
|
+
- Factor in spousal or survivor benefit strategies
|
|
13
|
+
- Understand the breakeven age for delayed claiming
|
|
14
|
+
|
|
15
|
+
## Core Purpose: Maximizing Lifetime Social Security Benefits
|
|
16
|
+
|
|
17
|
+
This tool runs a breakeven analysis comparing claiming at different ages, adjusting for the
|
|
18
|
+
user's health, life expectancy, other income sources, and tax situation. It considers the 8%
|
|
19
|
+
per year delayed retirement credits and any applicable spousal benefit strategies.
|
|
20
|
+
|
|
21
|
+
## Presenting Results
|
|
22
|
+
|
|
23
|
+
Structure the response in three parts:
|
|
24
|
+
1. **Recommended claiming age**: The optimal age based on the user's specific situation.
|
|
25
|
+
2. **Comparison table**: Monthly and cumulative benefits at ages 62, 67, and 70.
|
|
26
|
+
3. **Key factors**: Breakeven age, spousal considerations, and tax implications.
|
|
27
|
+
|
|
28
|
+
## Error Handling
|
|
29
|
+
|
|
30
|
+
Same as `run_forecast`. Validation errors should prompt clarification of the specific field.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Tool Skill: rename_plan
|
|
2
|
+
|
|
3
|
+
Renames an existing saved plan. Updates the display name without changing any plan data,
|
|
4
|
+
components, or associated forecasts.
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
Use `rename_plan` when the user:
|
|
9
|
+
- Says "Rename my plan to [new name]" or "Call this plan [new name]"
|
|
10
|
+
- Wants to organize plans with more descriptive labels
|
|
11
|
+
- Has a generic name like "Untitled Plan" they want to improve
|
|
12
|
+
|
|
13
|
+
Use `save_plan` instead if the user wants to change plan data, not just the name.
|
|
14
|
+
|
|
15
|
+
## Required Inputs to Gather
|
|
16
|
+
|
|
17
|
+
- `planId` (string, required) — UUID of the plan to rename
|
|
18
|
+
- `name` (string, required) — the new name for the plan
|
|
19
|
+
|
|
20
|
+
If the user refers to the plan by its current name, resolve the ID via `list_plans`.
|
|
21
|
+
|
|
22
|
+
## Presenting the Results
|
|
23
|
+
|
|
24
|
+
Structure the response:
|
|
25
|
+
|
|
26
|
+
1. **Confirmation**: "Done — your plan has been renamed from '[old name]' to '[new name]'."
|
|
27
|
+
|
|
28
|
+
2. **No Other Changes**: "All plan data, forecasts, and scenarios are unchanged."
|
|
29
|
+
|
|
30
|
+
## Common Follow-Up Patterns
|
|
31
|
+
|
|
32
|
+
- User wants to review the plan → `get_plan`
|
|
33
|
+
- User wants to rename another plan → `list_plans` then `rename_plan`
|
|
34
|
+
- User wants to make other changes → `save_plan`
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Tool Skill: retirement-planner
|
|
2
|
+
|
|
3
|
+
Opens the interactive Retirement Planner — a full visual planning application with plan
|
|
4
|
+
creation form, forecast charts, and scenario comparison view.
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
Use `retirement-planner` when the user:
|
|
9
|
+
- Wants a visual, interactive retirement planning experience
|
|
10
|
+
- Says "show me my retirement plan", "open the planner", or "I want to see charts"
|
|
11
|
+
- Wants to create or edit a retirement plan through a form UI
|
|
12
|
+
- Wants to see their forecast visualized as charts
|
|
13
|
+
- Wants to compare scenarios side-by-side visually
|
|
14
|
+
- Has just run `create_plan` or `run_forecast` and wants to explore further
|
|
15
|
+
|
|
16
|
+
## View Modes
|
|
17
|
+
|
|
18
|
+
Select the mode based on the user's intent:
|
|
19
|
+
|
|
20
|
+
- `editor` (default) — Input form for quick plan creation. Use when the user wants to
|
|
21
|
+
enter or modify their retirement inputs interactively.
|
|
22
|
+
|
|
23
|
+
- `forecast` — Displays forecast charts for an existing plan. Use after `run_forecast`
|
|
24
|
+
has been called, especially when the user wants to see year-by-year projections visually.
|
|
25
|
+
|
|
26
|
+
- `scenario` — Shows baseline vs. candidate scenario comparison. Use after `run_scenario`
|
|
27
|
+
when the user wants a visual side-by-side comparison.
|
|
28
|
+
|
|
29
|
+
## Sequence Patterns
|
|
30
|
+
|
|
31
|
+
**Starting fresh**: Open in `editor` mode. The user fills out inputs, then the planner
|
|
32
|
+
runs its own forecast internally.
|
|
33
|
+
|
|
34
|
+
**After create_plan**: Open in `editor` mode if the user wants to refine inputs, or in
|
|
35
|
+
`forecast` mode to see a richer visual of what `create_plan` returned.
|
|
36
|
+
|
|
37
|
+
**After run_forecast**: Open in `forecast` mode to show the year-by-year chart of the
|
|
38
|
+
detailed forecast results.
|
|
39
|
+
|
|
40
|
+
**After run_scenario**: Open in `scenario` mode to show the baseline vs. candidate
|
|
41
|
+
comparison visually.
|
|
42
|
+
|
|
43
|
+
## Integration with Tool Results
|
|
44
|
+
|
|
45
|
+
The planner view is standalone — it does not automatically receive results from prior
|
|
46
|
+
`create_plan` or `run_forecast` calls. If a `planId` was returned by a prior tool call,
|
|
47
|
+
mention it to the user so they can load it inside the planner.
|
|
48
|
+
|
|
49
|
+
## Presenting the Tool Result
|
|
50
|
+
|
|
51
|
+
The tool returns a confirmation message; the actual UI renders in the host application.
|
|
52
|
+
Follow the launch with:
|
|
53
|
+
- "The retirement planner is now open. You can [describe the current mode action]."
|
|
54
|
+
- If in `forecast` mode: "The chart shows your projected portfolio balance year by year."
|
|
55
|
+
- If in `scenario` mode: "You can compare your baseline plan against the scenario on the left."
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Tool Skill: run_forecast
|
|
2
|
+
|
|
3
|
+
Runs a comprehensive deterministic retirement forecast with multi-account, multi-income-stream
|
|
4
|
+
support. Returns readiness score, yearly projections, portfolio runway, legacy value, and
|
|
5
|
+
success probability.
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use `run_forecast` when the user:
|
|
10
|
+
- Has detailed financial data: multiple accounts (401k, IRA, Roth, taxable), income streams
|
|
11
|
+
- Wants year-by-year projections through retirement
|
|
12
|
+
- Asks about portfolio runway or "When will I run out of money?"
|
|
13
|
+
- Wants to consider tax optimization, withdrawal ordering, or Roth conversions
|
|
14
|
+
- Has a spouse and needs household-level analysis
|
|
15
|
+
- Wants to understand legacy value (assets remaining at life expectancy)
|
|
16
|
+
|
|
17
|
+
Use `create_plan` instead for quick projections when detailed account data is not available.
|
|
18
|
+
|
|
19
|
+
## Gathering Inputs
|
|
20
|
+
|
|
21
|
+
The `run_forecast` tool takes a full `PlanInputExtended` payload. Gather minimum required fields:
|
|
22
|
+
|
|
23
|
+
**Required:**
|
|
24
|
+
- `currentAge` — integer >= 18
|
|
25
|
+
- `retirementAge` — integer >= 50
|
|
26
|
+
- `targetMonthlySpending` — desired monthly spending in retirement
|
|
27
|
+
- `accounts` — at least one account: `{type, balance, annualContribution?, realReturn?}`
|
|
28
|
+
- Types: `TRADITIONAL`, `ROTH`, `TAXABLE`, `CASH`
|
|
29
|
+
- `incomeStreams` — at least one stream: `{type, amountMonthly, startAge?, endAge?}`
|
|
30
|
+
- Types: `SALARY`, `SOCIAL_SECURITY`, `PENSION`, `ANNUITY`, `RENTAL`, `OTHER`
|
|
31
|
+
|
|
32
|
+
**Optional but valuable:**
|
|
33
|
+
- `socialSecurityClaimAge` — claiming age affects monthly benefit amount
|
|
34
|
+
- `safeWithdrawalRate` — default 0.04 (4% rule)
|
|
35
|
+
- `effectiveTaxRate` — default 0.15; use marginal for accuracy
|
|
36
|
+
- `withdrawalStrategy` — `"taxable_first"` or `"traditional_first"`
|
|
37
|
+
- `horizonAge` — planning horizon (default 95)
|
|
38
|
+
- `spouse` — partner data for household analysis
|
|
39
|
+
|
|
40
|
+
## Presenting the Results
|
|
41
|
+
|
|
42
|
+
Structure the response:
|
|
43
|
+
|
|
44
|
+
1. **Headline**: "Your retirement forecast shows a [readiness score]/100 readiness score,
|
|
45
|
+
with your portfolio covering [yearsCovered] years."
|
|
46
|
+
|
|
47
|
+
2. **Key Metrics**:
|
|
48
|
+
- Readiness score: X/100
|
|
49
|
+
- Portfolio runway: X years
|
|
50
|
+
- Legacy value at [horizonAge]: $X
|
|
51
|
+
- Success probability: X%
|
|
52
|
+
|
|
53
|
+
3. **Year-by-Year Narrative**: "Your portfolio peaks at retirement in [year] at $X. Starting
|
|
54
|
+
from age [retirementAge], withdrawals of $X/month cover your target spending through [age]."
|
|
55
|
+
|
|
56
|
+
4. **Key Assumptions**: Withdrawal rate, tax rate, return assumptions, Social Security claim age.
|
|
57
|
+
|
|
58
|
+
5. **Next Step**: Offer a scenario or planner view:
|
|
59
|
+
"Want to see how delaying Social Security to 70 changes these numbers?"
|
|
60
|
+
|
|
61
|
+
## Common Follow-Up Patterns
|
|
62
|
+
|
|
63
|
+
- User wants to explore changes → `run_scenario`
|
|
64
|
+
- User wants visual charts → `retirement-planner` in `forecast` mode with `planId` if saved
|
|
65
|
+
- User wants to stress-test against a market crash → `run_scenario` with `stressTest`
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Tool Skill: run_saved_forecast
|
|
2
|
+
|
|
3
|
+
Triggers a retirement forecast on a saved plan. Unlike `run_forecast` (which takes an inline
|
|
4
|
+
PlanContract), this tool references a persisted plan by ID and stores the forecast results
|
|
5
|
+
server-side for later retrieval.
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use `run_saved_forecast` when the user:
|
|
10
|
+
- Has a saved plan and says "Run a forecast" or "How does my plan look?"
|
|
11
|
+
- Wants to update projections after making changes to a saved plan
|
|
12
|
+
- Needs baseline results to compare against a scenario
|
|
13
|
+
- Asks for year-by-year projections on their active or named plan
|
|
14
|
+
|
|
15
|
+
Use `run_forecast` instead for ad-hoc projections with inline plan data that isn't saved.
|
|
16
|
+
Use `run_scenario` when the user wants to compare baseline vs. modified assumptions.
|
|
17
|
+
|
|
18
|
+
## Required Inputs to Gather
|
|
19
|
+
|
|
20
|
+
- `planId` (string, required) — UUID of the saved plan
|
|
21
|
+
- `runType` (string, required) — one of:
|
|
22
|
+
- `"baseline"` — standard projection with current plan assumptions
|
|
23
|
+
- `"scenario"` — projection using a saved scenario's overrides
|
|
24
|
+
- `scenarioId` (string, optional) — required when `runType` is `"scenario"`;
|
|
25
|
+
the UUID of the saved scenario to apply
|
|
26
|
+
|
|
27
|
+
If the user doesn't specify a plan, resolve via `get_active_plan`.
|
|
28
|
+
|
|
29
|
+
## Presenting the Results
|
|
30
|
+
|
|
31
|
+
Structure the response:
|
|
32
|
+
|
|
33
|
+
1. **Headline**: "Forecast complete for '[plan name]' ([runType] run)."
|
|
34
|
+
|
|
35
|
+
2. **Key Metrics**:
|
|
36
|
+
- Readiness score: X/100
|
|
37
|
+
- Portfolio runway: X years (covers spending through age X)
|
|
38
|
+
- Legacy value at [horizon age]: $X
|
|
39
|
+
- Success probability: X%
|
|
40
|
+
|
|
41
|
+
3. **Year-by-Year Narrative**: Summarize the trajectory — peak balance, drawdown start,
|
|
42
|
+
and critical inflection points.
|
|
43
|
+
|
|
44
|
+
4. **Next Step**: "Want to explore a what-if scenario, or see how a different claiming
|
|
45
|
+
age affects these numbers?"
|
|
46
|
+
|
|
47
|
+
## Common Follow-Up Patterns
|
|
48
|
+
|
|
49
|
+
- User wants to explore changes → `save_scenario` then `run_saved_forecast` with `runType: "scenario"`
|
|
50
|
+
- User wants the baseline data later → `get_baseline_forecast`
|
|
51
|
+
- User wants visual charts → `retirement-planner` with the `planId`
|
|
52
|
+
- User wants a stress test → `run_scenario` with `stressTest`
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Tool Skill: run_scenario
|
|
2
|
+
|
|
3
|
+
Runs a what-if scenario analysis comparing a baseline retirement plan against modified
|
|
4
|
+
assumptions. Returns baseline vs. candidate comparison with delta metrics.
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
Use `run_scenario` when the user:
|
|
9
|
+
- Asks "What if I retire at 62 instead of 65?"
|
|
10
|
+
- Wants to compare two versions of their plan
|
|
11
|
+
- Asks about enabling/disabling income streams (annuity, rental income)
|
|
12
|
+
- Wants to stress-test against historical market crashes (2008, dot-com, 1929)
|
|
13
|
+
- Says "How would my plan hold up in a recession?"
|
|
14
|
+
- Wants to see the impact of delaying Social Security
|
|
15
|
+
- Wants to understand the trade-off between saving more vs. retiring earlier
|
|
16
|
+
|
|
17
|
+
## Framing Scenarios
|
|
18
|
+
|
|
19
|
+
Always present scenarios as exploration, not recommendation:
|
|
20
|
+
- "If X, then Y" — not "you should do X"
|
|
21
|
+
- Lead with the delta: "Retiring at 62 reduces your readiness score by 8 points and
|
|
22
|
+
cuts legacy value by $180,000."
|
|
23
|
+
- Explain the driver: "The 3 extra withdrawal years are the primary factor."
|
|
24
|
+
|
|
25
|
+
## Input Structure
|
|
26
|
+
|
|
27
|
+
`run_scenario` requires:
|
|
28
|
+
- `plan` — baseline PlanContract object (the current plan)
|
|
29
|
+
- `overrides` (optional) — bundle of changes:
|
|
30
|
+
- `planDeltas` — field-level changes: `[{path: "household.primary.retireAge", to: 62}]`
|
|
31
|
+
- `componentOverrides` — enable/disable plan components by UUID
|
|
32
|
+
- `stressTest` — historical market scenario: `{scenarioId: "2008_CRISIS", applyTo: "EQUITY"}`
|
|
33
|
+
|
|
34
|
+
Common `planDeltas` examples:
|
|
35
|
+
- Retire 3 years earlier: `{path: "household.primary.retireAge", to: retireAge - 3}`
|
|
36
|
+
- Increase target spending: `{path: "goals.retirement.targetSpending.amountMonthly", to: newAmount}`
|
|
37
|
+
- Delay Social Security: `{path: "household.primary.socialSecurity.claimAge", to: 70}`
|
|
38
|
+
|
|
39
|
+
Common `stressTest.scenarioId` values:
|
|
40
|
+
- `"2008_CRISIS"` — 2008 financial crisis
|
|
41
|
+
- `"DOT_COM_BUST"` — 2000-2002 dot-com crash
|
|
42
|
+
- `"1929_CRASH"` — Great Depression
|
|
43
|
+
|
|
44
|
+
## Presenting the Results
|
|
45
|
+
|
|
46
|
+
Structure the comparison:
|
|
47
|
+
|
|
48
|
+
1. **Scenario Label**: "Scenario: [label, e.g., 'Retire at 62']"
|
|
49
|
+
|
|
50
|
+
2. **Delta Summary**:
|
|
51
|
+
- Readiness score: [baseline] → [candidate] (Δ [+/-X])
|
|
52
|
+
- Legacy value: $[baseline] → $[candidate] (Δ [+/-$X])
|
|
53
|
+
- Portfolio runway: [baseline] years → [candidate] years
|
|
54
|
+
|
|
55
|
+
3. **Key Driver**: Explain the 1-2 factors that most changed the outcome.
|
|
56
|
+
|
|
57
|
+
4. **Trade-Off Frame**: "The trade-off is [X years of retirement] vs. [Y reduction in
|
|
58
|
+
portfolio longevity]. At your spending target of $Z/month, that math looks like..."
|
|
59
|
+
|
|
60
|
+
5. **Next Step**: Offer to run another scenario or open the planner comparison view.
|
|
61
|
+
|
|
62
|
+
## Error Handling
|
|
63
|
+
|
|
64
|
+
If the plan object is incomplete, ask for the missing required fields before calling.
|
|
65
|
+
A minimal plan requires household ages, at least one account, at least one income stream,
|
|
66
|
+
and a target monthly spending goal.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Tool Skill: save_plan
|
|
2
|
+
|
|
3
|
+
Updates an existing saved plan with new or modified data. Performs a partial or full update
|
|
4
|
+
of the PlanContract and persists the changes.
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
Use `save_plan` when the user:
|
|
9
|
+
- Wants to update their retirement age, spending target, or other assumptions
|
|
10
|
+
- Adds or removes accounts or income streams from an existing plan
|
|
11
|
+
- Says "Change my retirement age to 62" or "Add a Roth IRA with $50k"
|
|
12
|
+
- Corrects a mistake in their plan data
|
|
13
|
+
- Wants to save changes after discussing adjustments
|
|
14
|
+
|
|
15
|
+
Do NOT use this to create a brand-new plan — use `create_saved_plan` for that.
|
|
16
|
+
|
|
17
|
+
## Required Inputs to Gather
|
|
18
|
+
|
|
19
|
+
- `planId` (string, required) — UUID of the plan to update
|
|
20
|
+
|
|
21
|
+
Plus any fields to update within the PlanContract:
|
|
22
|
+
- `household` — age, retirement age, life expectancy, spouse changes
|
|
23
|
+
- `accounts` — add, update, or remove accounts
|
|
24
|
+
- `incomeStreams` — add, update, or remove income streams
|
|
25
|
+
- `goals` — target spending, withdrawal strategy, safe withdrawal rate
|
|
26
|
+
- `name` — to rename (though `rename_plan` is the dedicated tool for that)
|
|
27
|
+
|
|
28
|
+
Fetch the current plan with `get_plan` first if you need to merge changes.
|
|
29
|
+
|
|
30
|
+
## Presenting the Results
|
|
31
|
+
|
|
32
|
+
Structure the response:
|
|
33
|
+
|
|
34
|
+
1. **Confirmation**: "I've updated your '[name]' plan."
|
|
35
|
+
|
|
36
|
+
2. **Changes Applied**: Bullet list of what changed:
|
|
37
|
+
- "Retirement age: 65 -> 62"
|
|
38
|
+
- "Added Roth IRA account ($50,000)"
|
|
39
|
+
|
|
40
|
+
3. **Impact Hint**: "These changes may affect your forecast. Want me to run a fresh
|
|
41
|
+
projection to see how this looks?"
|
|
42
|
+
|
|
43
|
+
## Common Follow-Up Patterns
|
|
44
|
+
|
|
45
|
+
- User wants to see the impact → `run_saved_forecast`
|
|
46
|
+
- User wants to compare before/after → `run_scenario` with deltas
|
|
47
|
+
- User wants to undo → `save_plan` reverting to previous values (fetch via `get_plan`)
|
|
48
|
+
- User wants to rename → `rename_plan`
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Tool Skill: save_scenario
|
|
2
|
+
|
|
3
|
+
Persists a what-if scenario so it can be re-run, compared, or shared. A scenario captures
|
|
4
|
+
a set of modifications (deltas, overrides, stress tests) that can be applied against a
|
|
5
|
+
baseline plan to produce an alternative forecast.
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use `save_scenario` when the user:
|
|
10
|
+
- Wants to save a what-if for later: "Save this as my early-retirement scenario"
|
|
11
|
+
- Has explored a scenario via `run_scenario` and wants to keep it
|
|
12
|
+
- Wants to build a library of scenarios to compare (e.g., "conservative" vs. "aggressive")
|
|
13
|
+
- Says "Remember these changes" or "I want to come back to this"
|
|
14
|
+
|
|
15
|
+
Use `run_scenario` for one-off exploration that doesn't need to persist.
|
|
16
|
+
|
|
17
|
+
## Required Inputs to Gather
|
|
18
|
+
|
|
19
|
+
- `label` (string, required) — descriptive name (e.g., "Retire at 60", "No Pension")
|
|
20
|
+
|
|
21
|
+
**Optional inputs (at least one recommended):**
|
|
22
|
+
- `deltas` — array of field-level changes:
|
|
23
|
+
`[{path: "household.primary.retireAge", to: 60}]`
|
|
24
|
+
- `overrides` — component-level toggles:
|
|
25
|
+
`{componentId: "uuid", enabled: false}` to disable an income stream
|
|
26
|
+
- `bundle` — a named preset group of changes (e.g., `"aggressive_growth"`)
|
|
27
|
+
- `planId` — UUID of the plan this scenario is associated with; if omitted, the scenario
|
|
28
|
+
is standalone and can be applied to any plan
|
|
29
|
+
|
|
30
|
+
## Presenting the Results
|
|
31
|
+
|
|
32
|
+
Structure the response:
|
|
33
|
+
|
|
34
|
+
1. **Confirmation**: "Saved scenario '[label]' (ID: [scenarioId])."
|
|
35
|
+
|
|
36
|
+
2. **What It Contains**:
|
|
37
|
+
- Deltas: list each change in human-readable form
|
|
38
|
+
- Overrides: list toggled components
|
|
39
|
+
- Stress test: name of historical scenario if included
|
|
40
|
+
|
|
41
|
+
3. **Association**: "This scenario is [linked to plan '[name]' / standalone]."
|
|
42
|
+
|
|
43
|
+
4. **Next Step**: "Want me to run a forecast using this scenario, or create another one?"
|
|
44
|
+
|
|
45
|
+
## Common Follow-Up Patterns
|
|
46
|
+
|
|
47
|
+
- User wants to see the impact → `run_saved_forecast` with `runType: "scenario"` and `scenarioId`
|
|
48
|
+
- User wants to list all scenarios → `list_scenarios`
|
|
49
|
+
- User wants to modify the scenario → `save_scenario` with updated fields (or delete and recreate)
|
|
50
|
+
- User wants to compare multiple scenarios → run forecasts for each and compare
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Tool Skill: verify_forecast
|
|
2
|
+
|
|
3
|
+
Runs a retirement forecast and returns a verification packet — a structured, auditable record
|
|
4
|
+
of the inputs, calculation trace, and verdict. Used to verify advisor projections or double-check
|
|
5
|
+
personal planning scenarios.
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use `verify_forecast` when the user wants to:
|
|
10
|
+
- Verify numbers from their financial advisor
|
|
11
|
+
- Create an auditable record of their retirement projection
|
|
12
|
+
- Get a "second opinion" on a specific set of assumptions
|
|
13
|
+
|
|
14
|
+
## Core Purpose: Independent Verification
|
|
15
|
+
|
|
16
|
+
This is NestPilot's signature capability. The verification packet is the user's proof that
|
|
17
|
+
the math was run independently, with explicit assumptions, and the results are reproducible.
|
|
18
|
+
|
|
19
|
+
ALWAYS frame verification as: "Let's verify these numbers independently."
|
|
20
|
+
NEVER suggest the advisor was wrong — present the verification as a confirmation or a
|
|
21
|
+
starting point for a conversation with the advisor.
|
|
22
|
+
|
|
23
|
+
## Presenting the Verification Packet
|
|
24
|
+
|
|
25
|
+
Structure the response in three parts:
|
|
26
|
+
1. **Assumptions verified**: List the key inputs (return rate, withdrawal rate, balance,
|
|
27
|
+
timeline) that were used in the calculation.
|
|
28
|
+
2. **Result**: The verified balance, income, and longevity assessment.
|
|
29
|
+
3. **Verdict**: "The projection is mathematically consistent with the stated assumptions" OR
|
|
30
|
+
"The projection assumes [X] which appears [optimistic/conservative] — here's why..."
|
|
31
|
+
|
|
32
|
+
## Framing the Verdict
|
|
33
|
+
|
|
34
|
+
- If results match: "The projection checks out. The math supports a balance of $[X] at age [Y]
|
|
35
|
+
under these assumptions."
|
|
36
|
+
- If there's a discrepancy: "Our calculation shows $[X] vs the stated $[Y]. The difference is
|
|
37
|
+
likely due to [possible cause]. We recommend confirming the assumed return rate and
|
|
38
|
+
whether Social Security income is included."
|
|
39
|
+
- NEVER say "your advisor is wrong" — say "the numbers differ, which is worth discussing."
|
|
40
|
+
|
|
41
|
+
## Error Handling
|
|
42
|
+
|
|
43
|
+
Same as `run_forecast`. Validation errors should prompt clarification of the specific field.
|