lit-forge-mcp 0.3.0 → 0.4.1

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 (84) hide show
  1. package/README.md +17 -7
  2. package/dist/lib/__tests__/correlation.test.d.ts +1 -0
  3. package/dist/lib/__tests__/correlation.test.js +53 -0
  4. package/dist/lib/__tests__/correlation.test.js.map +1 -0
  5. package/dist/lib/__tests__/quartile.test.d.ts +1 -0
  6. package/dist/lib/__tests__/quartile.test.js +148 -0
  7. package/dist/lib/__tests__/quartile.test.js.map +1 -0
  8. package/dist/lib/__tests__/rankings.test.d.ts +1 -0
  9. package/dist/lib/__tests__/rankings.test.js +67 -0
  10. package/dist/lib/__tests__/rankings.test.js.map +1 -0
  11. package/dist/lib/__tests__/sessions.test.d.ts +1 -0
  12. package/dist/lib/__tests__/sessions.test.js +47 -0
  13. package/dist/lib/__tests__/sessions.test.js.map +1 -0
  14. package/dist/lib/__tests__/sma.test.d.ts +1 -0
  15. package/dist/lib/__tests__/sma.test.js +26 -0
  16. package/dist/lib/__tests__/sma.test.js.map +1 -0
  17. package/dist/lib/__tests__/thermometer.test.d.ts +1 -0
  18. package/dist/lib/__tests__/thermometer.test.js +120 -0
  19. package/dist/lib/__tests__/thermometer.test.js.map +1 -0
  20. package/dist/lib/__tests__/yield-spread.test.d.ts +1 -0
  21. package/dist/lib/__tests__/yield-spread.test.js +46 -0
  22. package/dist/lib/__tests__/yield-spread.test.js.map +1 -0
  23. package/dist/lib/correlation.d.ts +3 -0
  24. package/dist/lib/correlation.js +77 -0
  25. package/dist/lib/correlation.js.map +1 -0
  26. package/dist/lib/fangplus.d.ts +7 -0
  27. package/dist/lib/fangplus.js +19 -0
  28. package/dist/lib/fangplus.js.map +1 -0
  29. package/dist/lib/indicators.d.ts +1 -0
  30. package/dist/lib/indicators.js +36 -1
  31. package/dist/lib/indicators.js.map +1 -1
  32. package/dist/lib/mag7.d.ts +7 -0
  33. package/dist/lib/mag7.js +13 -0
  34. package/dist/lib/mag7.js.map +1 -0
  35. package/dist/lib/market-types.d.ts +22 -6
  36. package/dist/lib/market-types.js +1 -0
  37. package/dist/lib/market-types.js.map +1 -1
  38. package/dist/lib/performance.d.ts +3 -0
  39. package/dist/lib/performance.js +43 -0
  40. package/dist/lib/performance.js.map +1 -0
  41. package/dist/lib/quartile.d.ts +24 -0
  42. package/dist/lib/quartile.js +128 -0
  43. package/dist/lib/quartile.js.map +1 -0
  44. package/dist/lib/rankings.d.ts +7 -0
  45. package/dist/lib/rankings.js +29 -0
  46. package/dist/lib/rankings.js.map +1 -0
  47. package/dist/lib/sectors.d.ts +7 -0
  48. package/dist/lib/sectors.js +62 -0
  49. package/dist/lib/sectors.js.map +1 -0
  50. package/dist/lib/sessions.d.ts +14 -0
  51. package/dist/lib/sessions.js +50 -0
  52. package/dist/lib/sessions.js.map +1 -0
  53. package/dist/lib/sma.d.ts +2 -0
  54. package/dist/lib/sma.js +33 -0
  55. package/dist/lib/sma.js.map +1 -0
  56. package/dist/lib/thermometer.d.ts +13 -0
  57. package/dist/lib/thermometer.js +118 -0
  58. package/dist/lib/thermometer.js.map +1 -0
  59. package/dist/lib/yahoo.d.ts +2 -0
  60. package/dist/lib/yahoo.js +76 -16
  61. package/dist/lib/yahoo.js.map +1 -1
  62. package/dist/lib/yield-spread.d.ts +6 -0
  63. package/dist/lib/yield-spread.js +20 -0
  64. package/dist/lib/yield-spread.js.map +1 -0
  65. package/dist/tools/get-market-sessions.d.ts +2 -0
  66. package/dist/tools/get-market-sessions.js +27 -0
  67. package/dist/tools/get-market-sessions.js.map +1 -0
  68. package/dist/tools/get-market-snapshot.js +7 -5
  69. package/dist/tools/get-market-snapshot.js.map +1 -1
  70. package/dist/tools/get-market-thermometer.d.ts +2 -0
  71. package/dist/tools/get-market-thermometer.js +47 -0
  72. package/dist/tools/get-market-thermometer.js.map +1 -0
  73. package/dist/tools/get-performance-ranking.d.ts +2 -0
  74. package/dist/tools/get-performance-ranking.js +75 -0
  75. package/dist/tools/get-performance-ranking.js.map +1 -0
  76. package/dist/tools/get-sector-heatmap.d.ts +2 -0
  77. package/dist/tools/get-sector-heatmap.js +34 -0
  78. package/dist/tools/get-sector-heatmap.js.map +1 -0
  79. package/dist/tools/get-yield-spread.d.ts +2 -0
  80. package/dist/tools/get-yield-spread.js +41 -0
  81. package/dist/tools/get-yield-spread.js.map +1 -0
  82. package/dist/tools/index.js +13 -0
  83. package/dist/tools/index.js.map +1 -1
  84. package/package.json +6 -3
