lit-forge-mcp 0.12.0 → 0.13.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 CHANGED
@@ -10,7 +10,7 @@ Claude Desktop / Claude Code / Cursor など、MCP に対応した任意の AI
10
10
 
11
11
  > **v0.2.0 で「金融・個人投資家特化」にピボット**、**v0.3.0 で「毎朝の市況チェック」系 3 ツールを追加**、**v0.4.0 で銘柄数 9 → 28 に拡大 + 5 つの分析ツール追加**、**v0.6.0 で配当履歴・アナリストコンセンサス・ファンダメンタル指標を追加**、**v0.7.0 で経済イベントに地政学カテゴリ(要人訪問・首脳会談)と複数日イベント(endDate)対応を追加**、**v0.8.0 で地政学イベント専用ツール `get_geopolitical_events` を新設**(首脳会談・国際サミット・主要国選挙・地政学リスクの 4 サブカテゴリを market implications 付きで返す + 一次ソース突合の verify インフラ整備)、**v0.9.0 で地政学ツールを 2 系統に分離・リアルタイム化**: 旧 `get_geopolitical_events` を `get_geopolitical_calendar` にリネーム(用途を確定スケジュール専用に明確化)、新ツール `get_geopolitical_pulse` を追加(BBC World / Al Jazeera / Google News の主要通信社 RSS を集約し、進行中の地政学リスク・突発イベントをリアルタイムで返す)しました。
12
12
 
13
- ## 提供ツール(16 種)
13
+ ## 提供ツール(17 種)
14
14
 
15
15
  ### 個人資産形成プランナー(純関数、外部 API 不要)
16
16
 
@@ -48,6 +48,12 @@ Claude Desktop / Claude Code / Cursor など、MCP に対応した任意の AI
48
48
  | `get_dividend_history` | 個別株・ETF の過去 N 年の配当履歴と暦年合計を取得(`years`: 1/3/5/10、既定 5)。NISA 成長投資枠で配当銘柄を検討する一次情報として使用 |
49
49
  | `get_analyst_consensus` | 個別株のアナリスト推奨レーティング(強気買い〜強気売り)・目標株価(平均/高値/安値)・月別推奨内訳を取得。米国株は coverage が厚く、TSE 銘柄や ETF は欠損しやすい |
50
50
 
51
+ ### 米マクロ最新値(v0.13.0 新規)
52
+
53
+ | ツール名 | 説明 |
54
+ |---|---|
55
+ | `get_us_macro_latest` | **米マクロ三大指標**(雇用統計・CPI・PPI)+ 失業率の最新発表値と前月比・前年同月比を BLS Public Data API v2 から取得(API key 不要・無認証)。`get_economic_release_pulse` が答える「次にいつ発表されるか」に対し、本ツールは「今の数字はいくつか」を答える |
56
+
51
57
  > ⚠ **HTTP 通信について**: 市況・分析・個別株系ツールは **Yahoo Finance API(query1.finance.yahoo.com / query2.finance.yahoo.com)** へ HTTPS リクエストを送信します。実行 PC のネットワークから外部に出る通信が発生する点にご留意ください。データは約 1 時間遅れの参考値で、**投資助言ではなく情報集約**として提供しています。
52
58
  >
53
59
  > v0.6.0 で `get_quote includeFundamentals=true` / `get_dividend_history` / `get_analyst_consensus` の 3 ルートが Yahoo Finance v10 quoteSummary(crumb 認証あり)を経由するため、`yahoo-finance2` パッケージを依存に追加しました。
@@ -113,7 +119,7 @@ echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":
113
119
  {"jsonrpc":"2.0","id":2,"method":"tools/list"}' | node dist/index.js
