lit-forge-mcp 0.1.1 → 0.2.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 (51) hide show
  1. package/README.md +25 -20
  2. package/dist/index.js +3 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/nisa.d.ts +56 -0
  5. package/dist/lib/nisa.js +163 -0
  6. package/dist/lib/nisa.js.map +1 -0
  7. package/dist/tools/calculate-compound-interest.d.ts +2 -0
  8. package/dist/tools/calculate-compound-interest.js +51 -0
  9. package/dist/tools/calculate-compound-interest.js.map +1 -0
  10. package/dist/tools/calculate-required-monthly.d.ts +2 -0
  11. package/dist/tools/calculate-required-monthly.js +74 -0
  12. package/dist/tools/calculate-required-monthly.js.map +1 -0
  13. package/dist/tools/index.js +11 -20
  14. package/dist/tools/index.js.map +1 -1
  15. package/dist/tools/plan-retirement.d.ts +2 -0
  16. package/dist/tools/plan-retirement.js +60 -0
  17. package/dist/tools/plan-retirement.js.map +1 -0
  18. package/dist/tools/simulate-nisa.d.ts +2 -0
  19. package/dist/tools/simulate-nisa.js +41 -0
  20. package/dist/tools/simulate-nisa.js.map +1 -0
  21. package/package.json +10 -14
  22. package/dist/tools/convert-base64.d.ts +0 -2
  23. package/dist/tools/convert-base64.js +0 -38
  24. package/dist/tools/convert-base64.js.map +0 -1
  25. package/dist/tools/convert-timestamp.d.ts +0 -2
  26. package/dist/tools/convert-timestamp.js +0 -52
  27. package/dist/tools/convert-timestamp.js.map +0 -1
  28. package/dist/tools/convert-url.d.ts +0 -2
  29. package/dist/tools/convert-url.js +0 -33
  30. package/dist/tools/convert-url.js.map +0 -1
  31. package/dist/tools/convert-yaml-json.d.ts +0 -2
  32. package/dist/tools/convert-yaml-json.js +0 -46
  33. package/dist/tools/convert-yaml-json.js.map +0 -1
  34. package/dist/tools/decode-jwt.d.ts +0 -2
  35. package/dist/tools/decode-jwt.js +0 -56
  36. package/dist/tools/decode-jwt.js.map +0 -1
  37. package/dist/tools/describe-cron.d.ts +0 -2
  38. package/dist/tools/describe-cron.js +0 -63
  39. package/dist/tools/describe-cron.js.map +0 -1
  40. package/dist/tools/format-json.d.ts +0 -2
  41. package/dist/tools/format-json.js +0 -37
  42. package/dist/tools/format-json.js.map +0 -1
  43. package/dist/tools/generate-hash.d.ts +0 -2
  44. package/dist/tools/generate-hash.js +0 -29
  45. package/dist/tools/generate-hash.js.map +0 -1
  46. package/dist/tools/generate-uuid.d.ts +0 -2
  47. package/dist/tools/generate-uuid.js +0 -41
  48. package/dist/tools/generate-uuid.js.map +0 -1
  49. package/dist/tools/test-regex.d.ts +0 -2
  50. package/dist/tools/test-regex.js +0 -54
  51. package/dist/tools/test-regex.js.map +0 -1
package/README.md CHANGED
@@ -1,25 +1,25 @@
1
1
  # lit-forge MCP server
2
2
 