@@ -0,0 +1,47 @@
1
+ // マーケット温度計:VIX / S&P 500 / 米10年金利 / DXY を合成した 0-100 のリスクオン/オフ・スコア。
2
+ // /today ページのページ最上部に出ているのと同じ合成ロジック。事実ベースで投資推奨を含まない。
3
+ import { fetchSnapshot, fetchHistorical } from "../lib/yahoo.js";
4
+ import { computeThermometer, computeThermometerHistory, } from "../lib/thermometer.js";
5
+ import { errorReply, jsonReply } from "./types.js";
6
+ const HIST_SYMBOLS = ["^VIX", "^GSPC", "^TNX", "DX-Y.NYB"];
7
+ export const getMarketThermometerTool = {
8
+ name: "get_market_thermometer",
9
+ title: "マーケット温度計(リスクオン/オフ合成スコア)",
10
+ description: "VIX・S&P 500 前日比・米10年金利前日比・ドル指数前日比を合成した 0-100 のリスクオン/オフ・スコアを返します。50 が中立、70 以上でリスクオン優勢、30 以下でリスクオフ優勢。各成分のスコアと過去 30 営業日の推移も含みます。投資推奨ではなく俯瞰用の指標です。",
11
+ inputSchema: {},
12
+ handler: async () => {
13
+ try {
14
+ const snapshot = await fetchSnapshot();
15
+ // 履歴算出のため historical を取得して closes1y を補完
16
+ await Promise.all(HIST_SYMBOLS.map(async (s) => {
17
+ const q = snapshot.quotes[s];
18
+ if (!q || "error" in q)
19
+ return;
20
+ try {
21
+ const closes = await fetchHistorical(s);
22
+ if (closes.length > 0)
23
+ q.closes1y = closes;
24
+ }
25
+ catch {
26
+ // 履歴取得は best-effort
27
+ }
28
+ }));
29
+ const result = computeThermometer(snapshot);
30
+ const history = computeThermometerHistory(snapshot, 30);
31
+ if (!result) {
32
+ return errorReply("温度計の合成に必要な銘柄(VIX / S&P 500 / 米10年金利 / DXY)の取得に失敗しました。");
33
+ }
34
+ return jsonReply({
35
+ score: result.score,
36
+ level: result.level,
37
+ components: result.components,
38
+ history30d: history,
39
+ note: "VIX 低・S&P 上・米10年上・DXY 下を「リスクオン寄り」とする素朴な合成。投資助言ではありません。",
40
+ });
41
+ }
42
+ catch (e) {
43
+ return errorReply(`温度計の計算に失敗しました: ${e instanceof Error ? e.message : "unknown"}`);
44
+ }
45
+ },
46
+ };
47
+ //# sourceMappingURL=get-market-thermometer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-market-thermometer.js","sourceRoot":"","sources":["../../src/tools/get-market-thermometer.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oDAAoD;AAEpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,wBAAwB,GAAiB;IACpD,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,yBAAyB;IAChC,WAAW,EACT,gJAAgJ;IAClJ,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;YACvC,wCAAwC;YACxC,MAAM,OAAO,CAAC,GAAG,CACf,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC;oBAAE,OAAO;gBAC/B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,CAAC;oBACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;wBAAE,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,UAAU,CACf,uDAAuD,CACxD,CAAC;YACJ,CAAC;YACD,OAAO,SAAS,CAAC;gBACf,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,OAAO;gBACnB,IAAI,EAAE,wDAAwD;aAC/D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,UAAU,CACf,kBAAkB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const getPerformanceRankingTool: LitForgeTool;
@@ -0,0 +1,75 @@
1
+ // 28 銘柄を 1d / 1w / 1m パフォーマンスでソートしたランキングを返す。
2
+ // 1w / 1m は 1y 履歴データを取得して PERFORMANCE_SYMBOLS の 7 銘柄について計算。
3
+ import { z } from "zod";
4
+ import { fetchHistorical, fetchSnapshot } from "../lib/yahoo.js";
5
+ import { INDICATORS } from "../lib/indicators.js";
6
+ import { rankByPerformance } from "../lib/rankings.js";
7
+ import { computePerformance, PERFORMANCE_SYMBOLS } from "../lib/performance.js";
8
+ import { errorReply, jsonReply } from "./types.js";
9
+ const inputSchema = {
10
+ period: z
11
+ .enum(["1d", "1w", "1m"])
12
+ .default("1d")
13
+ .describe("ソート期間。1d=当日前日比、1w=直近5営業日、1m=直近21営業日"),
14
+ topN: z
15
+ .number()
16
+ .int()
17
+ .min(1)
18
+ .max(10)
19
+ .default(5)
20
+ .describe("上位/下位 N 件を返す(デフォルト 5)"),
21
+ };
22
+ export const getPerformanceRankingTool = {
23
+ name: "get_performance_ranking",
24
+ title: "28 銘柄のパフォーマンスランキング",
25
+ description: "28 銘柄(為替・株・金利・コモディティ・暗号資産)を指定期間のパフォーマンス降順で並べ、上位 N と下位 N を返します。1w/1m は主要 7 銘柄(USD/JPY・S&P 500・NASDAQ・NY ダウ・米10年金利・VIX・DXY)のみ対応。投資推奨ではなく数値ソートのみ。",
26
+ inputSchema,
27
+ handler: async (args) => {
28
+ const period = args.period ?? "1d";
29
+ const topN = args.topN ?? 5;
30
+ try {
31
+ const snapshot = await fetchSnapshot();
32
+ // 1w / 1m の場合は performance フィールドを履歴から計算して埋める
33
+ if (period !== "1d") {
34
+ await Promise.all(PERFORMANCE_SYMBOLS.map(async (s) => {
35
+ const q = snapshot.quotes[s];
36
+ if (!q || "error" in q)
37
+ return;
38
+ try {
39
+ const closes = await fetchHistorical(s);
40
+ if (closes.length > 0) {
41
+ q.closes1y = closes;
42
+ q.performance = computePerformance(closes);
43
+ }
44
+ }
45
+ catch {
46
+ // best-effort
47
+ }
48
+ }));
49
+ }
50
+ const ranked = rankByPerformance(INDICATORS, snapshot.quotes, period);
51
+ return jsonReply({
52
+ period,
53
+ total: ranked.length,
54
+ top: ranked.slice(0, topN).map((r) => ({
55
+ symbol: r.indicator.symbol,
56
+ displayName: r.indicator.displayName,
57
+ changePercent: r.pct,
58
+ })),
59
+ bottom: ranked
60
+ .slice(-topN)
61
+ .reverse()
62
+ .map((r) => ({
63
+ symbol: r.indicator.symbol,
64
+ displayName: r.indicator.displayName,
65
+ changePercent: r.pct,
66
+ })),
67
+ note: "パフォーマンス順は数値ソートのみ。順位は投資判断の根拠ではありません。",
68
+ });
69
+ }
70
+ catch (e) {
71
+ return errorReply(`ランキング計算に失敗しました: ${e instanceof Error ? e.message : "unknown"}`);
72
+ }
73
+ },
74
+ };
75
+ //# sourceMappingURL=get-performance-ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-performance-ranking.js","sourceRoot":"","sources":["../../src/tools/get-performance-ranking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const getSectorHeatmapTool: LitForgeTool;
@@ -0,0 +1,34 @@
1
+ // 米株セクター ETF(SPDR、11 銘柄)の前日比ヒートマップを返す。
2
+ // AI が「今日はテクノロジーが強い」「金融は弱い」のようなセクターローテーション情報を取得可能に。
3
+ import { fetchSubsetSnapshot } from "../lib/yahoo.js";
4
+ import { SECTOR_ETFS, SECTOR_SYMBOLS } from "../lib/sectors.js";
5
+ import { errorReply, jsonReply } from "./types.js";
6
+ export const getSectorHeatmapTool = {
7
+ name: "get_sector_heatmap",
8
+ title: "米株セクター ETF 前日比ヒートマップ(SPDR、11 セクター)",
9
+ description: "米株セクター ETF(テクノロジー XLK / 金融 XLF / ヘルスケア XLV / 一般消費財 XLY / 生活必需品 XLP / エネルギー XLE / 資本財 XLI / 公益 XLU / 素材 XLB / 不動産 XLRE / 通信 XLC)の現在値と前日比を一括取得。米株市場のセクターローテーションを把握する情報源。",
10
+ inputSchema: {},
11
+ handler: async () => {
12
+ try {
13
+ const quotes = await fetchSubsetSnapshot(SECTOR_SYMBOLS);
14
+ const sectors = SECTOR_ETFS.map((s) => {
15
+ const q = quotes[s.symbol];
16
+ return {
17
+ symbol: s.symbol,
18
+ name: s.name,
19
+ description: s.description,
20
+ quote: q,
21
+ };
22
+ });
23
+ return jsonReply({
24
+ fetchedAt: new Date().toISOString(),
25
+ sectors,
26
+ note: "Yahoo Finance より取得(約 1 時間遅れ)。投資推奨ではありません。",
27
+ });
28
+ }
29
+ catch (e) {
30
+ return errorReply(`セクター取得に失敗しました: ${e instanceof Error ? e.message : "unknown"}`);
31
+ }
32
+ },
33
+ };
34
+ //# sourceMappingURL=get-sector-heatmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-sector-heatmap.js","sourceRoot":"","sources":["../../src/tools/get-sector-heatmap.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,oDAAoD;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,oCAAoC;IAC3C,WAAW,EACT,wKAAwK;IAC1K,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACpC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3B,OAAO;oBACL,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,KAAK,EAAE,CAAC;iBACT,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,OAAO;gBACP,IAAI,EAAE,2CAA2C;aAClD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,UAAU,CACf,kBAAkB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const getYieldSpreadTool: LitForgeTool;
@@ -0,0 +1,41 @@
1
+ // 米10年-5年イールドスプレッド(^TNX - ^FVX)を返す。
2
+ // 順イールドの傾き、フラット化、逆イールドの判定を AI に渡せる事実情報として提供。
3
+ import { fetchQuoteForIndicator } from "../lib/yahoo.js";
4
+ import { computeYieldSpread } from "../lib/yield-spread.js";
5
+ import { INDICATORS } from "../lib/indicators.js";
6
+ import { errorReply, jsonReply } from "./types.js";
7
+ export const getYieldSpreadTool = {
8
+ name: "get_yield_spread",
9
+ title: "米イールドスプレッド(10y-5y)",
10
+ description: "米10年債利回り(^TNX)と米5年債利回り(^FVX)の差(イールドスプレッド)を返します。プラスは順イールド、マイナスは逆イールド。前日比 bp も含む。投資判断の参考情報。",
11
+ inputSchema: {},
12
+ handler: async () => {
13
+ try {
14
+ const tnx = INDICATORS.find((i) => i.symbol === "^TNX");
15
+ const fvx = INDICATORS.find((i) => i.symbol === "^FVX");
16
+ const [tnxRes, fvxRes] = await Promise.all([
17
+ fetchQuoteForIndicator(tnx),
18
+ fetchQuoteForIndicator(fvx),
19
+ ]);
20
+ const snapshot = {
21
+ fetchedAt: new Date().toISOString(),
22
+ quotes: { "^TNX": tnxRes, "^FVX": fvxRes },
23
+ };
24
+ const spread = computeYieldSpread(snapshot);
25
+ if (!spread) {
26
+ return errorReply("米10年金利または米5年金利の取得に失敗しました。");
27
+ }
28
+ return jsonReply({
29
+ spread: spread.spread,
30
+ spreadChangeBp: spread.spreadChangeBp,
31
+ tnx: tnxRes,
32
+ fvx: fvxRes,
33
+ note: "プラスは順イールド、マイナスは逆イールド。投資推奨ではなく参考情報。",
34
+ });
35
+ }
36
+ catch (e) {
37
+ return errorReply(`イールドスプレッド計算に失敗しました: ${e instanceof Error ? e.message : "unknown"}`);
38
+ }
39
+ },
40
+ };
41
+ //# sourceMappingURL=get-yield-spread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-yield-spread.js","sourceRoot":"","sources":["../../src/tools/get-yield-spread.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,6CAA6C;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,CAAC,MAAM,kBAAkB,GAAiB;IAC9C,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EACT,2FAA2F;IAC7F,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAE,CAAC;YACzD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAE,CAAC;YACzD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACzC,sBAAsB,CAAC,GAAG,CAAC;gBAC3B,sBAAsB,CAAC,GAAG,CAAC;aAC5B,CAAC,CAAC;YACH,MAAM,QAAQ,GAAa;gBACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;aAC3C,CAAC;YACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,UAAU,CACf,2BAA2B,CAC5B,CAAC;YACJ,CAAC;YACD,OAAO,SAAS,CAAC;gBACf,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,GAAG,EAAE,MAAM;gBACX,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,oCAAoC;aAC3C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,UAAU,CACf,uBAAuB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -4,6 +4,8 @@
4
4
  // つみたて NISA・iDeCo を中心とした資産形成プランナー系 4 ツールに刷新。
