lit-forge-mcp 0.7.1 → 0.9.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 (33) hide show
  1. package/README.md +12 -5
  2. package/dist/index.js +1 -1
  3. package/dist/lib/__tests__/economic-events.test.js +17 -4
  4. package/dist/lib/__tests__/economic-events.test.js.map +1 -1
  5. package/dist/lib/__tests__/geopolitical-events.test.d.ts +1 -0
  6. package/dist/lib/__tests__/geopolitical-events.test.js +288 -0
  7. package/dist/lib/__tests__/geopolitical-events.test.js.map +1 -0
  8. package/dist/lib/__tests__/geopolitical-pulse.test.d.ts +1 -0
  9. package/dist/lib/__tests__/geopolitical-pulse.test.js +215 -0
  10. package/dist/lib/__tests__/geopolitical-pulse.test.js.map +1 -0
  11. package/dist/lib/economic-events.js +3 -2
  12. package/dist/lib/economic-events.js.map +1 -1
  13. package/dist/lib/geopolitical-events.d.ts +11 -0
  14. package/dist/lib/geopolitical-events.js +92 -0
  15. package/dist/lib/geopolitical-events.js.map +1 -0
  16. package/dist/lib/geopolitical-pulse.d.ts +49 -0
  17. package/dist/lib/geopolitical-pulse.js +251 -0
  18. package/dist/lib/geopolitical-pulse.js.map +1 -0
  19. package/dist/lib/market-types.d.ts +23 -0
  20. package/dist/tools/get-economic-events.js +8 -3
  21. package/dist/tools/get-economic-events.js.map +1 -1
  22. package/dist/tools/get-geopolitical-calendar.d.ts +2 -0
  23. package/dist/tools/get-geopolitical-calendar.js +79 -0
  24. package/dist/tools/get-geopolitical-calendar.js.map +1 -0
  25. package/dist/tools/get-geopolitical-events.d.ts +2 -0
  26. package/dist/tools/get-geopolitical-events.js +76 -0
  27. package/dist/tools/get-geopolitical-events.js.map +1 -0
  28. package/dist/tools/get-geopolitical-pulse.d.ts +2 -0
  29. package/dist/tools/get-geopolitical-pulse.js +67 -0
  30. package/dist/tools/get-geopolitical-pulse.js.map +1 -0
  31. package/dist/tools/index.js +8 -0
  32. package/dist/tools/index.js.map +1 -1
  33. package/package.json +3 -2