114
120
  ```
115
121
 
116
- `tools/list` のレスポンスに 15 ツールが並べば成功です。
122
+ `tools/list` のレスポンスに 17 ツールが並べば成功です。
117
123
 
118
124
  ## 使用例
119
125
 
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,166 @@
1
+ // us-macro-latest の純粋関数テスト。
2
+ // ネットワーク fetch は実 API に依存するため対象外。summarizeSeries の
3
+ // 正規化・前月比・前年比計算ロジックのみ検証する。
4
+ import { describe, it, expect } from "vitest";
5
+ import { summarizeSeries } from "../us-macro-latest.js";
6
+ const NFP_DEF = {
7
+ id: "CES0000000001",
8
+ key: "nonfarmPayrolls",
9
+ displayName: "米 雇用統計(非農業部門就業者数)",
10
+ unit: "千人",
11
+ };
12
+ const UR_DEF = {
13
+ id: "LNS14000000",
14
+ key: "unemploymentRate",
15
+ displayName: "米 失業率",
16
+ unit: "%",
17
+ };
18
+ const CPI_DEF = {
19
+ id: "CUUR0000SA0",
20
+ key: "cpi",
21
+ displayName: "米 CPI(都市部全消費者、1982-84=100)",
22
+ unit: "index",
23
+ };
24
+ // 雇用統計の data 例(新しい→古い順)。実 API レスポンスを模した最小サンプル。
25
+ const NFP_DATA = [
26
+ {
27
+ year: "2026",
28
+ period: "M04",
29
+ periodName: "April",
30
+ value: "158736",
31
+ latest: "true",
32
+ footnotes: [{ code: "P", text: "preliminary" }],
33
+ },
34
+ { year: "2026", period: "M03", periodName: "March", value: "158621", footnotes: [{}] },
35
+ { year: "2026", period: "M02", periodName: "February", value: "158436", footnotes: [{}] },
36
+ { year: "2026", period: "M01", periodName: "January", value: "158592", footnotes: [{}] },
37
+ { year: "2025", period: "M12", periodName: "December", value: "158432", footnotes: [{}] },
38
+ { year: "2025", period: "M04", periodName: "April", value: "158485", footnotes: [{}] },
39
+ ];
40
+ describe("summarizeSeries (雇用統計)", () => {
41
+ const r = summarizeSeries(NFP_DEF, NFP_DATA);
42
+ it("latest フラグの月を最新値として拾う", () => {
43
+ expect(r.latest.year).toBe(2026);
44
+ expect(r.latest.month).toBe(4);
45
+ expect(r.latest.value).toBe(158736);
46
+ });
47
+ it("preliminary フラグを保持する", () => {
48
+ expect(r.latest.preliminary).toBe(true);
49
+ });
50
+ it("前月差・前月比を正しく計算する", () => {
51
+ // 158736 - 158621 = 115、115 / 158621 ≈ 0.0725%
52
+ expect(r.monthOverMonth?.diff).toBe(115);
53
+ expect(r.monthOverMonth?.percent).toBeCloseTo(0.073, 2);
54
+ });
55
+ it("前年同月差・前年同月比を正しく計算する", () => {
56
+ // 158736 - 158485 = 251、251 / 158485 ≈ 0.158%
57
+ expect(r.yearOverYear?.diff).toBe(251);
58
+ expect(r.yearOverYear?.percent).toBeCloseTo(0.158, 2);
59
+ });
60
+ });
61
+ describe("summarizeSeries (1 月: 前月=前年 12 月)", () => {
62
+ const data = [
63
+ { year: "2026", period: "M01", periodName: "January", value: "158592", latest: "true" },
64
+ { year: "2025", period: "M12", periodName: "December", value: "158432" },
65
+ { year: "2025", period: "M01", periodName: "January", value: "158268" },
66
+ ];
67
+ const r = summarizeSeries(NFP_DEF, data);
68
+ it("前月は前年 12 月を参照する", () => {
69
+ expect(r.monthOverMonth?.diff).toBe(160);
70
+ });
71
+ it("前年同月は 2025-01 を参照する", () => {
72
+ expect(r.yearOverYear?.diff).toBe(324);
73
+ });
74
+ });
75
+ describe("summarizeSeries (失業率 %)", () => {
76
+ const data = [
77
+ { year: "2026", period: "M04", periodName: "April", value: "4.3", latest: "true" },
78
+ { year: "2026", period: "M03", periodName: "March", value: "4.3" },
79
+ { year: "2025", period: "M04", periodName: "April", value: "4.2" },
80
+ ];
81
+ const r = summarizeSeries(UR_DEF, data);
82
+ it("単位 % でも数値として扱える", () => {
83
+ expect(r.latest.value).toBe(4.3);
84
+ expect(r.monthOverMonth?.diff).toBe(0);
85
+ expect(r.yearOverYear?.diff).toBeCloseTo(0.1, 5);
86
+ });
87
+ });
88
+ describe("summarizeSeries (CPI index)", () => {
89
+ const data = [
90
+ { year: "2026", period: "M04", periodName: "April", value: "333.020", latest: "true" },
91
+ { year: "2026", period: "M03", periodName: "March", value: "332.100" },
92
+ { year: "2025", period: "M04", periodName: "April", value: "320.500" },
93
+ ];
94
+ const r = summarizeSeries(CPI_DEF, data);
95
+ it("3 桁 index 値を保持する", () => {
96
+ expect(r.latest.value).toBe(333.02);
97
+ });
98
+ it("前年同月比 % を正しく計算する", () => {
99
+ // (333.02 - 320.5) / 320.5 * 100 ≈ 3.906%
100
+ expect(r.yearOverYear?.percent).toBeCloseTo(3.906, 2);
101
+ });
102
+ });
103
+ describe("summarizeSeries (データ欠損)", () => {
104
+ it("value='-' の月は null として扱われ計算は最新値の比較相手として無視される", () => {
105
+ const data = [
106
+ { year: "2025", period: "M11", periodName: "November", value: "4.5", latest: "true" },
107
+ { year: "2025", period: "M10", periodName: "October", value: "-" }, // 政府閉鎖等で欠損
108
+ { year: "2024", period: "M11", periodName: "November", value: "4.1" },
109
+ ];
110
+ const r = summarizeSeries(UR_DEF, data);
111
+ expect(r.latest.value).toBe(4.5);
112
+ // 前月欠損なので monthOverMonth は diff=null・percent=null
113
+ expect(r.monthOverMonth?.diff).toBeNull();
114
+ expect(r.monthOverMonth?.percent).toBeNull();
115
+ // 前年同月はあるので yearOverYear は値が入る
116
+ expect(r.yearOverYear?.diff).toBeCloseTo(0.4, 5);
117
+ });
118
+ it("空 data でもエラーにならず空サマリを返す", () => {
119
+ const r = summarizeSeries(NFP_DEF, []);
120
+ expect(r.latest.value).toBeNull();
121
+ expect(r.latest.month).toBe(0);
122
+ expect(r.monthOverMonth).toBeUndefined();
123
+ expect(r.yearOverYear).toBeUndefined();
124
+ });
125
+ it("最新月の value が '-' でも latest 情報は維持する", () => {
126
+ const data = [
127
+ { year: "2026", period: "M04", periodName: "April", value: "-", latest: "true" },
128
+ ];
129
+ const r = summarizeSeries(NFP_DEF, data);
130
+ expect(r.latest.year).toBe(2026);
131
+ expect(r.latest.month).toBe(4);
132
+ expect(r.latest.value).toBeNull();
133
+ expect(r.monthOverMonth).toBeUndefined();
134
+ });
135
+ });
136
+ describe("summarizeSeries (年間平均 M13 等の除外)", () => {
137
+ it("M13(年間平均)レコードは除外され月次最新値を採用する", () => {
138
+ const data = [
139
+ // M13 が data 先頭に紛れていても latest フラグ付きの月次レコードを優先
140
+ { year: "2025", period: "M13", periodName: "Annual", value: "4.0" },
141
+ { year: "2026", period: "M04", periodName: "April", value: "4.3", latest: "true" },
142
+ { year: "2026", period: "M03", periodName: "March", value: "4.4" },
143
+ ];
144
+ const r = summarizeSeries(UR_DEF, data);
145
+ expect(r.latest.month).toBe(4);
146
+ expect(r.latest.value).toBe(4.3);
147
+ expect(r.monthOverMonth?.diff).toBeCloseTo(-0.1, 5);
148
+ });
149
+ });
150
+ describe("summarizeSeries (preliminary フラグ判定)", () => {
151
+ it("footnotes に code P が無ければ preliminary=false", () => {
152
+ const data = [
153
+ { year: "2026", period: "M03", periodName: "March", value: "158621", latest: "true", footnotes: [{}] },
154
+ ];
155
+ const r = summarizeSeries(NFP_DEF, data);
156
+ expect(r.latest.preliminary).toBe(false);
157
+ });
158
+ it("footnotes が undefined でも preliminary=false", () => {
159
+ const data = [
160
+ { year: "2026", period: "M03", periodName: "March", value: "158621", latest: "true" },
161
+ ];
162
+ const r = summarizeSeries(NFP_DEF, data);
163
+ expect(r.latest.preliminary).toBe(false);
164
+ });
165
+ });
166
+ //# sourceMappingURL=us-macro-latest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"us-macro-latest.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/us-macro-latest.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ type IndicatorKey = "nonfarmPayrolls" | "unemploymentRate" | "cpi" | "ppi";
2
+ type SeriesDef = {
3
+ id: string;
4
+ key: IndicatorKey;
5
+ displayName: string;
6
+ unit: string;
7
+ };
8
+ export type BlsSeriesDatum = {
9
+ year: string;
10
+ period: string;
11
+ periodName: string;
12
+ value: string;
13
+ latest?: string;
14
+ footnotes?: Array<{
15
+ code?: string;
16
+ text?: string;
17
+ }>;
18
+ };
19
+ export type IndicatorSummary = {
20
+ displayName: string;
21
+ unit: string;
22
+ latest: {
23
+ year: number;
24
+ month: number;
25
+ value: number | null;
26
+ preliminary: boolean;
27
+ };
28
+ monthOverMonth?: {
29
+ diff: number | null;
30
+ percent: number | null;
31
+ };
32
+ yearOverYear?: {
33
+ diff: number | null;
34
+ percent: number | null;
35
+ };
36
+ };
37
+ export type UsMacroLatest = {
38
+ fetchedAt: string;
39
+ source: string;
40
+ indicators: Record<IndicatorKey, IndicatorSummary>;
41
+ };
42
+ export declare function summarizeSeries(def: SeriesDef, data: BlsSeriesDatum[]): IndicatorSummary;
43
+ export declare function fetchUsMacroLatest(): Promise<UsMacroLatest>;
44
+ export {};
@@ -0,0 +1,159 @@
1
+ // 米マクロ最新値取得(v0.13.0 新設)。
2
+ // BLS(米労働統計局)の Public Data API v2 から雇用統計・失業率・CPI・PPI の
3
+ // 4 系列を 1 リクエストで取得し、最新月の値 + 前月差・前月比 + 前年同月差・前年同月比に
4
+ // 正規化して返す。
5
+ //
6
+ // 設計背景:
7
+ // - BLS の HTML schedule ページと RSS フィードは Akamai bot 管理で 403 され取得不能
8
+ // (ToS で「robots/bots は禁止」と公式表明)。
9
+ // - 一方、公開 API は無認証で 1 日 25 リクエストまで使え、bot 制限の対象外。
10
+ // - そのため「次回発表予定」自動取得は道がないが、「最新発表値」は API 経由で完全に取得可能。
11
+ // - 本モジュールは get_market_snapshot(市況値)のマクロ指標版という位置づけ。
12
+ // 発表予定日は get_economic_release_pulse / get_economic_events_today を併用すること。
13
+ //
14
+ // キャッシュ・UA・タイムアウトは economic-release-pulse の共有ユーティリティを再利用。
15
+ // 将来共通ライブラリへの昇格余地あり。
16
+ import { withCache, DEFAULT_CACHE_TTL_MS } from "./economic-release-pulse/cache.js";
17
+ import { RELEASE_PULSE_UA, RELEASE_PULSE_FETCH_TIMEOUT_MS, } from "./economic-release-pulse/util.js";
18
+ const BLS_API_URL = "https://api.bls.gov/publicAPI/v2/timeseries/data/";
19
+ const SERIES = [
20
+ {
21
+ id: "CES0000000001",
22
+ key: "nonfarmPayrolls",
23
+ displayName: "米 雇用統計(非農業部門就業者数)",
24
+ unit: "千人",
25
+ },
26
+ {
27
+ id: "LNS14000000",
28
+ key: "unemploymentRate",
29
+ displayName: "米 失業率",
30
+ unit: "%",
31
+ },
32
+ {
33
+ id: "CUUR0000SA0",
34
+ key: "cpi",
35
+ displayName: "米 CPI(都市部全消費者、1982-84=100)",
36
+ unit: "index",
37
+ },
38
+ {
39
+ id: "WPSFD4",
40
+ key: "ppi",
41
+ displayName: "米 PPI(最終需要、2009=100)",
42
+ unit: "index",
43
+ },
44
+ ];
45
+ // "M01" -> 1。月レコード以外(M13=年間平均など)は null。
46
+ function periodToMonth(period) {
47
+ if (!/^M(0[1-9]|1[0-2])$/.test(period))
48
+ return null;
49
+ return parseInt(period.slice(1), 10);
50
+ }
51
+ // "158736" -> 158736、"-" や空文字は null(BLS の欠損表現)。
52
+ function parseValue(raw) {
53
+ if (!raw || raw === "-" || raw.trim() === "")
54
+ return null;
55
+ const n = Number(raw);
56
+ return Number.isFinite(n) ? n : null;
57
+ }
58
+ // BLS 速報判定: footnotes に code "P" があれば preliminary。
59
+ function isPreliminary(rec) {
60
+ return (rec.footnotes ?? []).some((f) => f?.code === "P");
61
+ }
62
+ function findByYM(data, year, month) {
63
+ return data.find((d) => Number(d.year) === year && periodToMonth(d.period) === month);
64
+ }
65
+ function roundTo(n, digits) {
66
+ const f = 10 ** digits;
67
+ return Math.round(n * f) / f;
68
+ }
69
+ // 1 系列の data 配列を IndicatorSummary に正規化する純関数(テスト容易性のため export)。
70
+ export function summarizeSeries(def, data) {
71
+ // 月次レコードのみに絞る(M13 等を除外)。
72
+ const monthly = data.filter((d) => periodToMonth(d.period) !== null);
73
+ // latest フラグがあればそれを優先、無ければ配列先頭(API は新しい→古い順で返す)。
74
+ const latestRec = monthly.find((d) => d.latest === "true") ?? monthly[0];
75
+ if (!latestRec) {
76
+ return {
77
+ displayName: def.displayName,
78
+ unit: def.unit,
79
+ latest: { year: 0, month: 0, value: null, preliminary: false },
80
+ };
81
+ }
82
+ const latestYear = Number(latestRec.year);
83
+ const latestMonth = periodToMonth(latestRec.period) ?? 0;
84
+ const latestValue = parseValue(latestRec.value);
85
+ const summary = {
86
+ displayName: def.displayName,
87
+ unit: def.unit,
88
+ latest: {
89
+ year: latestYear,
90
+ month: latestMonth,
91
+ value: latestValue,
92
+ preliminary: isPreliminary(latestRec),
93
+ },
94
+ };
95
+ if (latestValue === null)
96
+ return summary;
97
+ // 前月(1 月なら前年 12 月)。
98
+ const prevYear = latestMonth === 1 ? latestYear - 1 : latestYear;
99
+ const prevMonth = latestMonth === 1 ? 12 : latestMonth - 1;
100
+ const prevValue = parseValue(findByYM(monthly, prevYear, prevMonth)?.value);
101
+ // 前年同月。
102
+ const yoyValue = parseValue(findByYM(monthly, latestYear - 1, latestMonth)?.value);
103
+ summary.monthOverMonth = {
104
+ diff: prevValue !== null ? roundTo(latestValue - prevValue, 3) : null,
105
+ percent: prevValue !== null && prevValue !== 0
106
+ ? roundTo(((latestValue - prevValue) / prevValue) * 100, 3)
107
+ : null,
108
+ };
109
+ summary.yearOverYear = {
110
+ diff: yoyValue !== null ? roundTo(latestValue - yoyValue, 3) : null,
111
+ percent: yoyValue !== null && yoyValue !== 0
112
+ ? roundTo(((latestValue - yoyValue) / yoyValue) * 100, 3)
113
+ : null,
114
+ };
115
+ return summary;
116
+ }
117
+ // 全 4 系列をまとめて API 取得し、IndicatorSummary に正規化する。
118
+ // キャッシュは既存共有の 6 時間 TTL を再利用。
119
+ export async function fetchUsMacroLatest() {
120
+ return withCache("bls-us-macro-latest", DEFAULT_CACHE_TTL_MS, async () => {
121
+ const now = new Date();
122
+ const endYear = now.getUTCFullYear();
123
+ // 前年同月比のため 2 年分(年単位指定)取得する。
124
+ const startYear = endYear - 1;
125
+ const res = await fetch(BLS_API_URL, {
126
+ method: "POST",
127
+ headers: {
128
+ "Content-Type": "application/json",
129
+ "User-Agent": RELEASE_PULSE_UA,
130
+ Accept: "application/json",
131
+ },
132
+ body: JSON.stringify({
133
+ seriesid: SERIES.map((s) => s.id),
134
+ startyear: String(startYear),
135
+ endyear: String(endYear),
136
+ }),
137
+ signal: AbortSignal.timeout(RELEASE_PULSE_FETCH_TIMEOUT_MS),
138
+ });
139
+ if (!res.ok)
140
+ throw new Error(`BLS API HTTP ${res.status}`);
141
+ const data = (await res.json());
142
+ if (data.status !== "REQUEST_SUCCEEDED") {
143
+ const detail = data.message?.length ? ` (${data.message.join("; ")})` : "";
144
+ throw new Error(`BLS API failed: ${data.status}${detail}`);
145
+ }
146
+ const seriesList = data.Results?.series ?? [];
147
+ const indicators = {};
148
+ for (const def of SERIES) {
149
+ const found = seriesList.find((s) => s.seriesID === def.id);
150
+ indicators[def.key] = summarizeSeries(def, found?.data ?? []);
151
+ }
152
+ return {
153
+ fetchedAt: new Date().toISOString(),
154
+ source: "BLS Public Data API v2",
155
+ indicators,
156
+ };
157
+ });
158
+ }
159
+ //# sourceMappingURL=us-macro-latest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"us-macro-latest.js","sourceRoot":"","sources":["../../src/lib/us-macro-latest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LitForgeTool } from "./types.js";
2
+ export declare const getUsMacroLatestTool: LitForgeTool;
@@ -0,0 +1,53 @@
1
+ // 米マクロ最新値取得ツール(v0.13.0 新設)。
2
+ // 雇用統計・失業率・CPI・PPI の最新発表値 + 前月比 + 前年同月比 を BLS Public Data API v2
3
+ // から取得する。
4
+ //
5
+ // 設計背景:
6
+ // - 当初は get_economic_release_pulse に BLS アダプタを追加して「発表予定日」を網羅する
7
+ // 計画だったが、BLS の HTML schedule ページと RSS は Akamai bot 管理で 403 が返り取得不能。
8
+ // - 代替路として Public Data API v2 が無認証で動くことを実証し、本ツールでは「最新値」の
9
+ // 取得を実装することにした(発表予定は手動キュレ JSON で従来通り)。
10
+ // - 本ツールは get_market_snapshot(市況値)のマクロ指標版という位置づけ。
11
+ import { fetchUsMacroLatest } from "../lib/us-macro-latest.js";
12
+ import { jsonReply, errorReply } from "./types.js";
13
+ const inputSchema = {};
14
+ export const getUsMacroLatestTool = {
15
+ name: "get_us_macro_latest",
16
+ title: "米マクロ最新値(雇用統計・失業率・CPI・PPI)",
17
+ description: "**米マクロ三大指標**(雇用統計・CPI・PPI)+ 失業率の最新発表値と前月比・前年同月比を返すツール。" +
18
+ "BLS(米労働統計局)の Public Data API v2 を 1 リクエストで叩き、4 系列を集約して返します。" +
19
+ "API key 不要・無認証で動作(BLS 公開 API、未登録枠の 1 日 25 リクエストで運用、6 時間キャッシュ込み)。" +
20
+ "【取得系列】" +
21
+ "雇用統計 = 非農業部門就業者数(CES0000000001、単位: 千人)/ " +
22
+ "失業率(LNS14000000、単位: %)/ " +
23
+ "CPI 都市部全消費者(CUUR0000SA0、index 1982-84=100)/ " +
24
+ "PPI 最終需要(WPSFD4、index 2009=100)。" +
25
+ "【返却内容】" +
26
+ "各指標について最新月の値・前月差・前月比%・前年同月差・前年同月比% を返します。" +
27
+ "速報値(preliminary)には preliminary=true が立ち、後日確定値に更新されます。" +
28
+ "データ欠損月(政府閉鎖等で BLS が値を出せなかった月)は value=null。" +
29
+ "【関連ツール】" +
30
+ "発表予定日は別ツール `get_economic_release_pulse`(公式機関カレンダー)/ " +
31
+ "`get_economic_events_today`(手動キュレ)を参照。本ツールは『今の指標値』、" +
32
+ "それらは『次にいつ出るか』を答えます。" +
33
+ "【利用上の注意】" +
34
+ "BLS は HTML カレンダー / RSS への bot アクセスを拒否しており、" +
35
+ "本ツールが扱う『最新値』のみが自動取得可能です。投資助言ではなく情報集約。",
36
+ inputSchema,
37
+ handler: async () => {
38
+ try {
39
+ const result = await fetchUsMacroLatest();
40
+ return jsonReply({
41
+ ...result,
42
+ note: "BLS Public Data API v2 から取得。" +
43
+ "発表予定日は get_economic_release_pulse / get_economic_events_today を併用してください。" +
44
+ "preliminary=true の月は後日確定値に更新されます。投資助言ではありません。",
45
+ });
46
+ }
47
+ catch (e) {
48
+ const msg = e instanceof Error ? e.message : "fetch failed";
49
+ return errorReply(`BLS Public Data API 取得失敗: ${msg}`);
50
+ }
51
+ },
52
+ };
53
+ //# sourceMappingURL=get-us-macro-latest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-us-macro-latest.js","sourceRoot":"","sources":["../../src/tools/get-us-macro-latest.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,iEAAiE;AACjE,UAAU;AACV,EAAE;AACF,QAAQ;AACR,iEAAiE;AACjE,wEAAwE;AACxE,2DAA2D;AAC3D,2CAA2C;AAC3C,oDAAoD;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,2BAA2B;IAClC,WAAW,EACT,wDAAwD;QACxD,6DAA6D;QAC7D,kEAAkE;QAClE,QAAQ;QACR,0CAA0C;QAC1C,0BAA0B;QAC1B,8CAA8C;QAC9C,kCAAkC;QAClC,QAAQ;QACR,2CAA2C;QAC3C,uDAAuD;QACvD,4CAA4C;QAC5C,SAAS;QACT,sDAAsD;QACtD,qDAAqD;QACrD,qBAAqB;QACrB,UAAU;QACV,4CAA4C;QAC5C,uCAAuC;IACzC,WAAW;IACX,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAC1C,OAAO,SAAS,CAAC;gBACf,GAAG,MAAM;gBACT,IAAI,EACF,8BAA8B;oBAC9B,0EAA0E;oBAC1E,+CAA+C;aAClD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;YAC5D,OAAO,UAAU,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -27,6 +27,7 @@ import { getAnalystConsensusTool } from "./get-analyst-consensus.js";
27
27
  import { getGeopoliticalCalendarTool } from "./get-geopolitical-calendar.js";
28
28
  import { getGeopoliticalPulseTool } from "./get-geopolitical-pulse.js";
29
29
  import { getEconomicReleasePulseTool } from "./get-economic-release-pulse.js";
30
+ import { getUsMacroLatestTool } from "./get-us-macro-latest.js";
30
31
  export const tools = [
31
32
  simulateNisaTool,
32
33
  planRetirementTool,
@@ -49,5 +50,7 @@ export const tools = [
49
50
  getGeopoliticalPulseTool,
50
51
  // v0.11.0 新規: 経済指標リリース予定の公式機関カレンダー リアルタイム取得(手動キュレーションの網羅性補完)
51
52
  getEconomicReleasePulseTool,
53
+ // v0.13.0 新規: 米マクロ最新値(BLS Public Data API、雇用統計・失業率・CPI・PPI)
54
+ getUsMacroLatestTool,
52
55
  ];
53
56
  //# 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;AAC1D,yDAAyD;AACzD,kBAAkB;AAClB,kEAAkE;AAClE,mFAAmF;AACnF,+HAA+H;AAC/H,0CAA0C;AAE1C,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;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAE9E,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;IACpB,eAAe;IACf,sBAAsB;IACtB,uBAAuB;IACvB,kEAAkE;IAClE,2BAA2B;IAC3B,wBAAwB;IACxB,6DAA6D;IAC7D,2BAA2B;CAC5B,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;AAClB,kEAAkE;AAClE,mFAAmF;AACnF,+HAA+H;AAC/H,0CAA0C;AAE1C,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;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,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;IACpB,eAAe;IACf,sBAAsB;IACtB,uBAAuB;IACvB,kEAAkE;IAClE,2BAA2B;IAC3B,wBAAwB;IACxB,6DAA6D;IAC7D,2BAA2B;IAC3B,4DAA4D;IAC5D,oBAAoB;CACrB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lit-forge-mcp",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
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.), dividend history, analyst consensus, economic events.",
6
6
  "type": "module",