lit-forge-mcp 0.1.2 → 0.3.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 +40 -20
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/economic-events.d.ts +9 -0
- package/dist/lib/economic-events.js +146 -0
- package/dist/lib/economic-events.js.map +1 -0
- package/dist/lib/indicators.d.ts +2 -0
- package/dist/lib/indicators.js +14 -0
- package/dist/lib/indicators.js.map +1 -0
- package/dist/lib/market-types.d.ts +41 -0
- package/dist/lib/market-types.js +4 -0
- package/dist/lib/market-types.js.map +1 -0
- package/dist/lib/nisa.d.ts +56 -0
- package/dist/lib/nisa.js +163 -0
- package/dist/lib/nisa.js.map +1 -0
- package/dist/lib/yahoo.d.ts +9 -0
- package/dist/lib/yahoo.js +110 -0
- package/dist/lib/yahoo.js.map +1 -0
- package/dist/tools/calculate-compound-interest.d.ts +2 -0
- package/dist/tools/calculate-compound-interest.js +51 -0
- package/dist/tools/calculate-compound-interest.js.map +1 -0
- package/dist/tools/calculate-required-monthly.d.ts +2 -0
- package/dist/tools/calculate-required-monthly.js +74 -0
- package/dist/tools/calculate-required-monthly.js.map +1 -0
- package/dist/tools/get-economic-events.d.ts +2 -0
- package/dist/tools/get-economic-events.js +42 -0
- package/dist/tools/get-economic-events.js.map +1 -0
- package/dist/tools/get-market-snapshot.d.ts +2 -0
- package/dist/tools/get-market-snapshot.js +27 -0
- package/dist/tools/get-market-snapshot.js.map +1 -0
- package/dist/tools/get-quote.d.ts +2 -0
- package/dist/tools/get-quote.js +31 -0
- package/dist/tools/get-quote.js.map +1 -0
- package/dist/tools/index.js +19 -20
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/plan-retirement.d.ts +2 -0
- package/dist/tools/plan-retirement.js +60 -0
- package/dist/tools/plan-retirement.js.map +1 -0
- package/dist/tools/simulate-nisa.d.ts +2 -0
- package/dist/tools/simulate-nisa.js +41 -0
- package/dist/tools/simulate-nisa.js.map +1 -0
- package/package.json +13 -14
- package/dist/tools/convert-base64.d.ts +0 -2
- package/dist/tools/convert-base64.js +0 -38
- package/dist/tools/convert-base64.js.map +0 -1
- package/dist/tools/convert-timestamp.d.ts +0 -2
- package/dist/tools/convert-timestamp.js +0 -52
- package/dist/tools/convert-timestamp.js.map +0 -1
- package/dist/tools/convert-url.d.ts +0 -2
- package/dist/tools/convert-url.js +0 -33
- package/dist/tools/convert-url.js.map +0 -1
- package/dist/tools/convert-yaml-json.d.ts +0 -2
- package/dist/tools/convert-yaml-json.js +0 -46
- package/dist/tools/convert-yaml-json.js.map +0 -1
- package/dist/tools/decode-jwt.d.ts +0 -2
- package/dist/tools/decode-jwt.js +0 -56
- package/dist/tools/decode-jwt.js.map +0 -1
- package/dist/tools/describe-cron.d.ts +0 -2
- package/dist/tools/describe-cron.js +0 -63
- package/dist/tools/describe-cron.js.map +0 -1
- package/dist/tools/format-json.d.ts +0 -2
- package/dist/tools/format-json.js +0 -37
- package/dist/tools/format-json.js.map +0 -1
- package/dist/tools/generate-hash.d.ts +0 -2
- package/dist/tools/generate-hash.js +0 -29
- package/dist/tools/generate-hash.js.map +0 -1
- package/dist/tools/generate-uuid.d.ts +0 -2
- package/dist/tools/generate-uuid.js +0 -41
- package/dist/tools/generate-uuid.js.map +0 -1
- package/dist/tools/test-regex.d.ts +0 -2
- package/dist/tools/test-regex.js +0 -54
- package/dist/tools/test-regex.js.map +0 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Yahoo Finance v8 chart API ラッパー(MCP server 用)。
|
|
2
|
+
// Web 側の app/lib/market/yahoo.ts と同期管理。
|
|
3
|
+
// Node 18+ の global fetch を使用、依存追加なし。
|
|
4
|
+
import { INDICATORS } from "./indicators.js";
|
|
5
|
+
const UA = "Mozilla/5.0 (compatible; lit-forge-mcp/0.3; +https://lit-forge.com/)";
|
|
6
|
+
const TIMEOUT_MS = 4000;
|
|
7
|
+
export class YahooFinanceError extends Error {
|
|
8
|
+
symbol;
|
|
9
|
+
status;
|
|
10
|
+
constructor(symbol, status, message) {
|
|
11
|
+
super(message ?? `Yahoo Finance API ${symbol}: HTTP ${status}`);
|
|
12
|
+
this.symbol = symbol;
|
|
13
|
+
this.status = status;
|
|
14
|
+
this.name = "YahooFinanceError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function fetchRaw(symbol) {
|
|
18
|
+
const url = `https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(symbol)}` +
|
|
19
|
+
`?range=1d&interval=15m`;
|
|
20
|
+
let res;
|
|
21
|
+
try {
|
|
22
|
+
res = await fetch(url, {
|
|
23
|
+
headers: { "User-Agent": UA, Accept: "application/json" },
|
|
24
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
const msg = e instanceof Error ? e.message : "fetch failed";
|
|
29
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol}: ${msg}`);
|
|
30
|
+
}
|
|
31
|
+
if (!res.ok)
|
|
32
|
+
throw new YahooFinanceError(symbol, res.status);
|
|
33
|
+
const data = (await res.json());
|
|
34
|
+
const result = data.chart.result?.[0];
|
|
35
|
+
if (!result) {
|
|
36
|
+
const desc = data.chart.error?.description ?? "empty result";
|
|
37
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol}: ${desc}`);
|
|
38
|
+
}
|
|
39
|
+
const meta = result.meta;
|
|
40
|
+
const price = meta.regularMarketPrice;
|
|
41
|
+
const previousClose = meta.chartPreviousClose ?? meta.previousClose;
|
|
42
|
+
if (typeof price !== "number" || typeof previousClose !== "number") {
|
|
43
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol}: missing price/previousClose`);
|
|
44
|
+
}
|
|
45
|
+
const change = price - previousClose;
|
|
46
|
+
const changePercent = previousClose !== 0 ? (change / previousClose) * 100 : 0;
|
|
47
|
+
const changeBp = change * 100;
|
|
48
|
+
const fetchedAt = new Date(meta.regularMarketTime ? meta.regularMarketTime * 1000 : Date.now()).toISOString();
|
|
49
|
+
return {
|
|
50
|
+
symbol,
|
|
51
|
+
displayName: symbol,
|
|
52
|
+
category: "fx",
|
|
53
|
+
price,
|
|
54
|
+
previousClose,
|
|
55
|
+
change,
|
|
56
|
+
changePercent,
|
|
57
|
+
changeBp,
|
|
58
|
+
unit: "",
|
|
59
|
+
fetchedAt,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// indicator のメタを Quote に上書きして返す。
|
|
63
|
+
function applyMeta(quote, indicator) {
|
|
64
|
+
return {
|
|
65
|
+
...quote,
|
|
66
|
+
displayName: indicator.displayName,
|
|
67
|
+
category: indicator.category,
|
|
68
|
+
unit: indicator.unit,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// indicator から fetch、失敗時は fallback を試す。
|
|
72
|
+
export async function fetchQuoteForIndicator(indicator) {
|
|
73
|
+
try {
|
|
74
|
+
const quote = await fetchRaw(indicator.symbol);
|
|
75
|
+
return applyMeta(quote, indicator);
|
|
76
|
+
}
|
|
77
|
+
catch (primaryErr) {
|
|
78
|
+
if (!indicator.fallback) {
|
|
79
|
+
const m = primaryErr instanceof Error ? primaryErr.message : "unknown";
|
|
80
|
+
return { symbol: indicator.symbol, error: m };
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const quote = await fetchRaw(indicator.fallback);
|
|
84
|
+
return applyMeta(quote, indicator);
|
|
85
|
+
}
|
|
86
|
+
catch (fallbackErr) {
|
|
87
|
+
const m1 = primaryErr instanceof Error ? primaryErr.message : "primary";
|
|
88
|
+
const m2 = fallbackErr instanceof Error ? fallbackErr.message : "fallback";
|
|
89
|
+
return { symbol: indicator.symbol, error: `${m1} / ${m2}` };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 任意の symbol を 1 件取得(get_quote ツール用)。
|
|
94
|
+
export async function fetchQuoteBySymbol(symbol) {
|
|
95
|
+
return fetchRaw(symbol);
|
|
96
|
+
}
|
|
97
|
+
// 9 銘柄を並列取得して Snapshot を返す。
|
|
98
|
+
export async function fetchSnapshot() {
|
|
99
|
+
const results = await Promise.allSettled(INDICATORS.map((ind) => fetchQuoteForIndicator(ind)));
|
|
100
|
+
const quotes = results.map((r, i) => {
|
|
101
|
+
if (r.status === "fulfilled")
|
|
102
|
+
return r.value;
|
|
103
|
+
return {
|
|
104
|
+
symbol: INDICATORS[i].symbol,
|
|
105
|
+
error: r.reason instanceof Error ? r.reason.message : "unknown",
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
return { fetchedAt: new Date().toISOString(), quotes };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=yahoo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yahoo.js","sourceRoot":"","sources":["../../src/lib/yahoo.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,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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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// 当日 or 今週の経済イベント(FOMC・日銀・雇用統計・CPI 等)を返す。
|
|
2
|
+
// データは自前ハードコード(economic-events.ts、半年分)。
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { COUNTRY_LABEL, IMPORTANCE_STARS, LAST_UPDATED, filterByImportance, getEventsForDate, getEventsForWeek, jstDateKey, } from "../lib/economic-events.js";
|
|
5
|
+
import { jsonReply } from "./types.js";
|
|
6
|
+
const inputSchema = {
|
|
7
|
+
range: z
|
|
8
|
+
.enum(["today", "week"])
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("期間: today=本日のみ / week=今日含む 7 日間。既定 today"),
|
|
11
|
+
minImportance: z
|
|
12
|
+
.union([z.literal(1), z.literal(2), z.literal(3)])
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("最低重要度フィルタ: 1=★以上 / 2=★★以上 / 3=★★★のみ。既定 1"),
|
|
15
|
+
};
|
|
16
|
+
export const getEconomicEventsTodayTool = {
|
|
17
|
+
name: "get_economic_events_today",
|
|
18
|
+
title: "本日・今週の経済イベント",
|
|
19
|
+
description: "本日(または今週)の主要経済イベント(FOMC・日銀金融政策決定会合・米雇用統計・CPI・GDP・中国 PMI など)を返します。データは lit-forge 運営者が手動キュレーションした半年分のスケジュール。",
|
|
20
|
+
inputSchema,
|
|
21
|
+
handler: ({ range, minImportance }) => {
|
|
22
|
+
const today = jstDateKey();
|
|
23
|
+
const events = range === "week" ? getEventsForWeek(today) : getEventsForDate(today);
|
|
24
|
+
const filtered = filterByImportance(events, minImportance ?? 1);
|
|
25
|
+
return jsonReply({
|
|
26
|
+
today,
|
|
27
|
+
range: range ?? "today",
|
|
28
|
+
lastUpdated: LAST_UPDATED,
|
|
29
|
+
count: filtered.length,
|
|
30
|
+
events: filtered.map((e) => ({
|
|
31
|
+
date: e.date,
|
|
32
|
+
time: e.time ?? "終日",
|
|
33
|
+
country: COUNTRY_LABEL[e.country],
|
|
34
|
+
name: e.name,
|
|
35
|
+
importance: IMPORTANCE_STARS[e.importance],
|
|
36
|
+
note: e.note,
|
|
37
|
+
})),
|
|
38
|
+
note: "経済イベントは半年に 1 回手動更新。急な発表変更や中銀緊急会合は反映されない場合があります。",
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=get-economic-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-economic-events.js","sourceRoot":"","sources":["../../src/tools/get-economic-events.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,wCAAwC;AAExC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;SACvB,QAAQ,EAAE;SACV,QAAQ,CAAC,0CAA0C,CAAC;IACvD,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD,QAAQ,EAAE;SACV,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAiB;IACtD,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,cAAc;IACrB,WAAW,EACT,4GAA4G;IAC9G,WAAW;IACX,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC;YACf,KAAK;YACL,KAAK,EAAE,KAAK,IAAI,OAAO;YACvB,WAAW,EAAE,YAAY;YACzB,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;gBACpB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;YACH,IAAI,EACF,iDAAiD;SACpD,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// 主要マクロ指標 9 銘柄(為替・株・金利・コモディティ)の現在値・前日比を一括取得。
|
|
2
|
+
// /today ページと同等情報を Claude Desktop / Cursor から呼べる。
|
|
3
|
+
import { fetchSnapshot } from "../lib/yahoo.js";
|
|
4
|
+
import { errorReply, jsonReply } from "./types.js";
|
|
5
|
+
export const getMarketSnapshotTool = {
|
|
6
|
+
name: "get_market_snapshot",
|
|
7
|
+
title: "主要マクロ指標スナップショット",
|
|
8
|
+
description: "USD/JPY・EUR/JPY・日経平均・TOPIX・S&P 500・NASDAQ 100・米10年債利回り・金・原油 WTI の現在値と前日比を Yahoo Finance から取得します。lit-forge.com/today と同等の情報。約 1 時間遅れの参考値で、投資助言ではありません。",
|
|
9
|
+
inputSchema: {},
|
|
10
|
+
handler: async () => {
|
|
11
|
+
try {
|
|
12
|
+
const snapshot = await fetchSnapshot();
|
|
13
|
+
const successCount = snapshot.quotes.filter((q) => !("error" in q)).length;
|
|
14
|
+
return jsonReply({
|
|
15
|
+
fetchedAt: snapshot.fetchedAt,
|
|
16
|
+
successCount,
|
|
17
|
+
totalCount: snapshot.quotes.length,
|
|
18
|
+
quotes: snapshot.quotes,
|
|
19
|
+
note: "データは Yahoo Finance より取得(約 1 時間遅れ)。投資助言ではなく情報集約。",
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
return errorReply(`Yahoo Finance API への接続に失敗しました: ${e instanceof Error ? e.message : "unknown"}`);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=get-market-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-market-snapshot.js","sourceRoot":"","sources":["../../src/tools/get-market-snapshot.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,kDAAkD;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,iBAAiB;IACxB,WAAW,EACT,uJAAuJ;IACzJ,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3E,OAAO,SAAS,CAAC;gBACf,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,YAAY;gBACZ,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;gBAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,iDAAiD;aACxD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,UAAU,CACf,kCACE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SACnC,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// 任意の Yahoo Finance ティッカーで単発の現在値・前日比を取得する。
|
|
2
|
+
// 9 主要指標以外(個別株・他通貨ペア・他コモディティ等)を確認したいケース用の拡張点。
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { fetchQuoteBySymbol } from "../lib/yahoo.js";
|
|
5
|
+
import { errorReply, jsonReply } from "./types.js";
|
|
6
|
+
const inputSchema = {
|
|
7
|
+
symbol: z
|
|
8
|
+
.string()
|
|
9
|
+
.min(1)
|
|
10
|
+
.max(20)
|
|
11
|
+
.describe("Yahoo Finance ティッカー。例: AAPL(アップル株)/ ^DJI(NY ダウ)/ BTC-USD(ビットコイン)/ GBPJPY=X(ポンド円)"),
|
|
12
|
+
};
|
|
13
|
+
export const getQuoteTool = {
|
|
14
|
+
name: "get_quote",
|
|
15
|
+
title: "任意ティッカーの現在値取得",
|
|
16
|
+
description: "Yahoo Finance の任意ティッカー(株・為替・指数・コモディティ・暗号資産)の現在値・前日比・スパークラインを取得します。get_market_snapshot で扱う 9 指標以外を確認したいときに使用。投資助言ではありません。",
|
|
17
|
+
inputSchema,
|
|
18
|
+
handler: async ({ symbol }) => {
|
|
19
|
+
try {
|
|
20
|
+
const quote = await fetchQuoteBySymbol(symbol);
|
|
21
|
+
return jsonReply({
|
|
22
|
+
...quote,
|
|
23
|
+
note: "Yahoo Finance より取得(約 1 時間遅れ)。投資助言ではなく情報集約。",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
return errorReply(`${symbol} の取得に失敗しました: ${e instanceof Error ? e.message : "unknown"}。Yahoo Finance のティッカーが正しいか確認してください(例: AAPL / ^DJI / BTC-USD)`);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=get-quote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-quote.js","sourceRoot":"","sources":["../../src/tools/get-quote.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,8CAA8C;AAE9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CACP,kFAAkF,CACnF;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,eAAe;IACtB,WAAW,EACT,0HAA0H;IAC5H,WAAW;IACX,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO,SAAS,CAAC;gBACf,GAAG,KAAK;gBACR,IAAI,EAAE,4CAA4C;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,UAAU,CACf,GAAG,MAAM,gBACP,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SACnC,8DAA8D,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
// 全ツールを集約してエクスポート。新しいツール追加時はここに 1 行足す。
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
2
|
+
//
|
|
3
|
+
// v0.2.0 で「金融・個人投資家特化」にピボット。旧 dev utility 10 ツールを廃止し、
|
|
4
|
+
// つみたて NISA・iDeCo を中心とした資産形成プランナー系 4 ツールに刷新。
|
|
5
|
+
// v0.3.0 で「毎朝の市況チェック」系 3 ツール(市況スナップショット・経済イベント・任意ティッカー取得)を追加。
|
|
6
|
+
// 初の HTTP fetch 導入(Yahoo Finance)— ローカル PC からインターネットに出ます。
|
|
7
|
+
import { simulateNisaTool } from "./simulate-nisa.js";
|
|
8
|
+
import { planRetirementTool } from "./plan-retirement.js";
|
|
9
|
+
import { calculateRequiredMonthlyTool } from "./calculate-required-monthly.js";
|
|
10
|
+
import { calculateCompoundInterestTool } from "./calculate-compound-interest.js";
|
|
11
|
+
import { getMarketSnapshotTool } from "./get-market-snapshot.js";
|
|
12
|
+
import { getEconomicEventsTodayTool } from "./get-economic-events.js";
|
|
13
|
+
import { getQuoteTool } from "./get-quote.js";
|
|
12
14
|
export const tools = [
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
convertTimestamp,
|
|
21
|
-
convertYamlJson,
|
|
22
|
-
describeCron,
|
|
15
|
+
simulateNisaTool,
|
|
16
|
+
planRetirementTool,
|
|
17
|
+
calculateRequiredMonthlyTool,
|
|
18
|
+
calculateCompoundInterestTool,
|
|
19
|
+
getMarketSnapshotTool,
|
|
20
|
+
getEconomicEventsTodayTool,
|
|
21
|
+
getQuoteTool,
|
|
23
22
|
];
|
|
24
23
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,sDAAsD;AACtD,6CAA6C;AAC7C,8DAA8D;AAC9D,0DAA0D;AAE1D,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;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,4BAA4B;IAC5B,6BAA6B;IAC7B,qBAAqB;IACrB,0BAA0B;IAC1B,YAAY;CACb,CAAC"}
|
|
@@ -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,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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lit-forge-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"mcpName": "io.github.noblabs/lit-forge-mcp",
|
|
5
|
-
"description": "MCP server
|
|
5
|
+
"description": "MCP server for personal asset planning + daily market check: NISA / iDeCo simulation, retirement planning, market snapshot (USD/JPY, Nikkei, S&P 500, etc.), economic event calendar.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"homepage": "https://lit-forge.com",
|
|
@@ -17,14 +17,17 @@
|
|
|
17
17
|
"mcp",
|
|
18
18
|
"model-context-protocol",
|
|
19
19
|
"claude",
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
20
|
+
"finance",
|
|
21
|
+
"investment",
|
|
22
|
+
"nisa",
|
|
23
|
+
"ideco",
|
|
24
|
+
"retirement",
|
|
25
|
+
"compound-interest",
|
|
26
|
+
"market-data",
|
|
27
|
+
"stock-quote",
|
|
28
|
+
"forex",
|
|
29
|
+
"economic-calendar",
|
|
30
|
+
"japan"
|
|
28
31
|
],
|
|
29
32
|
"bin": {
|
|
30
33
|
"lit-forge-mcp": "dist/index.js"
|
|
@@ -42,13 +45,9 @@
|
|
|
42
45
|
},
|
|
43
46
|
"dependencies": {
|
|
44
47
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
45
|
-
"cron-parser": "^5.5.0",
|
|
46
|
-
"cronstrue": "^3.14.0",
|
|
47
|
-
"js-yaml": "^4.1.0",
|
|
48
48
|
"zod": "^3.25.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@types/js-yaml": "^4.0.9",
|
|
52
51
|
"@types/node": "^22.0.0",
|
|
53
52
|
"typescript": "^5.6.0"
|
|
54
53
|
},
|