@@ -0,0 +1,251 @@
1
+ // 地政学リアルタイム速報(v0.9.0 新設)。
2
+ // 主要通信社の RSS フィードを並列取得・dedupe・時刻ソートして返す。
3
+ // 客観性の基盤: 「主要通信社が編集判断のうえ配信した記事」のメタデータ。
4
+ // 主観的な解釈(marketImplications 等)はツール側では付与せず、LLM の責務とする。
5
+ //
6
+ // PoC 結果(scripts/rss-poc.mjs):
7
+ // - BBC World / Al Jazeera / Google News topic-search が認証不要・無料・低レイテンシで動作
8
+ // - Reuters / AP / NHK の RSS は仕様変更で 404(採用見送り)
9
+ // - 並列フェッチでも RSS 側のレート制限は問題にならない
10
+ export const PULSE_TOPIC_LABEL = {
11
+ "us-china": "米中(首脳会談・貿易・関税・台湾)",
12
+ "middle-east": "中東(イラン・ホルムズ・イスラエル・ガザ)",
13
+ ukraine: "ウクライナ・ロシア(和平・侵攻・支援・制裁)",
14
+ japan: "日本外交(要人訪問・首脳会談)",
15
+ global: "地政学全般",
16
+ };
17
+ // トピック別キーワード(BBC / Al Jazeera のフィード内キーワード絞り込み + Google News 検索クエリ)。
18
+ // OR を効かせるため小文字化済みの単語配列で保持。
19
+ // 注意: "trump" のような単語は単独で米国内ニュースを大量に拾うため、地理/topic 特定語を採用する。
20
+ const TOPIC_KEYWORDS = {
21
+ "us-china": ["china", "chinese", "xi jinping", "beijing", "taiwan", "tariff", "trade war"],
22
+ "middle-east": ["iran", "hormuz", "israel", "gaza", "hezbollah", "tehran", "middle east"],
23
+ ukraine: ["ukraine", "ukrainian", "russia", "russian", "kyiv", "moscow", "putin", "zelensky"],
24
+ // 首相名は寿命が短いので「現職 + 直近の前任 2-3 名」を保持。新総理就任時は更新する。
25
+ // 2026-05 時点の現職: 高市早苗(takaichi)
26
+ japan: ["japan", "japanese", "tokyo", "takaichi", "ishiba", "kishida"],
27
+ global: [], // 全件通す(global は dedupe + 時刻ソート + maxItems カット)
28
+ };
29
+ // Google News のトピック検索クエリ(URL エンコード前)。
30
+ const TOPIC_GOOGLE_QUERY = {
31
+ "us-china": "Trump Xi China summit OR tariff OR trade",
32
+ "middle-east": "Iran OR Israel OR Gaza OR Hormuz",
33
+ ukraine: "Ukraine OR Russia ceasefire OR peace OR invasion",
34
+ japan: "Japan diplomatic OR prime minister OR summit",
35
+ global: "geopolitics OR diplomatic crisis",
36
+ };
37
+ const UA = "Mozilla/5.0 (compatible; lit-forge-mcp/0.9; +https://github.com/noblabs/lit-forge-mcp)";
38
+ const FETCH_TIMEOUT_MS = 10_000;
39
+ const FEEDS = [
40
+ {
41
+ key: "bbc-world",
42
+ label: "BBC World",
43
+ buildUrl: () => "https://feeds.bbci.co.uk/news/world/rss.xml",
44
+ keywordFilter: true,
45
+ },
46
+ {
47
+ key: "aljazeera",
48
+ label: "Al Jazeera English",
49
+ buildUrl: () => "https://www.aljazeera.com/xml/rss/all.xml",
50
+ keywordFilter: true,
51
+ },
52
+ {
53
+ key: "google-news",
54
+ label: "Google News",
55
+ buildUrl: (topic) => {
56
+ const q = encodeURIComponent(TOPIC_GOOGLE_QUERY[topic]);
57
+ return `https://news.google.com/rss/search?q=${q}&hl=en-US&gl=US&ceid=US:en`;
58
+ },
59
+ keywordFilter: false, // Google News は検索クエリで既に絞られている
60
+ },
61
+ ];
62
+ // 1 フィード分の RSS をフェッチ → パース → 記事配列に変換。
63
+ export async function fetchFeed(feed, topic) {
64
+ const t0 = Date.now();
65
+ const url = feed.buildUrl(topic);
66
+ try {
67
+ const res = await fetch(url, {
68
+ headers: {
69
+ "User-Agent": UA,
70
+ Accept: "application/rss+xml, application/xml, text/xml, */*",
71
+ },
72
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
73
+ redirect: "follow",
74
+ });
75
+ if (!res.ok) {
76
+ return {
77
+ result: {
78
+ key: feed.key,
79
+ label: feed.label,
80
+ ok: false,
81
+ count: 0,
82
+ error: `HTTP ${res.status}`,
83
+ elapsedMs: Date.now() - t0,
84
+ },
85
+ articles: [],
86
+ };
87
+ }
88
+ const xml = await res.text();
89
+ const articles = parseRss(xml, feed.label);
90
+ const filtered = feed.keywordFilter && topic !== "global"
91
+ ? articles.filter((a) => matchesTopicKeywords(a, topic))
92
+ : articles;
93
+ return {
94
+ result: {
95
+ key: feed.key,
96
+ label: feed.label,
97
+ ok: true,
98
+ count: filtered.length,
99
+ elapsedMs: Date.now() - t0,
100
+ },
101
+ articles: filtered,
102
+ };
103
+ }
104
+ catch (e) {
105
+ const msg = e instanceof Error ? e.message : "fetch failed";
106
+ return {
107
+ result: {
108
+ key: feed.key,
109
+ label: feed.label,
110
+ ok: false,
111
+ count: 0,
112
+ error: msg,
113
+ elapsedMs: Date.now() - t0,
114
+ },
115
+ articles: [],
116
+ };
117
+ }
118
+ }
119
+ // RSS 2.0 / Atom の <item> または <entry> を抽出する最小パーサー。
120
+ // 依存追加を避けるため正規表現ベース(依存追加してもよくなったら fast-xml-parser に切り替え)。
121
+ export function parseRss(xml, source) {
122
+ const out = [];
123
+ const itemRe = /<(item|entry)\b[^>]*>([\s\S]*?)<\/\1>/g;
124
+ let m;
125
+ while ((m = itemRe.exec(xml)) !== null) {
126
+ const body = m[2];
127
+ const title = extractTag(body, "title");
128
+ const link = extractTag(body, "link") ?? extractLinkHref(body);
129
+ const rawDate = extractTag(body, "pubDate") ||
130
+ extractTag(body, "updated") ||
131
+ extractTag(body, "published");
132
+ const description = extractTag(body, "description") || extractTag(body, "summary");
133
+ if (!title || !link)
134
+ continue;
135
+ out.push({
136
+ title: cleanText(title),
137
+ url: cleanText(link),
138
+ publishedAt: normalizeDate(rawDate),
139
+ source,
140
+ description: description ? cleanText(description).slice(0, 300) : undefined,
141
+ });
142
+ }
143
+ return out;
144
+ }
145
+ function extractTag(body, tag) {
146
+ const re = new RegExp(`<${tag}\\b[^>]*>([\\s\\S]*?)<\\/${tag}>`);
147
+ const mm = body.match(re);
148
+ return mm ? mm[1] : null;
149
+ }
150
+ // Atom 形式の <link href="..."/> 対応。
151
+ function extractLinkHref(body) {
152
+ const mm = body.match(/<link\b[^>]*\bhref="([^"]+)"/);
153
+ return mm ? mm[1] : null;
154
+ }
155
+ function cleanText(s) {
156
+ return s
157
+ .replace(/^\s*<!\[CDATA\[/, "")
158
+ .replace(/\]\]>\s*$/, "")
159
+ .replace(/<[^>]+>/g, "")
160
+ .replace(/&amp;/g, "&")
161
+ .replace(/&lt;/g, "<")
162
+ .replace(/&gt;/g, ">")
163
+ .replace(/&quot;/g, '"')
164
+ .replace(/&#39;/g, "'")
165
+ .replace(/&nbsp;/g, " ")
166
+ .trim();
167
+ }
168
+ // pubDate 文字列を ISO 8601 に正規化。失敗時は null。
169
+ export function normalizeDate(raw) {
170
+ if (!raw)
171
+ return null;
172
+ const cleaned = cleanText(raw);
173
+ const t = Date.parse(cleaned);
174
+ if (Number.isNaN(t))
175
+ return null;
176
+ return new Date(t).toISOString();
177
+ }
178
+ // タイトルからトピックキーワード一致を判定(小文字部分一致 OR)。
179
+ export function matchesTopicKeywords(article, topic) {
180
+ const keywords = TOPIC_KEYWORDS[topic];
181
+ if (keywords.length === 0)
182
+ return true;
183
+ const haystack = (article.title + " " + (article.description ?? "")).toLowerCase();
184
+ return keywords.some((kw) => haystack.includes(kw));
185
+ }
186
+ // タイトルの正規化キー(小文字 + 記号除去 + 先頭 60 文字)で重複判定。
187
+ export function articleDedupeKey(article) {
188
+ return article.title
189
+ .toLowerCase()
190
+ .replace(/[^\p{L}\p{N}\s]/gu, "")
191
+ .replace(/\s+/g, " ")
192
+ .trim()
193
+ .slice(0, 60);
194
+ }
195
+ // 配列を dedupe(先勝ち)。
196
+ export function dedupeArticles(articles) {
197
+ const seen = new Set();
198
+ const out = [];
199
+ for (const a of articles) {
200
+ const k = articleDedupeKey(a);
201
+ if (!k || seen.has(k))
202
+ continue;
203
+ seen.add(k);
204
+ out.push(a);
205
+ }
206
+ return out;
207
+ }
208
+ // hoursBack より古い記事を除外。publishedAt が null の記事は通す(不明 = 新しい可能性)。
209
+ export function filterByRecency(articles, hoursBack, now = new Date()) {
210
+ const cutoff = now.getTime() - hoursBack * 3600 * 1000;
211
+ return articles.filter((a) => {
212
+ if (!a.publishedAt)
213
+ return true;
214
+ const t = Date.parse(a.publishedAt);
215
+ return Number.isNaN(t) ? true : t >= cutoff;
216
+ });
217
+ }
218
+ // 新しい順にソート。publishedAt が null の記事は末尾に。
219
+ export function sortByDateDesc(articles) {
220
+ return [...articles].sort((a, b) => {
221
+ const ta = a.publishedAt ? Date.parse(a.publishedAt) : -Infinity;
222
+ const tb = b.publishedAt ? Date.parse(b.publishedAt) : -Infinity;
223
+ return tb - ta;
224
+ });
225
+ }
226
+ // メイン: 全フィード並列取得 → 統合 → dedupe → recency フィルタ → ソート → maxItems カット。
227
+ export async function fetchPulse(opts) {
228
+ const settled = await Promise.all(FEEDS.map((f) => fetchFeed(f, opts.topic)));
229
+ const allArticles = settled.flatMap((s) => s.articles);
230
+ const sources = settled.map((s) => s.result);
231
+ const deduped = dedupeArticles(allArticles);
232
+ const recent = filterByRecency(deduped, opts.hoursBack);
233
+ const sorted = sortByDateDesc(recent);
234
+ const truncated = sorted.length > opts.maxItems;
235
+ const articles = sorted.slice(0, opts.maxItems);
236
+ return {
237
+ topic: opts.topic,
238
+ topicLabel: PULSE_TOPIC_LABEL[opts.topic],
239
+ fetchedAt: new Date().toISOString(),
240
+ sources,
241
+ articles,
242
+ truncated,
243
+ };
244
+ }
245
+ // MCP CallToolResult 用のシリアライズヘルパー(types.ts に依存させたくないので分離)。
246
+ export function toCallToolResult(payload) {
247
+ return {
248
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
249
+ };
250
+ }
251
+ //# sourceMappingURL=geopolitical-pulse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geopolitical-pulse.js","sourceRoot":"","sources":["../../src/lib/geopolitical-pulse.ts"],"names":[],"mappings":"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"}
@@ -90,3 +90,26 @@ export type EconomicEvent = {
90
90
  actual?: string;
91
91
  previous?: string;
92
92
  };
93
+ export type GeopoliticalSubcategory = "summit" | "bilateral" | "election" | "risk";
94
+ export type GeopoliticalSourceTier = "official-jp" | "official-intl" | "private";
95
+ export type GeopoliticalEvent = {
96
+ id: string;
97
+ date: string;
98
+ endDate?: string;
99
+ time?: string;
100
+ country: Country;
101
+ name: string;
102
+ subcategory: GeopoliticalSubcategory;
103
+ importance: EventImportance;
104
+ participants?: readonly string[];
105
+ marketImplications?: {
106
+ fx?: string;
107
+ equity?: string;
108
+ bond?: string;
109
+ commodity?: string;
110
+ };
111
+ source: GeopoliticalSourceTier;
112
+ sourceUrl: string;
113
+ lastVerifiedAt: string;
114
+ note?: string;
115
+ };
@@ -22,14 +22,16 @@ const inputSchema = {
22
22
  export const getEconomicEventsTodayTool = {
23
23
  name: "get_economic_events_today",
24
24
  title: "本日・今週の経済イベント",
25
- description: "本日(または今週)の主要経済イベント(FOMC・日銀金融政策決定会合・米雇用統計・CPI・GDP・中国 PMI などのマクロ指標、要人訪問・首脳会談などの地政学日程)を返します。期間イベント(訪日・サミット等)は期間中の各日に today クエリでヒットします。データは lit-forge 運営者が手動キュレーションした半年分のスケジュール。" +
26
- "【利用上の注意】既定 range=today は当日分のみを返すため、ユーザーの質問が『明日』『今週』『週末』『次の指標』など今日を超える時間軸を含むときは range=\"week\" を明示すること。直前に today で取得済みでも、未来の時間軸が話題に出た時点で week で取り直す。",
25
+ description: "本日(または今週)の主要経済イベント(FOMC・日銀金融政策決定会合・米雇用統計・CPI・GDP・中国 PMI などのマクロ指標)を返します。期間イベント(ジャクソンホール会議等)は期間中の各日に today クエリでヒットします。データは lit-forge 運営者が手動キュレーションした半年分のスケジュール。" +
26
+ "【利用上の注意】既定 range=today は当日分のみを返すため、ユーザーの質問が『明日』『今週』『週末』『次の指標』など今日を超える時間軸を含むときは range=\"week\" を明示すること。直前に today で取得済みでも、未来の時間軸が話題に出た時点で week で取り直す。" +
27
+ "【v0.9.0 以降】首脳会談・要人訪問・国際サミット・主要国選挙・地政学リスクの 4 サブカテゴリは `get_geopolitical_calendar`(確定スケジュール)に、進行中の地政学情勢は `get_geopolitical_pulse`(リアルタイム速報)に分離されました。地政学情報が必要なときはそれらを使用してください。本ツールの category=\"geopolitical\" 引数は後方互換のため残されていますが、結果は空に近くなります。",
27
28
  inputSchema,
28
29
  handler: ({ range, minImportance, category }) => {
29
30
  const today = jstDateKey();
30
31
  const events = range === "week" ? getEventsForWeek(today) : getEventsForDate(today);
31
32
  const byImportance = filterByImportance(events, minImportance ?? 1);
32
33
  const filtered = filterByCategory(byImportance, category);
34
+ const requestedGeopolitical = category?.includes("geopolitical") ?? false;
33
35
  return jsonReply({
34
36
  today,
35
37
  range: range ?? "today",
@@ -45,7 +47,10 @@ export const getEconomicEventsTodayTool = {
45
47
  category: e.category ?? "macro",
46
48
  note: e.note,
47
49
  })),
48
- note: "経済イベントは半年に 1 回手動更新。急な発表変更や中銀緊急会合は反映されない場合があります。",
50
+ note: "経済イベントは半年に 1 回手動更新。急な発表変更や中銀緊急会合は反映されない場合があります。" +
51
+ (requestedGeopolitical
52
+ ? " ※ 地政学イベントは v0.9.0 で `get_geopolitical_calendar`(確定スケジュール)+ `get_geopolitical_pulse`(リアルタイム速報)に分離されました。詳細はそちらをご利用ください。"
53
+ : ""),
49
54
  });
50
55
  },
51
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"get-economic-events.js","sourceRoot":"","sources":["../../src/tools/get-economic-events.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,qDAAqD;AACrD,wCAAwC;AAExC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,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,CACP,2CAA2C;QACzC,+DAA+D,CAClE;IACH,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;IACvD,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;SAClD,QAAQ,EAAE;SACV,QAAQ,CACP,gFAAgF,CACjF;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAiB;IACtD,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,cAAc;IACrB,WAAW,EACT,8KAA8K;QAC9K,qJAAqJ;IACvJ,WAAW;IACX,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC9C,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,YAAY,GAAG,kBAAkB,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC1D,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,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,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,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,OAAO;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;YACH,IAAI,EACF,iDAAiD;SACpD,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"get-economic-events.js","sourceRoot":"","sources":["../../src/tools/get-economic-events.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,qDAAqD;AACrD,wCAAwC;AAExC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,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,CACP,2CAA2C;QACzC,+DAA+D,CAClE;IACH,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;IACvD,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;SAClD,QAAQ,EAAE;SACV,QAAQ,CACP,gFAAgF,CACjF;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAiB;IACtD,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,cAAc;IACrB,WAAW,EACT,+JAA+J;QAC/J,qJAAqJ;QACrJ,2OAA2O;IAC7O,WAAW;IACX,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC9C,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,YAAY,GAAG,kBAAkB,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,qBAAqB,GAAG,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;QAC1E,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,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,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,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,OAAO;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;YACH,IAAI,EACF,iDAAiD;gBACjD,CAAC,qBAAqB;oBACpB,CAAC,CAAC,wHAAwH;oBAC1H,CAAC,CAAC,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const getGeopoliticalCalendarTool: LitForgeTool;
@@ -0,0 +1,79 @@
1
+ // 地政学カレンダー(v0.9.0 で get_geopolitical_events からリネーム)。
2
+ // **確定済み公式スケジュール専用**: 首脳会談・国際サミット・主要国選挙・公式リスク日程(制裁発動・条約期限など)。
3
+ // 進行中の地政学リスクや突発イベントは別ツール get_geopolitical_pulse で取得すること。
4
+ //
5
+ // データは手動キュレーション JSON(半年に 1 回 PR 更新)。
6
+ // 中立性ガイドライン: 確定済み公式日程のみ収録し、主観判断を要するイベント(紛争激化等)は登録しない。
7
+ import { z } from "zod";
8
+ import { COUNTRY_LABEL, jstDateKey } from "../lib/economic-events.js";
9
+ import { LAST_UPDATED_GEOPOLITICAL, SOURCE_LABEL, SUBCATEGORY_LABEL, filterByCountry, filterByImportanceGeo, filterBySubcategory, getGeopoliticalEventsForDate, getGeopoliticalEventsForMonth, getGeopoliticalEventsForWeek, } from "../lib/geopolitical-events.js";
10
+ import { IMPORTANCE_STARS } from "../lib/economic-events.js";
11
+ import { jsonReply } from "./types.js";
12
+ const inputSchema = {
13
+ range: z
14
+ .enum(["today", "week", "month"])
15
+ .optional()
16
+ .describe("期間: today=本日のみ / week=今日含む 7 日間 / month=今日含む 30 日間。既定 week(地政学は中期視点が要るため)。"),
17
+ subcategory: z
18
+ .array(z.enum(["summit", "bilateral", "election", "risk"]))
19
+ .optional()
20
+ .describe("サブカテゴリ絞り込み: summit=国際サミット・国際会議 / bilateral=首脳会談・要人訪問 / election=主要国選挙 / risk=確定済み地政学リスク(制裁・条約期限等)。未指定で全件"),
21
+ country: z
22
+ .array(z.enum(["JP", "US", "CN", "EU", "GB", "OTHER"]))
23
+ .optional()
24
+ .describe("国コード絞り込み: JP/US/CN/EU/GB/OTHER。複数指定可。未指定で全件"),
25
+ minImportance: z
26
+ .union([z.literal(1), z.literal(2), z.literal(3)])
27
+ .optional()
28
+ .describe("最低重要度フィルタ: 1=★以上 / 2=★★以上 / 3=★★★のみ。既定 1"),
29
+ };
30
+ export const getGeopoliticalCalendarTool = {
31
+ name: "get_geopolitical_calendar",
32
+ title: "地政学カレンダー(確定済み公式スケジュール: 首脳会談・サミット・選挙・公式リスク日程)",
33
+ description: "**確定済み公式スケジュール専用**ツール。首脳会談・要人訪問(bilateral)、G7/G20/IMF/APEC/BRICS/NATO 等の国際サミット(summit)、主要国の国政選挙(election)、公式の地政学リスク日程(制裁発動・条約期限など、risk)の 4 サブカテゴリを返します。各イベントには market implications(為替・株・債券・コモディティへの注目点)、参加者、一次ソース URL が付与されます。" +
34
+ "データは lit-forge 運営者が一次ソース(日本政府公式・国際機関公式・民間集計)から手動キュレーション。**半年に 1 回 PR 更新の静的データ**で、確定済み公式日程のみを収録します(主観判断要件のイベントは登録しない方針)。" +
35
+ "【重要】このツールは『カレンダー』であり、**進行中の地政学リスク(紛争激化・電撃会談・突発的な制裁・封鎖シナリオなど)を取りこぼします**。今この瞬間の地政学情勢を知りたいときは別ツール `get_geopolitical_pulse` を使ってください。" +
36
+ "【利用上の注意】既定 range=week。さらに先まで見たい場合は range=\"month\" を指定。マクロ経済イベント(CPI・FOMC・日銀会合等)は別ツール `get_economic_events_today` を使用。",
37
+ inputSchema,
38
+ handler: ({ range, subcategory, country, minImportance }) => {
39
+ const today = jstDateKey();
40
+ const effectiveRange = range ?? "week";
41
+ let events;
42
+ if (effectiveRange === "today") {
43
+ events = getGeopoliticalEventsForDate(today);
44
+ }
45
+ else if (effectiveRange === "month") {
46
+ events = getGeopoliticalEventsForMonth(today);
47
+ }
48
+ else {
49
+ events = getGeopoliticalEventsForWeek(today);
50
+ }
51
+ const byImportance = filterByImportanceGeo(events, minImportance ?? 1);
52
+ const bySubcategory = filterBySubcategory(byImportance, subcategory);
53
+ const filtered = filterByCountry(bySubcategory, country);
54
+ return jsonReply({
55
+ today,
56
+ range: effectiveRange,
57
+ lastUpdated: LAST_UPDATED_GEOPOLITICAL,
58
+ count: filtered.length,
59
+ events: filtered.map((e) => ({
60
+ id: e.id,
61
+ date: e.date,
62
+ endDate: e.endDate,
63
+ time: e.time ?? "終日",
64
+ country: COUNTRY_LABEL[e.country],
65
+ name: e.name,
66
+ subcategory: SUBCATEGORY_LABEL[e.subcategory],
67
+ importance: IMPORTANCE_STARS[e.importance],
68
+ participants: e.participants,
69
+ marketImplications: e.marketImplications,
70
+ source: SOURCE_LABEL[e.source],
71
+ sourceUrl: e.sourceUrl,
72
+ lastVerifiedAt: e.lastVerifiedAt,
73
+ note: e.note,
74
+ })),
75
+ note: "確定済み公式日程のみのカレンダーです。半年に 1 回 PR で更新するため、突発イベント(電撃会談・紛争激化・即時制裁など)は反映されません。リアルタイム情勢は get_geopolitical_pulse を併用してください。",
76
+ });
77
+ },
78
+ };
79
+ //# sourceMappingURL=get-geopolitical-calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-geopolitical-calendar.js","sourceRoot":"","sources":["../../src/tools/get-geopolitical-calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const getGeopoliticalEventsTool: LitForgeTool;
@@ -0,0 +1,76 @@
1
+ // 地政学イベント専用ツール(v0.8.0 新設)。
2
+ // 首脳会談・要人訪問・国際サミット・主要国選挙・確定済み地政学リスクを構造化して返す。
3
+ // 既存 get_economic_events_today の geopolitical カテゴリと並存(破壊的変更なし)し、
4
+ // 本ツールは marketImplications / participants / sourceUrl など地政学固有フィールドを伴う。
5
+ import { z } from "zod";
6
+ import { COUNTRY_LABEL, jstDateKey } from "../lib/economic-events.js";
7
+ import { LAST_UPDATED_GEOPOLITICAL, SOURCE_LABEL, SUBCATEGORY_LABEL, filterByCountry, filterByImportanceGeo, filterBySubcategory, getGeopoliticalEventsForDate, getGeopoliticalEventsForMonth, getGeopoliticalEventsForWeek, } from "../lib/geopolitical-events.js";
8
+ import { IMPORTANCE_STARS } from "../lib/economic-events.js";
9
+ import { jsonReply } from "./types.js";
10
+ const inputSchema = {
11
+ range: z
12
+ .enum(["today", "week", "month"])
13
+ .optional()
14
+ .describe("期間: today=本日のみ / week=今日含む 7 日間 / month=今日含む 30 日間。既定 week(地政学は中期視点が要るため)。"),
15
+ subcategory: z
16
+ .array(z.enum(["summit", "bilateral", "election", "risk"]))
17
+ .optional()
18
+ .describe("サブカテゴリ絞り込み: summit=国際サミット・国際会議 / bilateral=首脳会談・要人訪問 / election=主要国選挙 / risk=確定済み地政学リスク(制裁・条約期限等)。未指定で全件"),
19
+ country: z
20
+ .array(z.enum(["JP", "US", "CN", "EU", "GB", "OTHER"]))
21
+ .optional()
22
+ .describe("国コード絞り込み: JP/US/CN/EU/GB/OTHER。複数指定可。未指定で全件"),
23
+ minImportance: z
24
+ .union([z.literal(1), z.literal(2), z.literal(3)])
25
+ .optional()
26
+ .describe("最低重要度フィルタ: 1=★以上 / 2=★★以上 / 3=★★★のみ。既定 1"),
27
+ };
28
+ export const getGeopoliticalEventsTool = {
29
+ name: "get_geopolitical_events",
30
+ title: "地政学イベントカレンダー(首脳会談・サミット・選挙・リスク)",
31
+ description: "本日・今週・今月の地政学イベントを返します。首脳会談・要人訪問(bilateral)、G7/G20/IMF/APEC/BRICS/NATO 等の国際サミット(summit)、主要国の国政選挙(election)、確定済み公式の地政学リスク日程(制裁発動・条約期限など、risk)の 4 サブカテゴリで整理されています。各イベントには市場へのインプリケーション(marketImplications: 為替・株・債券・コモディティへの注目点)、参加者(participants)、一次ソース URL(sourceUrl)が付与されます。" +
32
+ "データは lit-forge 運営者が一次ソース(日本政府公式・国際機関公式・民間集計)から手動キュレーション。確定済み公式日程のみ収録し、主観判断を要するイベント(紛争激化等)は登録されません。" +
33
+ "【利用上の注意】既定 range=week。さらに先まで見たい場合は range=\"month\" を指定。マクロ経済イベント(CPI・FOMC・日銀会合等)は別ツール `get_economic_events_today` を使用。",
34
+ inputSchema,
35
+ handler: ({ range, subcategory, country, minImportance }) => {
36
+ const today = jstDateKey();
37
+ const effectiveRange = range ?? "week";
38
+ let events;
39
+ if (effectiveRange === "today") {
40
+ events = getGeopoliticalEventsForDate(today);
41
+ }
42
+ else if (effectiveRange === "month") {
43
+ events = getGeopoliticalEventsForMonth(today);
44
+ }
45
+ else {
46
+ events = getGeopoliticalEventsForWeek(today);
47
+ }
48
+ const byImportance = filterByImportanceGeo(events, minImportance ?? 1);
49
+ const bySubcategory = filterBySubcategory(byImportance, subcategory);
50
+ const filtered = filterByCountry(bySubcategory, country);
51
+ return jsonReply({
52
+ today,
53
+ range: effectiveRange,
54
+ lastUpdated: LAST_UPDATED_GEOPOLITICAL,
55
+ count: filtered.length,
56
+ events: filtered.map((e) => ({
57
+ id: e.id,
58
+ date: e.date,
59
+ endDate: e.endDate,
60
+ time: e.time ?? "終日",
61
+ country: COUNTRY_LABEL[e.country],
62
+ name: e.name,
63
+ subcategory: SUBCATEGORY_LABEL[e.subcategory],
64
+ importance: IMPORTANCE_STARS[e.importance],
65
+ participants: e.participants,
66
+ marketImplications: e.marketImplications,
67
+ source: SOURCE_LABEL[e.source],
68
+ sourceUrl: e.sourceUrl,
69
+ lastVerifiedAt: e.lastVerifiedAt,
70
+ note: e.note,
71
+ })),
72
+ note: "地政学イベントは確定済み公式日程のみ収録。半年に 1 回 PR で更新。急な日程変更や臨時会合は反映されない場合があります。",
73
+ });
74
+ },
75
+ };
76
+ //# sourceMappingURL=get-geopolitical-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-geopolitical-events.js","sourceRoot":"","sources":["../../src/tools/get-geopolitical-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const getGeopoliticalPulseTool: LitForgeTool;
@@ -0,0 +1,67 @@
1
+ // 地政学リアルタイム速報ツール(v0.9.0 新設)。
2
+ // 設計詳細は docs/geopolitical-realtime.md 参照。
3
+ //
4
+ // 役割分担:
5
+ // - 本ツール: 主要通信社の RSS を集約し、客観的なメタデータ(タイトル・配信元・配信日時・URL)を返す
6
+ // - 解釈: LLM 側の責務(marketImplications 等の主観判断はツールに含めない)
7
+ // - get_geopolitical_calendar: 確定済み公式スケジュール(半年に 1 回 PR 更新の静的データ)
8
+ import { z } from "zod";
9
+ import { PULSE_TOPIC_LABEL, fetchPulse, } from "../lib/geopolitical-pulse.js";
10
+ import { jsonReply } from "./types.js";
11
+ const inputSchema = {
12
+ topic: z
13
+ .enum(["us-china", "middle-east", "ukraine", "japan", "global"])
14
+ .optional()
15
+ .describe("トピック: us-china=米中(首脳会談・貿易・関税・台湾) / middle-east=中東(イラン・ホルムズ・イスラエル・ガザ) / ukraine=ウクライナ・ロシア(和平・侵攻・支援・制裁) / japan=日本外交 / global=地政学全般。既定 global"),
16
+ maxItems: z
17
+ .number()
18
+ .int()
19
+ .min(5)
20
+ .max(30)
21
+ .optional()
22
+ .describe("返す最大記事数。5-30、既定 15"),
23
+ hoursBack: z
24
+ .number()
25
+ .int()
26
+ .min(6)
27
+ .max(48)
28
+ .optional()
29
+ .describe("これより古い記事は除外する時間ウィンドウ(時間)。6-48、既定 24"),
30
+ };
31
+ export const getGeopoliticalPulseTool = {
32
+ name: "get_geopolitical_pulse",
33
+ title: "地政学リアルタイム速報(主要通信社 RSS 集約)",
34
+ description: "**今この瞬間の地政学情勢**を返すツール。BBC World・Al Jazeera・Google News(トピック検索)の RSS を並列取得し、dedupe + 配信日時降順で記事メタデータを返します。" +
35
+ "用途: 進行中の地政学リスク(電撃首脳会談・紛争激化・制裁発動・封鎖シナリオ等)の把握。市況サマリーで『地政学イベント』を尋ねられたときは、確定済み公式日程の `get_geopolitical_calendar` と本ツールを併用してください。" +
36
+ "【ツール設計上の重要事項】" +
37
+ "返却される各記事は客観的メタデータ(タイトル・配信元・配信日時・URL・配信元の短い summary)のみで、market implications などの**主観的な解釈はツール側で付与しません**。市場への影響評価・解釈は呼び出し側 LLM の責務です。" +
38
+ "客観性の根拠: 「主要通信社が編集判断のうえ配信した記事」のメタデータを基盤とすることで、データ収録者の主観バイアスを排除しています。" +
39
+ "【利用上の注意】" +
40
+ "通信社 RSS は通常 5-30 分以内に最新ニュースが反映されます。フィード単位での失敗は sources 配列に error として記載され、他フィードの結果は返されます(部分成功)。" +
41
+ "情報源は英語フィードが中心です。日本固有の地政学情報は不足する可能性があります(v0.10 以降で日本語フィード追加検討)。",
42
+ inputSchema,
43
+ handler: async ({ topic, maxItems, hoursBack }) => {
44
+ const effectiveTopic = (topic ?? "global");
45
+ const effectiveMax = maxItems ?? 15;
46
+ const effectiveHours = hoursBack ?? 24;
47
+ const result = await fetchPulse({
48
+ topic: effectiveTopic,
49
+ maxItems: effectiveMax,
50
+ hoursBack: effectiveHours,
51
+ });
52
+ return jsonReply({
53
+ topic: result.topic,
54
+ topicLabel: PULSE_TOPIC_LABEL[effectiveTopic],
55
+ fetchedAt: result.fetchedAt,
56
+ hoursBack: effectiveHours,
57
+ maxItems: effectiveMax,
58
+ truncated: result.truncated,
59
+ count: result.articles.length,
60
+ articles: result.articles,
61
+ sources: result.sources,
62
+ note: "RSS ベースの編集済みニュース見出し集約です。各記事の市場インプリケーションは付与していません(解釈は呼び出し側 LLM の責務)。" +
63
+ " 確定済み公式日程(首脳会談・選挙・サミット等)は別ツール `get_geopolitical_calendar` を使用してください。",
64
+ });
65
+ },
66
+ };
67
+ //# sourceMappingURL=get-geopolitical-pulse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-geopolitical-pulse.js","sourceRoot":"","sources":["../../src/tools/get-geopolitical-pulse.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,0CAA0C;AAC1C,EAAE;AACF,QAAQ;AACR,4DAA4D;AAC5D,uDAAuD;AACvD,mEAAmE;AAEnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EAEjB,UAAU,GACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;SAC/D,QAAQ,EAAE;SACV,QAAQ,CACP,6IAA6I,CAC9I;IACH,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,oBAAoB,CAAC;IACjC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,qCAAqC,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAiB;IACpD,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,2BAA2B;IAClC,WAAW,EACT,0GAA0G;QAC1G,6HAA6H;QAC7H,eAAe;QACf,mIAAmI;QACnI,qEAAqE;QACrE,UAAU;QACV,gGAAgG;QAChG,gEAAgE;IAClE,WAAW;IACX,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QAChD,MAAM,cAAc,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAe,CAAC;QACzD,MAAM,YAAY,GAAG,QAAQ,IAAI,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,SAAS,IAAI,EAAE,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC;YAC7C,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,cAAc;YACzB,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EACF,qEAAqE;gBACrE,sEAAsE;SACzE,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -7,6 +7,9 @@
7
7
  // v0.4.0 で 5 ツール追加(温度計・ランキング・イールドスプレッド・市場時間・セクターヒートマップ)。
8
8
  // 銘柄数 9 → 28 に拡大。
9
9
  // v0.6.0 で 2 ツール追加(配当履歴・アナリストコンセンサス)+ get_quote にファンダメンタル指標オプション。
10
+ // v0.8.0 で地政学イベント専用ツール get_geopolitical_events を追加(首脳会談・サミット・選挙・地政学リスクの 4 サブカテゴリ)。
11
+ // v0.9.0 で地政学ツールを 2 系統に分離: get_geopolitical_calendar(確定スケジュール、旧 events からリネーム)+ get_geopolitical_pulse(リアルタイム速報、RSS アグリゲーション)。
12
+ // 設計詳細は docs/geopolitical-realtime.md 参照。
10
13
  import { simulateNisaTool } from "./simulate-nisa.js";
11
14
  import { planRetirementTool } from "./plan-retirement.js";
12
15
  import { calculateRequiredMonthlyTool } from "./calculate-required-monthly.js";
@@ -21,6 +24,8 @@ import { getMarketSessionsTool } from "./get-market-sessions.js";
21
24
  import { getSectorHeatmapTool } from "./get-sector-heatmap.js";
22
25
  import { getDividendHistoryTool } from "./get-dividend-history.js";
23
26
  import { getAnalystConsensusTool } from "./get-analyst-consensus.js";
27
+ import { getGeopoliticalCalendarTool } from "./get-geopolitical-calendar.js";
28
+ import { getGeopoliticalPulseTool } from "./get-geopolitical-pulse.js";
24
29
  export const tools = [
25
30
  simulateNisaTool,
26
31
  planRetirementTool,
@@ -38,5 +43,8 @@ export const tools = [
38
43
  // v0.6.0 新規ツール
39
44
  getDividendHistoryTool,
40
45
  getAnalystConsensusTool,
46
+ // v0.9.0 新規 / リネーム: 地政学カレンダー(旧 get_geopolitical_events)+ リアルタイム速報
47
+ getGeopoliticalCalendarTool,
48
+ getGeopoliticalPulseTool,
41
49
  ];
42
50
  //# sourceMappingURL=index.js.map