5
5
  // v0.3.0 で「毎朝の市況チェック」系 3 ツール(市況スナップショット・経済イベント・任意ティッカー取得)を追加。
6
6
  // 初の HTTP fetch 導入(Yahoo Finance)— ローカル PC からインターネットに出ます。
7
+ // v0.4.0 で 5 ツール追加(温度計・ランキング・イールドスプレッド・市場時間・セクターヒートマップ)。
8
+ // 銘柄数 9 → 28 に拡大。
7
9
  import { simulateNisaTool } from "./simulate-nisa.js";
8
10
  import { planRetirementTool } from "./plan-retirement.js";
9
11
  import { calculateRequiredMonthlyTool } from "./calculate-required-monthly.js";
@@ -11,6 +13,11 @@ import { calculateCompoundInterestTool } from "./calculate-compound-interest.js"
11
13
  import { getMarketSnapshotTool } from "./get-market-snapshot.js";
12
14
  import { getEconomicEventsTodayTool } from "./get-economic-events.js";
13
15
  import { getQuoteTool } from "./get-quote.js";
16
+ import { getMarketThermometerTool } from "./get-market-thermometer.js";
17
+ import { getPerformanceRankingTool } from "./get-performance-ranking.js";
18
+ import { getYieldSpreadTool } from "./get-yield-spread.js";
19
+ import { getMarketSessionsTool } from "./get-market-sessions.js";
20
+ import { getSectorHeatmapTool } from "./get-sector-heatmap.js";
14
21
  export const tools = [
15
22
  simulateNisaTool,
16
23
  planRetirementTool,
@@ -19,5 +26,11 @@ export const tools = [
19
26
  getMarketSnapshotTool,
20
27
  getEconomicEventsTodayTool,
21
28
  getQuoteTool,
29
+ // v0.4.0 新規ツール
30
+ getMarketThermometerTool,
31
+ getPerformanceRankingTool,
32
+ getYieldSpreadTool,
33
+ getMarketSessionsTool,
34
+ getSectorHeatmapTool,
22
35
  ];
23
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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"}
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;AAC1D,yDAAyD;AACzD,kBAAkB;AAElB,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;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,4BAA4B;IAC5B,6BAA6B;IAC7B,qBAAqB;IACrB,0BAA0B;IAC1B,YAAY;IACZ,eAAe;IACf,wBAAwB;IACxB,yBAAyB;IACzB,kBAAkB;IAClB,qBAAqB;IACrB,oBAAoB;CACrB,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "lit-forge-mcp",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "mcpName": "io.github.noblabs/lit-forge-mcp",
5
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
- "homepage": "https://lit-forge.com",
8
+ "homepage": "https://github.com/noblabs/lit-forge-mcp",
9
9
  "repository": {
10
10
  "type": "git",
11
11
  "url": "git+https://github.com/noblabs/lit-forge-mcp.git"
@@ -41,6 +41,8 @@
41
41
  "build": "tsc && chmod 755 dist/index.js",
42
42
  "start": "node dist/index.js",
43
43
  "dev": "tsc --watch",
44
+ "test": "vitest run",
45
+ "test:watch": "vitest",
44
46
  "prepare": "npm run build"
45
47
  },
46
48
  "dependencies": {
@@ -49,7 +51,8 @@
49
51
  },
50
52
  "devDependencies": {
51
53
  "@types/node": "^22.0.0",
52
- "typescript": "^5.6.0"
54
+ "typescript": "^5.6.0",
55
+ "vitest": "^4.1.0"
53
56
  },
54
57
  "engines": {
55
58
  "node": ">=18"