lit-forge-mcp 0.2.0 → 0.4.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 +33 -4
- package/dist/index.js +1 -1
- package/dist/lib/__tests__/correlation.test.d.ts +1 -0
- package/dist/lib/__tests__/correlation.test.js +53 -0
- package/dist/lib/__tests__/correlation.test.js.map +1 -0
- package/dist/lib/__tests__/quartile.test.d.ts +1 -0
- package/dist/lib/__tests__/quartile.test.js +148 -0
- package/dist/lib/__tests__/quartile.test.js.map +1 -0
- package/dist/lib/__tests__/rankings.test.d.ts +1 -0
- package/dist/lib/__tests__/rankings.test.js +67 -0
- package/dist/lib/__tests__/rankings.test.js.map +1 -0
- package/dist/lib/__tests__/sessions.test.d.ts +1 -0
- package/dist/lib/__tests__/sessions.test.js +47 -0
- package/dist/lib/__tests__/sessions.test.js.map +1 -0
- package/dist/lib/__tests__/sma.test.d.ts +1 -0
- package/dist/lib/__tests__/sma.test.js +26 -0
- package/dist/lib/__tests__/sma.test.js.map +1 -0
- package/dist/lib/__tests__/thermometer.test.d.ts +1 -0
- package/dist/lib/__tests__/thermometer.test.js +120 -0
- package/dist/lib/__tests__/thermometer.test.js.map +1 -0
- package/dist/lib/__tests__/yield-spread.test.d.ts +1 -0
- package/dist/lib/__tests__/yield-spread.test.js +46 -0
- package/dist/lib/__tests__/yield-spread.test.js.map +1 -0
- package/dist/lib/correlation.d.ts +3 -0
- package/dist/lib/correlation.js +77 -0
- package/dist/lib/correlation.js.map +1 -0
- 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/fangplus.d.ts +7 -0
- package/dist/lib/fangplus.js +19 -0
- package/dist/lib/fangplus.js.map +1 -0
- package/dist/lib/indicators.d.ts +3 -0
- package/dist/lib/indicators.js +49 -0
- package/dist/lib/indicators.js.map +1 -0
- package/dist/lib/mag7.d.ts +7 -0
- package/dist/lib/mag7.js +13 -0
- package/dist/lib/mag7.js.map +1 -0
- package/dist/lib/market-types.d.ts +57 -0
- package/dist/lib/market-types.js +5 -0
- package/dist/lib/market-types.js.map +1 -0
- package/dist/lib/performance.d.ts +3 -0
- package/dist/lib/performance.js +43 -0
- package/dist/lib/performance.js.map +1 -0
- package/dist/lib/quartile.d.ts +24 -0
- package/dist/lib/quartile.js +128 -0
- package/dist/lib/quartile.js.map +1 -0
- package/dist/lib/rankings.d.ts +7 -0
- package/dist/lib/rankings.js +29 -0
- package/dist/lib/rankings.js.map +1 -0
- package/dist/lib/sectors.d.ts +7 -0
- package/dist/lib/sectors.js +62 -0
- package/dist/lib/sectors.js.map +1 -0
- package/dist/lib/sessions.d.ts +14 -0
- package/dist/lib/sessions.js +50 -0
- package/dist/lib/sessions.js.map +1 -0
- package/dist/lib/sma.d.ts +2 -0
- package/dist/lib/sma.js +33 -0
- package/dist/lib/sma.js.map +1 -0
- package/dist/lib/thermometer.d.ts +13 -0
- package/dist/lib/thermometer.js +118 -0
- package/dist/lib/thermometer.js.map +1 -0
- package/dist/lib/yahoo.d.ts +11 -0
- package/dist/lib/yahoo.js +171 -0
- package/dist/lib/yahoo.js.map +1 -0
- package/dist/lib/yield-spread.d.ts +6 -0
- package/dist/lib/yield-spread.js +20 -0
- package/dist/lib/yield-spread.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-sessions.d.ts +2 -0
- package/dist/tools/get-market-sessions.js +27 -0
- package/dist/tools/get-market-sessions.js.map +1 -0
- package/dist/tools/get-market-snapshot.d.ts +2 -0
- package/dist/tools/get-market-snapshot.js +29 -0
- package/dist/tools/get-market-snapshot.js.map +1 -0
- package/dist/tools/get-market-thermometer.d.ts +2 -0
- package/dist/tools/get-market-thermometer.js +47 -0
- package/dist/tools/get-market-thermometer.js.map +1 -0
- package/dist/tools/get-performance-ranking.d.ts +2 -0
- package/dist/tools/get-performance-ranking.js +75 -0
- package/dist/tools/get-performance-ranking.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/get-sector-heatmap.d.ts +2 -0
- package/dist/tools/get-sector-heatmap.js +34 -0
- package/dist/tools/get-sector-heatmap.js.map +1 -0
- package/dist/tools/get-yield-spread.d.ts +2 -0
- package/dist/tools/get-yield-spread.js +41 -0
- package/dist/tools/get-yield-spread.js.map +1 -0
- package/dist/tools/index.js +21 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +10 -3
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Yahoo Finance v8 chart API ラッパー(MCP server 用)。
|
|
2
|
+
// Web 側の app/lib/market/yahoo.ts と同期管理。
|
|
3
|
+
// Node 18+ の global fetch を使用、依存追加なし。
|
|
4
|
+
// v0.4 で Snapshot を Record<symbol, QuoteResult> 型に変更し、52w 高安・当日高安・出来高・
|
|
5
|
+
// 1y close 配列(fetchHistorical)を取得できるよう拡張。
|
|
6
|
+
import { INDICATORS } from "./indicators.js";
|
|
7
|
+
const UA = "Mozilla/5.0 (compatible; lit-forge-mcp/0.4; +https://lit-forge.com/)";
|
|
8
|
+
const TIMEOUT_MS = 4000;
|
|
9
|
+
export class YahooFinanceError extends Error {
|
|
10
|
+
symbol;
|
|
11
|
+
status;
|
|
12
|
+
constructor(symbol, status, message) {
|
|
13
|
+
super(message ?? `Yahoo Finance API ${symbol}: HTTP ${status}`);
|
|
14
|
+
this.symbol = symbol;
|
|
15
|
+
this.status = status;
|
|
16
|
+
this.name = "YahooFinanceError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function fetchRaw(symbol) {
|
|
20
|
+
const url = `https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(symbol)}` +
|
|
21
|
+
`?range=1d&interval=15m`;
|
|
22
|
+
let res;
|
|
23
|
+
try {
|
|
24
|
+
res = await fetch(url, {
|
|
25
|
+
headers: { "User-Agent": UA, Accept: "application/json" },
|
|
26
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
const msg = e instanceof Error ? e.message : "fetch failed";
|
|
31
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol}: ${msg}`);
|
|
32
|
+
}
|
|
33
|
+
if (!res.ok)
|
|
34
|
+
throw new YahooFinanceError(symbol, res.status);
|
|
35
|
+
const data = (await res.json());
|
|
36
|
+
const result = data.chart.result?.[0];
|
|
37
|
+
if (!result) {
|
|
38
|
+
const desc = data.chart.error?.description ?? "empty result";
|
|
39
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol}: ${desc}`);
|
|
40
|
+
}
|
|
41
|
+
const meta = result.meta;
|
|
42
|
+
const price = meta.regularMarketPrice;
|
|
43
|
+
const previousClose = meta.chartPreviousClose ?? meta.previousClose;
|
|
44
|
+
if (typeof price !== "number" || typeof previousClose !== "number") {
|
|
45
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol}: missing price/previousClose`);
|
|
46
|
+
}
|
|
47
|
+
const change = price - previousClose;
|
|
48
|
+
const changePercent = previousClose !== 0 ? (change / previousClose) * 100 : 0;
|
|
49
|
+
const changeBp = change * 100;
|
|
50
|
+
const fetchedAt = new Date(meta.regularMarketTime ? meta.regularMarketTime * 1000 : Date.now()).toISOString();
|
|
51
|
+
const sparkline = (result.indicators.quote?.[0]?.close ?? []).filter((v) => typeof v === "number");
|
|
52
|
+
return {
|
|
53
|
+
symbol,
|
|
54
|
+
displayName: symbol,
|
|
55
|
+
category: "fx",
|
|
56
|
+
unit: "",
|
|
57
|
+
price,
|
|
58
|
+
previousClose,
|
|
59
|
+
change,
|
|
60
|
+
changePercent,
|
|
61
|
+
changeBp,
|
|
62
|
+
fetchedAt,
|
|
63
|
+
sparkline,
|
|
64
|
+
fiftyTwoWeekHigh: typeof meta.fiftyTwoWeekHigh === "number" ? meta.fiftyTwoWeekHigh : undefined,
|
|
65
|
+
fiftyTwoWeekLow: typeof meta.fiftyTwoWeekLow === "number" ? meta.fiftyTwoWeekLow : undefined,
|
|
66
|
+
dayHigh: typeof meta.regularMarketDayHigh === "number"
|
|
67
|
+
? meta.regularMarketDayHigh
|
|
68
|
+
: undefined,
|
|
69
|
+
dayLow: typeof meta.regularMarketDayLow === "number"
|
|
70
|
+
? meta.regularMarketDayLow
|
|
71
|
+
: undefined,
|
|
72
|
+
volume: typeof meta.regularMarketVolume === "number"
|
|
73
|
+
? meta.regularMarketVolume
|
|
74
|
+
: undefined,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// 任意 ticker の 1y 日足 close 配列を取得(PERFORMANCE_SYMBOLS 等の分析用)。
|
|
78
|
+
export async function fetchHistorical(symbol) {
|
|
79
|
+
const url = `https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(symbol)}` +
|
|
80
|
+
`?range=1y&interval=1d`;
|
|
81
|
+
let res;
|
|
82
|
+
try {
|
|
83
|
+
res = await fetch(url, {
|
|
84
|
+
headers: { "User-Agent": UA, Accept: "application/json" },
|
|
85
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
const msg = e instanceof Error ? e.message : "fetch failed";
|
|
90
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol} (hist): ${msg}`);
|
|
91
|
+
}
|
|
92
|
+
if (!res.ok)
|
|
93
|
+
throw new YahooFinanceError(symbol, res.status);
|
|
94
|
+
const data = (await res.json());
|
|
95
|
+
const result = data.chart.result?.[0];
|
|
96
|
+
if (!result) {
|
|
97
|
+
const desc = data.chart.error?.description ?? "empty result";
|
|
98
|
+
throw new YahooFinanceError(symbol, 0, `Yahoo Finance ${symbol} (hist): ${desc}`);
|
|
99
|
+
}
|
|
100
|
+
return (result.indicators.quote?.[0]?.close ?? []).filter((v) => typeof v === "number");
|
|
101
|
+
}
|
|
102
|
+
// indicator のメタ(displayName / category / unit)を Quote に上書き。
|
|
103
|
+
function applyMeta(quote, indicator) {
|
|
104
|
+
return {
|
|
105
|
+
...quote,
|
|
106
|
+
displayName: indicator.displayName,
|
|
107
|
+
category: indicator.category,
|
|
108
|
+
unit: indicator.unit,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// indicator から fetch、失敗時は fallback を試す。
|
|
112
|
+
export async function fetchQuoteForIndicator(indicator) {
|
|
113
|
+
try {
|
|
114
|
+
const quote = await fetchRaw(indicator.symbol);
|
|
115
|
+
return applyMeta(quote, indicator);
|
|
116
|
+
}
|
|
117
|
+
catch (primaryErr) {
|
|
118
|
+
if (!indicator.fallback) {
|
|
119
|
+
const m = primaryErr instanceof Error ? primaryErr.message : "unknown";
|
|
120
|
+
return { error: m };
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const quote = await fetchRaw(indicator.fallback);
|
|
124
|
+
return applyMeta(quote, indicator);
|
|
125
|
+
}
|
|
126
|
+
catch (fallbackErr) {
|
|
127
|
+
const m1 = primaryErr instanceof Error ? primaryErr.message : "primary";
|
|
128
|
+
const m2 = fallbackErr instanceof Error ? fallbackErr.message : "fallback";
|
|
129
|
+
return { error: `${m1} / ${m2}` };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 任意の symbol を 1 件取得(get_quote ツール用)。
|
|
134
|
+
export async function fetchQuoteBySymbol(symbol) {
|
|
135
|
+
return fetchRaw(symbol);
|
|
136
|
+
}
|
|
137
|
+
// 全 INDICATORS(28 銘柄)を並列取得して Snapshot を返す。
|
|
138
|
+
// quotes は Record<symbol, QuoteResult>。Web 側と同型。
|
|
139
|
+
export async function fetchSnapshot() {
|
|
140
|
+
const settled = await Promise.allSettled(INDICATORS.map(async (ind) => [ind.symbol, await fetchQuoteForIndicator(ind)]));
|
|
141
|
+
const quotes = {};
|
|
142
|
+
for (const r of settled) {
|
|
143
|
+
if (r.status === "fulfilled") {
|
|
144
|
+
const [symbol, q] = r.value;
|
|
145
|
+
quotes[symbol] = q;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { fetchedAt: new Date().toISOString(), quotes };
|
|
149
|
+
}
|
|
150
|
+
// 任意 symbol リストを並列取得(sectors / mag7 / fangplus 等のサブセット用)。
|
|
151
|
+
export async function fetchSubsetSnapshot(symbols) {
|
|
152
|
+
const settled = await Promise.allSettled(symbols.map(async (s) => {
|
|
153
|
+
try {
|
|
154
|
+
const quote = await fetchRaw(s);
|
|
155
|
+
return [s, quote];
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const m = err instanceof Error ? err.message : "fetch failed";
|
|
159
|
+
return [s, { error: m }];
|
|
160
|
+
}
|
|
161
|
+
}));
|
|
162
|
+
const out = {};
|
|
163
|
+
for (const r of settled) {
|
|
164
|
+
if (r.status === "fulfilled") {
|
|
165
|
+
const [symbol, q] = r.value;
|
|
166
|
+
out[symbol] = q;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return out;
|
|
170
|
+
}
|
|
171
|
+
//# 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,20 @@
|
|
|
1
|
+
// 米イールドカーブの傾き(^TNX - ^FVX)を計算する純関数。
|
|
2
|
+
// 「今日のテーマ」やヘッダー脇のコンパクト表示で「米10y-5y スプレッド」を出すために使う。
|
|
3
|
+
//
|
|
4
|
+
// スプレッドは bp(ベーシスポイント、1bp = 0.01%)。プラスは順イールド(10y > 5y)。
|
|
5
|
+
function getQuote(snapshot, symbol) {
|
|
6
|
+
const q = snapshot.quotes[symbol];
|
|
7
|
+
if (!q || "error" in q)
|
|
8
|
+
return null;
|
|
9
|
+
return q;
|
|
10
|
+
}
|
|
11
|
+
export function computeYieldSpread(snapshot) {
|
|
12
|
+
const tnx = getQuote(snapshot, "^TNX");
|
|
13
|
+
const fvx = getQuote(snapshot, "^FVX");
|
|
14
|
+
if (!tnx || !fvx)
|
|
15
|
+
return null;
|
|
16
|
+
const spread = tnx.price - fvx.price;
|
|
17
|
+
const spreadChange = (tnx.change ?? 0) - (fvx.change ?? 0);
|
|
18
|
+
return { spread, spreadChangeBp: spreadChange * 100 };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=yield-spread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yield-spread.js","sourceRoot":"","sources":["../../src/lib/yield-spread.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kDAAkD;AAClD,EAAE;AACF,uDAAuD;AAWvD,SAAS,QAAQ,CAAC,QAAkB,EAAE,MAAc;IAClD,MAAM,CAAC,GAA4B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACrC,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,GAAG,GAAG,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -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
|
+
// 主要市場(東京・上海・ロンドン・NY)の現在の取引時間ステータスを返す。
|
|
2
|
+
// AI が「今は NY が動いている時間」「東京はもうすぐオープン」のような時間軸の context を取れる。
|
|
3
|
+
import { getSessionStatuses } from "../lib/sessions.js";
|
|
4
|
+
import { jsonReply } from "./types.js";
|
|
5
|
+
export const getMarketSessionsTool = {
|
|
6
|
+
name: "get_market_sessions",
|
|
7
|
+
title: "主要市場の取引時間ステータス",
|
|
8
|
+
description: "東京(9:00-15:30 JST)/ 上海(10:30-16:00 JST)/ ロンドン(17:00-25:30 JST)/ NY(22:30-29:00 JST)の現在の取引時間ステータス(open / pre-open / closed)を返します。土日は全て closed。サマータイムや臨時休場は未対応の概算。",
|
|
9
|
+
inputSchema: {},
|
|
10
|
+
handler: async () => {
|
|
11
|
+
const statuses = getSessionStatuses();
|
|
12
|
+
return jsonReply({
|
|
13
|
+
now: new Date().toISOString(),
|
|
14
|
+
sessions: statuses.map((s) => ({
|
|
15
|
+
id: s.session.id,
|
|
16
|
+
label: s.session.label,
|
|
17
|
+
state: s.state,
|
|
18
|
+
openHourJst: s.session.openHourJst,
|
|
19
|
+
closeHourJst: s.session.closeHourJst,
|
|
20
|
+
hoursUntilOpen: s.hoursUntilOpen,
|
|
21
|
+
hoursUntilClose: s.hoursUntilClose,
|
|
22
|
+
})),
|
|
23
|
+
note: "通常営業時間ベースの概算。祝日・臨時休場は反映されません。",
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=get-market-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-market-sessions.js","sourceRoot":"","sources":["../../src/tools/get-market-sessions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,0DAA0D;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAE1D,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,gBAAgB;IACvB,WAAW,EACT,kKAAkK;IACpK,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;YACf,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC7B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE;gBAChB,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK;gBACtB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW;gBAClC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY;gBACpC,cAAc,EAAE,CAAC,CAAC,cAAc;gBAChC,eAAe,EAAE,CAAC,CAAC,eAAe;aACnC,CAAC,CAAC;YACH,IAAI,EAAE,+BAA+B;SACtC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// 主要マクロ指標 28 銘柄(為替・株・金利・コモディティ・暗号資産)の現在値・前日比を一括取得。
|
|
2
|
+
// /today ページと同等情報を Claude Desktop / Cursor から呼べる。
|
|
3
|
+
// v0.4 で 9 → 28 銘柄に拡張、出力形式は Record<symbol, QuoteResult>。
|
|
4
|
+
import { fetchSnapshot } from "../lib/yahoo.js";
|
|
5
|
+
import { errorReply, jsonReply } from "./types.js";
|
|
6
|
+
export const getMarketSnapshotTool = {
|
|
7
|
+
name: "get_market_snapshot",
|
|
8
|
+
title: "主要マクロ指標スナップショット",
|
|
9
|
+
description: "USD/JPY・EUR/JPY・GBP/JPY・AUD/JPY・EUR/USD・CHF/JPY・ドル指数・日経平均・TOPIX・NY ダウ・S&P 500・NASDAQ・VIX・NYSE FANG+・SOX・DAX・FTSE・上海総合・ハンセン・KOSPI・SENSEX・米10年/5年金利・金・原油・銅・ビットコイン・イーサリアム の主要 28 指標の現在値と前日比を Yahoo Finance から取得します。lit-forge.com/today と同等の情報。約 1 時間遅れの参考値で、投資助言ではありません。",
|
|
10
|
+
inputSchema: {},
|
|
11
|
+
handler: async () => {
|
|
12
|
+
try {
|
|
13
|
+
const snapshot = await fetchSnapshot();
|
|
14
|
+
const entries = Object.entries(snapshot.quotes);
|
|
15
|
+
const successCount = entries.filter(([, q]) => !("error" in q)).length;
|
|
16
|
+
return jsonReply({
|
|
17
|
+
fetchedAt: snapshot.fetchedAt,
|
|
18
|
+
successCount,
|
|
19
|
+
totalCount: entries.length,
|
|
20
|
+
quotes: snapshot.quotes,
|
|
21
|
+
note: "データは Yahoo Finance より取得(約 1 時間遅れ)。投資助言ではなく情報集約。",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
return errorReply(`Yahoo Finance API への接続に失敗しました: ${e instanceof Error ? e.message : "unknown"}`);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
//# 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,mDAAmD;AACnD,kDAAkD;AAClD,yDAAyD;AAEzD,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,uQAAuQ;IACzQ,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAC3B,CAAC,MAAM,CAAC;YACT,OAAO,SAAS,CAAC;gBACf,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,YAAY;gBACZ,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,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,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,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,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"}
|
|
@@ -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,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"}
|