3
- [lit-forge.com](https://lit-forge.com) の開発者向けユーティリティを Model Context Protocol(MCP)経由で AI から直接呼び出せるようにする stdio サーバーです。
3
+ [![npm version](https://img.shields.io/npm/v/lit-forge-mcp.svg)](https://www.npmjs.com/package/lit-forge-mcp)
4
+ [![license](https://img.shields.io/npm/l/lit-forge-mcp.svg)](./LICENSE)
5
+ [![node](https://img.shields.io/node/v/lit-forge-mcp.svg)](https://nodejs.org)
6
+
7
+ [lit-forge.com](https://lit-forge.com) の **個人資産形成プランナー(つみたて NISA・iDeCo)** を Model Context Protocol(MCP)経由で AI から直接呼び出せるようにする stdio サーバーです。
4
8
 
5
9
  Claude Desktop / Claude Code / Cursor など、MCP に対応した任意の AI クライアントで動作します。
6
10
 
7
- ## 提供ツール(10 種)
11
+ > **v0.2.0 で「金融・個人投資家特化」にピボット**しました。旧 dev ユーティリティ 10 ツール(JSON / regex / JWT / Base64 等)は廃止し、NISA / iDeCo / 退職資金プランニング系の 4 ツールに刷新しています。
12
+
13
+ ## 提供ツール(4 種)
8
14
 
9
15
  | ツール名 | 説明 |
10
16
  |---|---|
11
- | `format_json` | JSON 整形(pretty)/ 圧縮(minify) |
12
- | `test_regex` | 正規表現マッチ(JavaScript 互換、フラグ指定可、名前付きグループ対応) |
13
- | `decode_jwt` | JWT を Header / Payload / Signature に分解(exp/nbf/iat の人間可読化と有効期限判定つき) |
14
- | `convert_base64` | Base64 エンコード/デコード(UTF-8 / URL-safe 対応) |
15
- | `convert_url` | URL パーセントエンコード/デコード(component / URI 切替) |
16
- | `generate_hash` | MD5 / SHA-1 / SHA-256 / SHA-384 / SHA-512(hex / base64) |
17
- | `generate_uuid` | UUID v4 / v7 を最大 100 件まで一括生成 |
18
- | `convert_timestamp` | Unix 時刻 ⇔ ISO 8601 日時(秒/ミリ秒切替) |
19
- | `convert_yaml_json` | YAML ⇔ JSON 相互変換(js-yaml) |
20
- | `describe_cron` | cron 式を人間可読化 + 次回実行時刻を計算(IANA タイムゾーン対応) |
21
-
22
- すべて純関数(外部 API 不要・状態を持たない)で動作します。AI が出力した JSON を整形したり、JWT をデバッグしたり、UUID をテストデータとして大量生成したりするのに便利です。
17
+ | `simulate_nisa` | 月の積立額・想定年利・年数から、月次複利で評価額・運用益・年次推移を試算 |
18
+ | `plan_retirement` | 年齢・貯蓄・収入・希望生活費・リスク許容度・年金から、楽観/現実/悲観 3 シナリオで老後資金の充足度を診断 + 必要月額逆算 |
19
+ | `calculate_required_monthly` | 目標金額・現在の貯蓄・年利・年数から、達成に必要な毎月の積立額を逆算 |
20
+ | `calculate_compound_interest` | 元本(一括)と月次積立を月次複利で評価する汎用複利計算ツール |
21
+
22
+ すべて純関数(外部 API 不要・状態を持たない)。Claude / GPT / Cursor との対話の中で「老後資金大丈夫?」「月いくら積み立てれば?」を即座に試算できます。
23
23
 
24
24
  ## インストール / 設定
25
25
 
@@ -70,17 +70,22 @@ echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":
70
70
  {"jsonrpc":"2.0","id":2,"method":"tools/list"}' | node dist/index.js
71
71
  ```
72
72
 
73
- `tools/list` のレスポンスに 10 ツールが並べば成功です。
73
+ `tools/list` のレスポンスに 4 ツールが並べば成功です。
74
74
 
75
75
  ## 使用例
76
76
 
77
77
  Claude にこんな依頼ができます:
78
78
 
79
- - 「この JWT をデコードして payload の中身を見せて」
80
- - 「`name: foo\nlist: [1,2,3]` を JSON にして」
81
- - 「`0 9 * * 1-5` を日本語で説明して、次の 5 回の実行時刻も Asia/Tokyo で出して」
82
- - 「テストデータ用に UUID v7 を 20 個生成して」
83
- - 「`(\\w+)@(\\w+)` でメールアドレスをパースしたいんだけど、`alice@example.com bob@test.jp` で試して」
79
+ - 「私は35歳で月3万を積立中。現在の貯蓄500万、退職65歳、月の希望生活費25万。老後資金足りる?」
80
+ - 「20年で2000万作りたい。今500万あって年利4%なら毎月いくら積み立てればいい?」
81
+ - 「100万円を年利5%で30年複利運用したらいくらになる?」
82
+ - 「月3万円を年利6%で20年積み立てたら?」
83
+
84
+ ## 投資判断の免責
85
+
86
+ 本ツールの試算はすべて月次複利による参考値です。実際の運用結果(市場変動・税金・手数料・為替)を保証するものではありません。個別の金融商品の推奨ではなく、**投資判断はご自身の責任**でお願いします。
87
+
88
+ 公的年金額の概算は厚生年金の標準値ベースです。正確な見込み額は[ねんきんネット](https://www.nenkin.go.jp/n_net/)でご確認ください。
84
89
 
85
90
  ## ライセンス
86
91
 
package/dist/index.js CHANGED
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
- // lit-forge MCP server エントリポイント。stdio で起動し、10 ツールを登録する。
2
+ // lit-forge MCP server エントリポイント。stdio で起動し、NISA / iDeCo 個人資産形成
3
+ // プランナー系 4 ツールを登録する。
3
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
6
  import { tools } from "./tools/index.js";
6
7
  const server = new McpServer({
7
8
  name: "lit-forge",
8
- version: "0.1.0",
9
+ version: "0.2.0",
9
10
  });
10
11
  for (const tool of tools) {
11
12
  server.registerTool(tool.name, {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,wDAAwD;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IACzB,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,EACD,IAAI,CAAC,OAAO,CACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;AACjF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,+DAA+D;AAC/D,qBAAqB;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IACzB,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,EACD,IAAI,CAAC,OAAO,CACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;AACjF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ export type NisaYearlyEntry = {
2
+ year: number;
3
+ contribution: number;
4
+ value: number;
5
+ };
6
+ export type NisaResult = {
7
+ totalContribution: number;
8
+ finalValue: number;
9
+ profit: number;
10
+ yearly: ReadonlyArray<NisaYearlyEntry>;
11
+ };
12
+ export declare function combinedFutureValue(lump: number, monthly: number, monthlyRate: number, months: number): number;
13
+ export declare function simulateNisa(params: {
14
+ monthly: number;
15
+ annualRate: number;
16
+ years: number;
17
+ }): NisaResult | null;
18
+ export type RiskTolerance = "conservative" | "balanced" | "aggressive";
19
+ export declare const SCENARIO_RATES: Record<RiskTolerance, [number, number, number]>;
20
+ export type PlannerProfile = {
21
+ age: number;
22
+ currentSavings: number;
23
+ monthlyContribution: number;
24
+ retirementAge: number;
25
+ monthlyRetirementSpend: number;
26
+ riskTolerance: RiskTolerance;
27
+ pensionMonthly: number;
28
+ lifeExpectancy: number;
29
+ };
30
+ export type ScenarioLabel = "悲観" | "現実" | "楽観";
31
+ export type ScenarioResult = {
32
+ label: ScenarioLabel;
33
+ annualRate: number;
34
+ totalContribution: number;
35
+ finalValue: number;
36
+ profit: number;
37
+ yearly: ReadonlyArray<NisaYearlyEntry>;
38
+ };
39
+ export type RetirementGap = {
40
+ yearsAfterRetirement: number;
41
+ totalNeeded: number;
42
+ pensionTotal: number;
43
+ netNeeded: number;
44
+ worstCovers: boolean;
45
+ realCovers: boolean;
46
+ bestCovers: boolean;
47
+ };
48
+ export type PlannerResult = {
49
+ profile: PlannerProfile;
50
+ years: number;
51
+ scenarios: [ScenarioResult, ScenarioResult, ScenarioResult];
52
+ retirementGap: RetirementGap;
53
+ requiredMonthlyForRealScenario: number | null;
54
+ };
55
+ export declare function planRetirement(profile: PlannerProfile): PlannerResult | null;
56
+ export declare const DEFAULT_PROFILE: PlannerProfile;
@@ -0,0 +1,163 @@
1
+ // つみたて NISA・iDeCo シミュレーション + 個人資産形成プランナー。
2
+ // 月次複利の積立年金 (annuity-immediate) をベースに、現在貯蓄の一括運用と
3
+ // 月次積立を合算した将来評価額・3 シナリオ比較・老後資金差額・必要月額逆算を扱う。
4
+ // 月次複利での積立年金 (annuity-immediate) 評価額。
5
+ // monthlyRate=0 の場合はゼロ除算回避で単純積み上げ。
6
+ function annuityFutureValue(monthly, monthlyRate, months) {
7
+ if (months <= 0)
8
+ return 0;
9
+ if (monthlyRate === 0)
10
+ return monthly * months;
11
+ return (monthly * (Math.pow(1 + monthlyRate, months) - 1)) / monthlyRate;
12
+ }
13
+ // 一括金の月次複利将来価値。
14
+ function lumpFutureValue(lump, monthlyRate, months) {
15
+ if (months <= 0)
16
+ return lump;
17
+ if (monthlyRate === 0)
18
+ return lump;
19
+ return lump * Math.pow(1 + monthlyRate, months);
20
+ }
21
+ // 一括 + 月次積立を合算した月次複利将来価値。
22
+ export function combinedFutureValue(lump, monthly, monthlyRate, months) {
23
+ return lumpFutureValue(lump, monthlyRate, months) +
24
+ annuityFutureValue(monthly, monthlyRate, months);
25
+ }
26
+ export function simulateNisa(params) {
27
+ const { monthly, annualRate, years } = params;
28
+ if (!Number.isFinite(monthly) ||
29
+ !Number.isFinite(annualRate) ||
30
+ !Number.isFinite(years)) {
31
+ return null;
32
+ }
33
+ if (monthly < 0 || annualRate < 0 || years < 0)
34
+ return null;
35
+ const monthlyRate = annualRate / 100 / 12;
36
+ const yearly = [];
37
+ for (let y = 1; y <= years; y++) {
38
+ const months = y * 12;
39
+ yearly.push({
40
+ year: y,
41
+ contribution: Math.round(monthly * months),
42
+ value: Math.round(annuityFutureValue(monthly, monthlyRate, months)),
43
+ });
44
+ }
45
+ const totalContribution = Math.round(monthly * years * 12);
46
+ const finalValue = Math.round(annuityFutureValue(monthly, monthlyRate, years * 12));
47
+ return {
48
+ totalContribution,
49
+ finalValue,
50
+ profit: finalValue - totalContribution,
51
+ yearly,
52
+ };
53
+ }
54
+ // リスク許容度ごとの想定年利。[悲観, 現実, 楽観] の 3 シナリオ。
55
+ // 過去の長期インデックス投資実績(S&P500 / 全世界株式インデックス)を踏まえた保守的な設定値。
56
+ // 投資判断には使えない参考値。
57
+ export const SCENARIO_RATES = {
58
+ conservative: [1, 3, 5],
59
+ balanced: [2, 4, 6],
60
+ aggressive: [3, 5, 8],
61
+ };
62
+ function buildScenario(label, annualRate, profile, years) {
63
+ const monthlyRate = annualRate / 100 / 12;
64
+ const months = years * 12;
65
+ const yearly = [];
66
+ for (let y = 1; y <= years; y++) {
67
+ const m = y * 12;
68
+ yearly.push({
69
+ year: y,
70
+ contribution: Math.round(profile.monthlyContribution * m),
71
+ value: Math.round(combinedFutureValue(profile.currentSavings, profile.monthlyContribution, monthlyRate, m)),
72
+ });
73
+ }
74
+ const totalContribution = Math.round(profile.monthlyContribution * months);
75
+ const finalValue = Math.round(combinedFutureValue(profile.currentSavings, profile.monthlyContribution, monthlyRate, months));
76
+ return {
77
+ label,
78
+ annualRate,
79
+ totalContribution,
80
+ finalValue,
81
+ profit: finalValue - totalContribution - profile.currentSavings,
82
+ yearly,
83
+ };
84
+ }
85
+ // 必要な月額を逆算(一括運用込み)。
86
+ // finalValue = lumpFV + monthly * annuityFactor
87
+ // monthly = (target - lumpFV) / annuityFactor
88
+ // target に届かなければ null(年利が低すぎ or 期間が短すぎ)。
89
+ function solveMonthlyForTarget(target, currentSavings, annualRate, years) {
90
+ if (years <= 0)
91
+ return null;
92
+ const monthlyRate = annualRate / 100 / 12;
93
+ const months = years * 12;
94
+ const lumpFV = lumpFutureValue(currentSavings, monthlyRate, months);
95
+ if (lumpFV >= target)
96
+ return 0;
97
+ const remaining = target - lumpFV;
98
+ const annuityFactor = monthlyRate === 0
99
+ ? months
100
+ : (Math.pow(1 + monthlyRate, months) - 1) / monthlyRate;
101
+ if (annuityFactor <= 0)
102
+ return null;
103
+ return Math.ceil(remaining / annuityFactor);
104
+ }
105
+ export function planRetirement(profile) {
106
+ const fields = [
107
+ profile.age,
108
+ profile.currentSavings,
109
+ profile.monthlyContribution,
110
+ profile.retirementAge,
111
+ profile.monthlyRetirementSpend,
112
+ profile.pensionMonthly,
113
+ profile.lifeExpectancy,
114
+ ];
115
+ if (fields.some((v) => !Number.isFinite(v) || v < 0))
116
+ return null;
117
+ if (profile.retirementAge <= profile.age)
118
+ return null;
119
+ if (profile.lifeExpectancy <= profile.retirementAge)
120
+ return null;
121
+ if (!SCENARIO_RATES[profile.riskTolerance])
122
+ return null;
123
+ const years = profile.retirementAge - profile.age;
124
+ const [worstRate, realRate, bestRate] = SCENARIO_RATES[profile.riskTolerance];
125
+ const scenarios = [
126
+ buildScenario("悲観", worstRate, profile, years),
127
+ buildScenario("現実", realRate, profile, years),
128
+ buildScenario("楽観", bestRate, profile, years),
129
+ ];
130
+ const yearsAfterRetirement = profile.lifeExpectancy - profile.retirementAge;
131
+ const monthsAfter = yearsAfterRetirement * 12;
132
+ const totalNeeded = profile.monthlyRetirementSpend * monthsAfter;
133
+ const pensionTotal = profile.pensionMonthly * monthsAfter;
134
+ const netNeeded = Math.max(0, totalNeeded - pensionTotal);
135
+ const requiredMonthlyForRealScenario = solveMonthlyForTarget(netNeeded, profile.currentSavings, realRate, years);
136
+ return {
137
+ profile,
138
+ years,
139
+ scenarios,
140
+ retirementGap: {
141
+ yearsAfterRetirement,
142
+ totalNeeded: Math.round(totalNeeded),
143
+ pensionTotal: Math.round(pensionTotal),
144
+ netNeeded: Math.round(netNeeded),
145
+ worstCovers: scenarios[0].finalValue >= netNeeded,
146
+ realCovers: scenarios[1].finalValue >= netNeeded,
147
+ bestCovers: scenarios[2].finalValue >= netNeeded,
148
+ },
149
+ requiredMonthlyForRealScenario,
150
+ };
151
+ }
152
+ // プランナーのデフォルトプロファイル(UI 初期値)。
153
+ export const DEFAULT_PROFILE = {
154
+ age: 35,
155
+ currentSavings: 1_000_000,
156
+ monthlyContribution: 30_000,
157
+ retirementAge: 65,
158
+ monthlyRetirementSpend: 250_000,
159
+ riskTolerance: "balanced",
160
+ pensionMonthly: 145_000,
161
+ lifeExpectancy: 85,
162
+ };
163
+ //# sourceMappingURL=nisa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nisa.js","sourceRoot":"","sources":["../../src/lib/nisa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const calculateCompoundInterestTool: LitForgeTool;
@@ -0,0 +1,51 @@
1
+ // 一般複利計算: 元本(一括)+月次積立 を月次複利で評価。
2
+ // NISA に限らず、定期預金 / 投資信託 / 任意の積立計算に使える。
3
+ import { z } from "zod";
4
+ import { combinedFutureValue } from "../lib/nisa.js";
5
+ import { jsonReply } from "./types.js";
6
+ const inputSchema = {
7
+ principal: z
8
+ .number()
9
+ .min(0)
10
+ .default(0)
11
+ .describe("一括投入する元本(円)。例: 1000000"),
12
+ monthlyContribution: z
13
+ .number()
14
+ .min(0)
15
+ .default(0)
16
+ .describe("毎月の積立額(円)。一括だけなら 0"),
17
+ annualRate: z
18
+ .number()
19
+ .min(0)
20
+ .max(100)
21
+ .describe("想定年利(%表記。例: 3 = 3%/年)"),
22
+ years: z
23
+ .number()
24
+ .min(0)
25
+ .max(60)
26
+ .describe("運用年数(小数可。例: 0.5 = 半年、10.5 = 10年6ヶ月)"),
27
+ };
28
+ export const calculateCompoundInterestTool = {
29
+ name: "calculate_compound_interest",
30
+ title: "複利計算(一括 + 月次積立)",
31
+ description: "元本(一括)と毎月の積立額を、月次複利で運用したときの将来価値を計算します。NISA に限らず一般の投資・定期預金シミュに使える汎用ツール。",
32
+ inputSchema,
33
+ handler: ({ principal, monthlyContribution, annualRate, years }) => {
34
+ const monthlyRate = annualRate / 100 / 12;
35
+ const months = years * 12;
36
+ const futureValue = combinedFutureValue(principal, monthlyContribution, monthlyRate, months);
37
+ const totalContribution = principal + monthlyContribution * months;
38
+ const profit = futureValue - totalContribution;
39
+ return jsonReply({
40
+ futureValue: Math.round(futureValue),
41
+ principal,
42
+ totalMonthlyContribution: Math.round(monthlyContribution * months),
43
+ totalContribution: Math.round(totalContribution),
44
+ profit: Math.round(profit),
45
+ annualRate,
46
+ years,
47
+ note: "月次複利。税金・手数料は考慮せず。投資判断は自己責任で。",
48
+ });
49
+ },
50
+ };
51
+ //# sourceMappingURL=calculate-compound-interest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate-compound-interest.js","sourceRoot":"","sources":["../../src/tools/calculate-compound-interest.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AAEvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,wBAAwB,CAAC;IACrC,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,oBAAoB,CAAC;IACjC,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,uBAAuB,CAAC;IACpC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,qCAAqC,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAiB;IACzD,IAAI,EAAE,6BAA6B;IACnC,KAAK,EAAE,iBAAiB;IACxB,WAAW,EACT,wEAAwE;IAC1E,WAAW;IACX,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QACjE,MAAM,WAAW,GAAG,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,mBAAmB,CACrC,SAAS,EACT,mBAAmB,EACnB,WAAW,EACX,MAAM,CACP,CAAC;QACF,MAAM,iBAAiB,GAAG,SAAS,GAAG,mBAAmB,GAAG,MAAM,CAAC;QACnE,MAAM,MAAM,GAAG,WAAW,GAAG,iBAAiB,CAAC;QAC/C,OAAO,SAAS,CAAC;YACf,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YACpC,SAAS;YACT,wBAAwB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,MAAM,CAAC;YAClE,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAC1B,UAAU;YACV,KAAK;YACL,IAAI,EAAE,8BAA8B;SACrC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const calculateRequiredMonthlyTool: LitForgeTool;
@@ -0,0 +1,74 @@
1
+ // 目標金額に達するための必要月額を逆算。
2
+ // 一括(現在の貯蓄)の運用と月次積立の組み合わせで月次複利。
3
+ import { z } from "zod";
4
+ import { combinedFutureValue } from "../lib/nisa.js";
5
+ import { errorReply, jsonReply } from "./types.js";
6
+ const inputSchema = {
7
+ targetAmount: z
8
+ .number()
9
+ .min(0)
10
+ .describe("達成したい目標金額(円)。例: 20000000"),
11
+ currentSavings: z
12
+ .number()
13
+ .min(0)
14
+ .default(0)
15
+ .describe("現在の投資資産(円。複利運用される)"),
16
+ annualRate: z
17
+ .number()
18
+ .min(0)
19
+ .max(100)
20
+ .describe("想定年利(%表記)"),
21
+ years: z
22
+ .number()
23
+ .int()
24
+ .min(1)
25
+ .max(60)
26
+ .describe("積立期間(年)"),
27
+ };
28
+ // 数値 (整数 円) で返す。target に届かない(年利低 + 期間短 + 一括少)場合 null。
29
+ function solveMonthlyForTarget(target, currentSavings, annualRate, years) {
30
+ if (years <= 0)
31
+ return null;
32
+ const monthlyRate = annualRate / 100 / 12;
33
+ const months = years * 12;
34
+ // 一括運用分の将来価値
35
+ const lumpFV = monthlyRate === 0
36
+ ? currentSavings
37
+ : currentSavings * Math.pow(1 + monthlyRate, months);
38
+ if (lumpFV >= target)
39
+ return 0;
40
+ const remaining = target - lumpFV;
41
+ const annuityFactor = monthlyRate === 0
42
+ ? months
43
+ : (Math.pow(1 + monthlyRate, months) - 1) / monthlyRate;
44
+ if (annuityFactor <= 0)
45
+ return null;
46
+ return Math.ceil(remaining / annuityFactor);
47
+ }
48
+ export const calculateRequiredMonthlyTool = {
49
+ name: "calculate_required_monthly",
50
+ title: "必要月額逆算",
51
+ description: "目標金額・現在の貯蓄・想定年利・積立期間から、目標達成に必要な毎月の積立額を逆算します。「N 年後に X 円作るには月いくら積み立てればよいか」の問いに答えるツール。",
52
+ inputSchema,
53
+ handler: ({ targetAmount, currentSavings, annualRate, years }) => {
54
+ const required = solveMonthlyForTarget(targetAmount, currentSavings, annualRate, years);
55
+ if (required === null) {
56
+ return errorReply("計算できませんでした(years が 0 以下か、入力が不正の可能性)");
57
+ }
58
+ // 検算: その月額で実際に届くか
59
+ const monthlyRate = annualRate / 100 / 12;
60
+ const projectedFinal = combinedFutureValue(currentSavings, required, monthlyRate, years * 12);
61
+ return jsonReply({
62
+ requiredMonthly: required,
63
+ targetAmount,
64
+ currentSavings,
65
+ annualRate,
66
+ years,
67
+ projectedFinal: Math.round(projectedFinal),
68
+ note: required === 0
69
+ ? "現在の貯蓄を年利通り運用するだけで目標達成可能(月次積立 0 円で OK)"
70
+ : "月次複利による参考値。税金・手数料は考慮せず。投資判断は自己責任で。",
71
+ });
72
+ },
73
+ };
74
+ //# sourceMappingURL=calculate-required-monthly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate-required-monthly.js","sourceRoot":"","sources":["../../src/tools/calculate-required-monthly.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,15 @@
1
1
  // 全ツールを集約してエクスポート。新しいツール追加時はここに 1 行足す。
2
- import { formatJson } from "./format-json.js";
3
- import { testRegex } from "./test-regex.js";
4
- import { decodeJwt } from "./decode-jwt.js";
5
- import { convertBase64 } from "./convert-base64.js";
6
- import { convertUrl } from "./convert-url.js";
7
- import { generateHash } from "./generate-hash.js";
8
- import { generateUuid } from "./generate-uuid.js";
9
- import { convertTimestamp } from "./convert-timestamp.js";
10
- import { convertYamlJson } from "./convert-yaml-json.js";
11
- import { describeCron } from "./describe-cron.js";
2
+ //
3
+ // v0.2.0 で「金融・個人投資家特化」にピボット。旧 dev utility 10 ツールを廃止し、
4
+ // つみたて NISA・iDeCo を中心とした資産形成プランナー系 4 ツールに刷新。
5
+ import { simulateNisaTool } from "./simulate-nisa.js";
6
+ import { planRetirementTool } from "./plan-retirement.js";
7
+ import { calculateRequiredMonthlyTool } from "./calculate-required-monthly.js";
8
+ import { calculateCompoundInterestTool } from "./calculate-compound-interest.js";
12
9
  export const tools = [
13
- formatJson,
14
- testRegex,
15
- decodeJwt,
16
- convertBase64,
17
- convertUrl,
18
- generateHash,
19
- generateUuid,
20
- convertTimestamp,
21
- convertYamlJson,
22
- describeCron,
10
+ simulateNisaTool,
11
+ planRetirementTool,
12
+ calculateRequiredMonthlyTool,
13
+ calculateCompoundInterestTool,
23
14
  ];
24
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,UAAU;IACV,SAAS;IACT,SAAS;IACT,aAAa;IACb,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,YAAY;CACb,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,sDAAsD;AACtD,6CAA6C;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEjF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,4BAA4B;IAC5B,6BAA6B;CAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const planRetirementTool: LitForgeTool;
@@ -0,0 +1,60 @@
1
+ // 個人資産形成プランナー:年齢・貯蓄・希望生活費から
2
+ // 楽観/現実/悲観 3 シナリオ + 老後資金充足度 + 必要月額逆算を返す。
3
+ import { z } from "zod";
4
+ import { planRetirement } from "../lib/nisa.js";
5
+ import { errorReply, jsonReply } from "./types.js";
6
+ const inputSchema = {
7
+ age: z.number().int().min(0).max(120).describe("現在の年齢"),
8
+ currentSavings: z
9
+ .number()
10
+ .min(0)
11
+ .default(0)
12
+ .describe("現在の投資資産(円。預金 + 投資商品の合計)"),
13
+ monthlyContribution: z
14
+ .number()
15
+ .min(0)
16
+ .describe("毎月の積立額(円)"),
17
+ retirementAge: z
18
+ .number()
19
+ .int()
20
+ .min(0)
21
+ .max(120)
22
+ .describe("退職(積立終了)予定年齢"),
23
+ monthlyRetirementSpend: z
24
+ .number()
25
+ .min(0)
26
+ .describe("退職後の月間希望生活費(円)"),
27
+ riskTolerance: z
28
+ .enum(["conservative", "balanced", "aggressive"])
29
+ .default("balanced")
30
+ .describe("リスク許容度。conservative=1-5%, balanced=2-6%, aggressive=3-8% の年利想定"),
31
+ pensionMonthly: z
32
+ .number()
33
+ .min(0)
34
+ .default(145_000)
35
+ .describe("受給予定の公的年金月額(円)。デフォルト 145,000 は厚生年金の標準値"),
36
+ lifeExpectancy: z
37
+ .number()
38
+ .int()
39
+ .min(0)
40
+ .max(120)
41
+ .default(85)
42
+ .describe("想定寿命(年)。日本人平均は 84 前後"),
43
+ };
44
+ export const planRetirementTool = {
45
+ name: "plan_retirement",
46
+ title: "個人資産形成プランナー(NISA / iDeCo)",
47
+ description: "年齢・現在の貯蓄・毎月の積立額・退職予定年齢・退職後の希望生活費・リスク許容度・受給年金から、楽観/現実/悲観 3 シナリオで将来資産と老後資金の充足度を試算。不足する場合は現実シナリオで届く必要月額も自動逆算します。",
48
+ inputSchema,
49
+ handler: (args) => {
50
+ const result = planRetirement(args);
51
+ if (!result) {
52
+ return errorReply("入力が不正です。retirementAge > age, lifeExpectancy > retirementAge, 全項目 0 以上の有限値である必要があります");
53
+ }
54
+ return jsonReply({
55
+ ...result,
56
+ note: "月次複利による参考値。税金(NISA枠超過の譲渡益課税・iDeCo 所得控除等)は別途計算が必要。投資判断は自己責任で。年金額は「ねんきんネット」で正確値を確認推奨。",
57
+ });
58
+ },
59
+ };
60
+ //# sourceMappingURL=plan-retirement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-retirement.js","sourceRoot":"","sources":["../../src/tools/plan-retirement.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,yCAAyC;AAEzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IACvD,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,yBAAyB,CAAC;IACtC,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,WAAW,CAAC;IACxB,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,cAAc,CAAC;IAC3B,sBAAsB,EAAE,CAAC;SACtB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,gBAAgB,CAAC;IAC7B,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;SAChD,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CACP,gEAAgE,CACjE;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,QAAQ,CACP,wCAAwC,CACzC;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,sBAAsB,CAAC;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAiB;IAC9C,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,2BAA2B;IAClC,WAAW,EACT,+GAA+G;IACjH,WAAW;IACX,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,UAAU,CACf,qFAAqF,CACtF,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;YACf,GAAG,MAAM;YACT,IAAI,EAAE,qFAAqF;SAC5F,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const simulateNisaTool: LitForgeTool;
@@ -0,0 +1,41 @@
1
+ // つみたて NISA / iDeCo の単純シミュレーション。
2
+ // 毎月一定額を積み立てる年金型として、月次複利で将来評価額を求める。
3
+ import { z } from "zod";
4
+ import { simulateNisa } from "../lib/nisa.js";
5
+ import { errorReply, jsonReply } from "./types.js";
6
+ const inputSchema = {
7
+ monthly: z
8
+ .number()
9
+ .min(0)
10
+ .describe("毎月の積立額(円)。例: 30000"),
11
+ annualRate: z
12
+ .number()
13
+ .min(0)
14
+ .max(100)
15
+ .describe("想定年利(%表記。例: 5 = 5%/年)"),
16
+ years: z
17
+ .number()
18
+ .int()
19
+ .min(0)
20
+ .max(60)
21
+ .describe("積立年数(0〜60)"),
22
+ };
23
+ export const simulateNisaTool = {
24
+ name: "simulate_nisa",
25
+ title: "つみたて NISA シミュレーション",
26
+ description: "毎月の積立額・想定年利・年数から、月次複利で将来評価額・運用益・年次推移を試算します。NISA / iDeCo の単純シミュレーション用。",
27
+ inputSchema,
28
+ handler: ({ monthly, annualRate, years }) => {
29
+ const result = simulateNisa({ monthly, annualRate, years });
30
+ if (!result)
31
+ return errorReply("入力が不正です(負値・NaN・Infinity は不可)");
32
+ return jsonReply({
33
+ totalContribution: result.totalContribution,
34
+ finalValue: result.finalValue,
35
+ profit: result.profit,
36
+ yearly: result.yearly,
37
+ note: "月次複利の積立年金(annuity-immediate)として算出。税金・手数料は考慮せず。投資判断は自己責任で。",
38
+ });
39
+ },
40
+ };
41
+ //# sourceMappingURL=simulate-nisa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate-nisa.js","sourceRoot":"","sources":["../../src/tools/simulate-nisa.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,oCAAoC;AAEpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,oBAAoB,CAAC;IACjC,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,uBAAuB,CAAC;IACpC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,YAAY,CAAC;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EACT,uEAAuE;IACzE,WAAW;IACX,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC,8BAA8B,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC;YACf,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,2DAA2D;SAClE,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}