lit-forge-mcp 0.12.0 → 0.14.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 +8 -2
- package/dist/lib/__tests__/pfei-parser.test.d.ts +1 -0
- package/dist/lib/__tests__/pfei-parser.test.js +80 -0
- package/dist/lib/__tests__/pfei-parser.test.js.map +1 -0
- package/dist/lib/__tests__/us-macro-latest.test.d.ts +1 -0
- package/dist/lib/__tests__/us-macro-latest.test.js +166 -0
- package/dist/lib/__tests__/us-macro-latest.test.js.map +1 -0
- package/dist/lib/economic-release-pulse/adapters/pfei.d.ts +3 -0
- package/dist/lib/economic-release-pulse/adapters/pfei.js +50 -0
- package/dist/lib/economic-release-pulse/adapters/pfei.js.map +1 -0
- package/dist/lib/economic-release-pulse/pulse.js +3 -1
- package/dist/lib/economic-release-pulse/pulse.js.map +1 -1
- package/dist/lib/pfei-parser.d.ts +19 -0
- package/dist/lib/pfei-parser.js +108 -0
- package/dist/lib/pfei-parser.js.map +1 -0
- package/dist/lib/pfei-schedule-data.d.ts +2 -0
- package/dist/lib/pfei-schedule-data.js +185 -0
- package/dist/lib/pfei-schedule-data.js.map +1 -0
- package/dist/lib/us-macro-latest.d.ts +44 -0
- package/dist/lib/us-macro-latest.js +177 -0
- package/dist/lib/us-macro-latest.js.map +1 -0
- package/dist/tools/get-economic-release-pulse.js +10 -7
- package/dist/tools/get-economic-release-pulse.js.map +1 -1
- package/dist/tools/get-us-macro-latest.d.ts +2 -0
- package/dist/tools/get-us-macro-latest.js +56 -0
- package/dist/tools/get-us-macro-latest.js.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +2 -1
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
|
-
## 提供ツール(
|
|
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)+ コア CPI・コア PPI(食料・エネルギー除く)+ 失業率 + 平均時給の最新発表値と前月比・前年同月比を BLS Public Data API v2 から取得(API key 不要・無認証、7 系列を 1 リクエスト)。`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` のレスポンスに
|
|
122
|
+
`tools/list` のレスポンスに 17 ツールが並べば成功です。
|
|
117
123
|
|
|
118
124
|
## 使用例
|
|
119
125
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// PFEI パーサーの純関数テスト。
|
|
2
|
+
// 実 PDF を pdftotext -layout で抽出した実テキスト断片を fixture として使用。
|
|
3
|
+
import { describe, it, expect } from "vitest";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
|
+
import { join, dirname } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { parsePfei } from "../pfei-parser.js";
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const FIXTURE = readFileSync(join(__dirname, "fixtures", "pfei-2026-bls-section.txt"), "utf-8");
|
|
10
|
+
const SOURCE_URL = "https://www.whitehouse.gov/wp-content/uploads/2025/09/pfei_schedule_release_dates_cy2026.pdf";
|
|
11
|
+
describe("parsePfei (2026 BLS fixture)", () => {
|
|
12
|
+
const result = parsePfei(FIXTURE, SOURCE_URL);
|
|
13
|
+
it("PDF タイトルから年を抽出する", () => {
|
|
14
|
+
expect(result.year).toBe(2026);
|
|
15
|
+
});
|
|
16
|
+
it("source / sourceUrl を保持する", () => {
|
|
17
|
+
expect(result.source).toMatch(/PFEI/);
|
|
18
|
+
expect(result.sourceUrl).toBe(SOURCE_URL);
|
|
19
|
+
});
|
|
20
|
+
it("BLS 三大指標を全て抽出する", () => {
|
|
21
|
+
const keys = result.indicators.map((i) => i.key).sort();
|
|
22
|
+
expect(keys).toEqual(["cpi", "employment", "ppi"]);
|
|
23
|
+
});
|
|
24
|
+
it("各指標 12 ヶ月分のリリース日を返す", () => {
|
|
25
|
+
for (const ind of result.indicators) {
|
|
26
|
+
expect(ind.releases).toHaveLength(12);
|
|
27
|
+
const months = ind.releases.map((r) => r.month);
|
|
28
|
+
expect(months).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it("雇用統計の発表日を正しく抽出する (PFEI 2026 原本)", () => {
|
|
32
|
+
const emp = result.indicators.find((i) => i.key === "employment");
|
|
33
|
+
expect(emp).toBeDefined();
|
|
34
|
+
// PDF 原本: 9, 6, 6, 3, 8, 5, 2, 7, 4, 2, 6, 4
|
|
35
|
+
expect(emp.releases.map((r) => r.day)).toEqual([
|
|
36
|
+
9, 6, 6, 3, 8, 5, 2, 7, 4, 2, 6, 4,
|
|
37
|
+
]);
|
|
38
|
+
});
|
|
39
|
+
it("CPI の発表日を正しく抽出する (PFEI 2026 原本)", () => {
|
|
40
|
+
const cpi = result.indicators.find((i) => i.key === "cpi");
|
|
41
|
+
expect(cpi).toBeDefined();
|
|
42
|
+
// PDF 原本: 13, 11, 11, 10, 12, 10, 14, 12, 11, 14, 10, 10
|
|
43
|
+
expect(cpi.releases.map((r) => r.day)).toEqual([
|
|
44
|
+
13, 11, 11, 10, 12, 10, 14, 12, 11, 14, 10, 10,
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
it("PPI の発表日を正しく抽出する (PFEI 2026 原本)", () => {
|
|
48
|
+
const ppi = result.indicators.find((i) => i.key === "ppi");
|
|
49
|
+
expect(ppi).toBeDefined();
|
|
50
|
+
// PDF 原本: 14, 12, 12, 14, 13, 11, 15, 13, 10, 15, 13, 15
|
|
51
|
+
expect(ppi.releases.map((r) => r.day)).toEqual([
|
|
52
|
+
14, 12, 12, 14, 13, 11, 15, 13, 10, 15, 13, 15,
|
|
53
|
+
]);
|
|
54
|
+
});
|
|
55
|
+
it("全指標が BLS / 08:30 ET / previous month 属性を持つ", () => {
|
|
56
|
+
for (const ind of result.indicators) {
|
|
57
|
+
expect(ind.agency).toBe("BLS");
|
|
58
|
+
expect(ind.timeEt).toBe("08:30");
|
|
59
|
+
expect(ind.dataDescription).toMatch(/previous month/);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
it("妥当な日 (1-31) のみ含む", () => {
|
|
63
|
+
for (const ind of result.indicators) {
|
|
64
|
+
for (const r of ind.releases) {
|
|
65
|
+
expect(r.day).toBeGreaterThanOrEqual(1);
|
|
66
|
+
expect(r.day).toBeLessThanOrEqual(31);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe("parsePfei (エラーパス)", () => {
|
|
72
|
+
it("年がないテキストは throw", () => {
|
|
73
|
+
expect(() => parsePfei("no title here", SOURCE_URL)).toThrow(/year/);
|
|
74
|
+
});
|
|
75
|
+
it("BLS セクションがないテキストは throw", () => {
|
|
76
|
+
const text = "PRINCIPAL FEDERAL ECONOMIC INDICATORS FOR 2026\n(no BLS section)";
|
|
77
|
+
expect(() => parsePfei(text, SOURCE_URL)).toThrow(/BLS/);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=pfei-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pfei-parser.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/pfei-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,50 @@
|
|
|
1
|
+
// PFEI アダプタ(v0.14.0 新設)。
|
|
2
|
+
//
|
|
3
|
+
// ホワイトハウス (OMB/OIRA) が年初に公開する Principal Federal Economic
|
|
4
|
+
// Indicators の Schedule PDF を一次ソースに、BLS 三大指標
|
|
5
|
+
// (雇用統計・CPI・PPI) の年間発表予定を ReleaseEvent[] に展開する。
|
|
6
|
+
//
|
|
7
|
+
// 設計背景:
|
|
8
|
+
// - BLS 公式の HTML schedule と RSS は Akamai bot 管理で 403 を返すため
|
|
9
|
+
// 直接の自動取得は不可能([[feedback_lit_forge_mcp_bls_access_constraint]])。
|
|
10
|
+
// - ホワイトハウスの PFEI PDF は bot ブロックなしで取得でき、米連邦経済指標の
|
|
11
|
+
// 全主要発表予定を一括カバーする。
|
|
12
|
+
// - PDF パースは scripts/update-pfei-schedule.mjs が運営マシン側で実行し、
|
|
13
|
+
// 結果を src/lib/pfei-schedule-data.ts に TS として焼き込む。
|
|
14
|
+
// MCP サーバはランタイムで PDF を取りに行かないため bot ブロックの影響を受けない。
|
|
15
|
+
// - 年初 (1 月) や PFEI 改訂時に再実行して上書きする運用。
|
|
16
|
+
//
|
|
17
|
+
// 他アダプタ (BEA / NY 連銀 / FRB) と違い HTTP fetch を行わず、ビルド時に
|
|
18
|
+
// 焼き込まれた静的データを返すだけなのでキャッシュ不要・常に成功扱い。
|
|
19
|
+
import { etToJst } from "../util.js";
|
|
20
|
+
import { PFEI_SCHEDULES } from "../../pfei-schedule-data.js";
|
|
21
|
+
function ymd(year, month, day) {
|
|
22
|
+
return `${year}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
|
|
23
|
+
}
|
|
24
|
+
// PFEI スケジュールデータを ReleaseEvent[] に展開する純関数(テスト用 export)。
|
|
25
|
+
export function pfeiToReleaseEvents() {
|
|
26
|
+
const out = [];
|
|
27
|
+
for (const schedule of PFEI_SCHEDULES) {
|
|
28
|
+
for (const ind of schedule.indicators) {
|
|
29
|
+
for (const r of ind.releases) {
|
|
30
|
+
const ymdEt = ymd(schedule.year, r.month, r.day);
|
|
31
|
+
const { date, time } = etToJst(ymdEt, ind.timeEt);
|
|
32
|
+
out.push({
|
|
33
|
+
date,
|
|
34
|
+
time,
|
|
35
|
+
country: "US",
|
|
36
|
+
name: ind.name,
|
|
37
|
+
source: "BLS (via PFEI)",
|
|
38
|
+
sourceUrl: schedule.sourceUrl,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
export const pfeiAdapter = {
|
|
46
|
+
key: "pfei",
|
|
47
|
+
label: "BLS(PFEI 公式スケジュール: 雇用統計・CPI・PPI)",
|
|
48
|
+
fetchEvents: async () => pfeiToReleaseEvents(),
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=pfei.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pfei.js","sourceRoot":"","sources":["../../../../src/lib/economic-release-pulse/adapters/pfei.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,EAAE;AACF,yDAAyD;AACzD,6CAA6C;AAC7C,gDAAgD;AAChD,EAAE;AACF,QAAQ;AACR,6DAA6D;AAC7D,qEAAqE;AACrE,mDAAmD;AACnD,uBAAuB;AACvB,6DAA6D;AAC7D,sDAAsD;AACtD,sDAAsD;AACtD,wCAAwC;AACxC,EAAE;AACF,sDAAsD;AACtD,qCAAqC;AAGrC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,SAAS,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IACnD,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClD,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI;oBACJ,IAAI;oBACJ,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,gBAAgB;oBACxB,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,kCAAkC;IACzC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,mBAAmB,EAAE;CAC/C,CAAC"}
|
|
@@ -7,14 +7,16 @@ import { caoAdapter } from "./adapters/cao.js";
|
|
|
7
7
|
import { bojAdapter } from "./adapters/boj.js";
|
|
8
8
|
import { nyfedAdapter } from "./adapters/nyfed.js";
|
|
9
9
|
import { frbAdapter } from "./adapters/frb.js";
|
|
10
|
+
import { pfeiAdapter } from "./adapters/pfei.js";
|
|
10
11
|
// 登録アダプタ。新ソース追加時はここに 1 行足す。
|
|
11
|
-
// 次サイクル候補:
|
|
12
|
+
// 次サイクル候補: 総務省統計局(日 CPI)、FOMC。
|
|
12
13
|
const ADAPTERS = [
|
|
13
14
|
beaAdapter,
|
|
14
15
|
caoAdapter,
|
|
15
16
|
bojAdapter,
|
|
16
17
|
nyfedAdapter,
|
|
17
18
|
frbAdapter,
|
|
19
|
+
pfeiAdapter,
|
|
18
20
|
];
|
|
19
21
|
// date(YYYY-MM-DD) が [from, to] の範囲内か(文字列比較で OK)。
|
|
20
22
|
function inRange(date, from, to) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../../../src/lib/economic-release-pulse/pulse.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,oDAAoD;AACpD,4CAA4C;AAQ5C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../../../src/lib/economic-release-pulse/pulse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type PfeiIndicator = {
|
|
2
|
+
key: "employment" | "cpi" | "ppi";
|
|
3
|
+
name: string;
|
|
4
|
+
agency: "BLS";
|
|
5
|
+
timeEt: string;
|
|
6
|
+
dataDescription: string;
|
|
7
|
+
releases: Array<{
|
|
8
|
+
month: number;
|
|
9
|
+
day: number;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
export type PfeiSchedule = {
|
|
13
|
+
year: number;
|
|
14
|
+
source: string;
|
|
15
|
+
sourceUrl: string;
|
|
16
|
+
parsedAt: string;
|
|
17
|
+
indicators: PfeiIndicator[];
|
|
18
|
+
};
|
|
19
|
+
export declare function parsePfei(text: string, sourceUrl: string): PfeiSchedule;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// PFEI (Principal Federal Economic Indicators) スケジュール PDF のパーサー(v0.14.0 新設)。
|
|
2
|
+
//
|
|
3
|
+
// 背景: BLS は HTML schedule / RSS への bot アクセスを 403 で拒否しているため
|
|
4
|
+
// ([[feedback_lit_forge_mcp_bls_access_constraint]])、米マクロ三大指標
|
|
5
|
+
// (雇用統計・CPI・PPI) の発表予定を自動取得する道が長らく無かった。
|
|
6
|
+
// ホワイトハウス (OMB/OIRA) が年初に公開する PFEI スケジュール PDF は
|
|
7
|
+
// bot ブロックなしで取得でき、BLS/BEA/Census の全主要指標を一括カバーする。
|
|
8
|
+
//
|
|
9
|
+
// 本モジュールは pdftotext -layout で抽出したテキストを入力に取り、
|
|
10
|
+
// BLS 三大指標の年間スケジュールを構造化 JSON に変換する純関数を提供する。
|
|
11
|
+
// 実 PDF の取得と pdftotext 実行はテスト容易性のためここでは行わない
|
|
12
|
+
// (運用スクリプト scripts/update-pfei-schedule.mjs が責任を持つ)。
|
|
13
|
+
const INDICATORS = [
|
|
14
|
+
{
|
|
15
|
+
key: "employment",
|
|
16
|
+
label: "The Employment Situation",
|
|
17
|
+
name: "米 雇用統計 (Employment Situation)",
|
|
18
|
+
agency: "BLS",
|
|
19
|
+
timeEt: "08:30",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
key: "ppi",
|
|
23
|
+
label: "Producer Price Indexes",
|
|
24
|
+
name: "米 PPI (Producer Price Indexes)",
|
|
25
|
+
agency: "BLS",
|
|
26
|
+
timeEt: "08:30",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: "cpi",
|
|
30
|
+
label: "Consumer Price Index",
|
|
31
|
+
name: "米 CPI (Consumer Price Index)",
|
|
32
|
+
agency: "BLS",
|
|
33
|
+
timeEt: "08:30",
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
// PFEI PDF を pdftotext -layout で抽出した text を入力に取り、
|
|
37
|
+
// BLS 三大指標の年間スケジュールを返す。
|
|
38
|
+
export function parsePfei(text, sourceUrl) {
|
|
39
|
+
// 年は PDF タイトル "PRINCIPAL FEDERAL ECONOMIC INDICATORS FOR YYYY" から
|
|
40
|
+
const yearMatch = text.match(/PRINCIPAL FEDERAL ECONOMIC INDICATORS FOR (\d{4})/);
|
|
41
|
+
if (!yearMatch) {
|
|
42
|
+
throw new Error("year not found in PDF title");
|
|
43
|
+
}
|
|
44
|
+
const year = Number(yearMatch[1]);
|
|
45
|
+
// BLS セクションを切り出す: "BUREAU OF LABOR STATISTICS" から次の主要省庁/部局ヘッダまで
|
|
46
|
+
const blsStart = text.indexOf("BUREAU OF LABOR STATISTICS");
|
|
47
|
+
if (blsStart < 0) {
|
|
48
|
+
throw new Error("BLS section not found in PDF");
|
|
49
|
+
}
|
|
50
|
+
// 次の上位ヘッダ候補(経験的に PFEI に出る他部局名)
|
|
51
|
+
const SECTION_BREAK = /\b(BUREAU OF ECONOMIC ANALYSIS|FEDERAL RESERVE|CENSUS BUREAU|OFFICE OF MANAGEMENT|DEPARTMENT OF TREASURY|ENERGY INFORMATION|NATIONAL AGRICULTURAL)\b/;
|
|
52
|
+
// BLS ヘッダ自体にマッチしないよう少し進めてから検索
|
|
53
|
+
const tail = text.slice(blsStart + "BUREAU OF LABOR STATISTICS".length);
|
|
54
|
+
const breakRel = tail.search(SECTION_BREAK);
|
|
55
|
+
const blsBlock = breakRel >= 0
|
|
56
|
+
? text.slice(blsStart, blsStart + "BUREAU OF LABOR STATISTICS".length + breakRel)
|
|
57
|
+
: text.slice(blsStart);
|
|
58
|
+
// 各指標ラベルの出現位置を全部拾い、文書順に並べ替えて区間切り出しの基準にする
|
|
59
|
+
const positions = INDICATORS.map((ind) => ({
|
|
60
|
+
ind,
|
|
61
|
+
pos: blsBlock.indexOf(ind.label),
|
|
62
|
+
}))
|
|
63
|
+
.filter((p) => p.pos >= 0)
|
|
64
|
+
.sort((a, b) => a.pos - b.pos);
|
|
65
|
+
if (positions.length === 0) {
|
|
66
|
+
throw new Error("no BLS indicators found in PDF");
|
|
67
|
+
}
|
|
68
|
+
const indicators = [];
|
|
69
|
+
for (let i = 0; i < positions.length; i++) {
|
|
70
|
+
const { ind, pos } = positions[i];
|
|
71
|
+
// 次の指標ラベルまでをこの指標のセグメントとする
|
|
72
|
+
const nextPos = i + 1 < positions.length ? positions[i + 1].pos : blsBlock.length;
|
|
73
|
+
const segment = blsBlock.slice(pos, nextPos);
|
|
74
|
+
// セグメント内の 1-2 桁整数を全部抽出("--" や 4 桁年は除外)
|
|
75
|
+
// 「数字に隣接する数字でない」境界条件で 1-2 桁の整数のみ拾う
|
|
76
|
+
const nums = [...segment.matchAll(/(?<![\d-])(\d{1,2})(?![\d])/g)].map((m) => Number(m[1]));
|
|
77
|
+
if (nums.length < 12) {
|
|
78
|
+
throw new Error(`indicator "${ind.name}": only ${nums.length} numbers found in segment (expected >= 12)`);
|
|
79
|
+
}
|
|
80
|
+
// 先頭 12 個を月別 (1-12) の発表日として採用。
|
|
81
|
+
// セグメント終端付近には次指標 (Real Earnings / Productivity 等) の数字が
|
|
82
|
+
// 混じるため、末尾 12 個ではなく先頭 12 個を取る。INDICATORS のラベル
|
|
83
|
+
// 文字列には数字を含まないので、ラベル直後にあるはずの月次日付が確実に拾える。
|
|
84
|
+
const days = nums.slice(0, 12);
|
|
85
|
+
// 妥当性チェック: 全て 1-31 の範囲
|
|
86
|
+
for (const d of days) {
|
|
87
|
+
if (d < 1 || d > 31) {
|
|
88
|
+
throw new Error(`indicator "${ind.name}": invalid day ${d} (must be 1-31)`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
indicators.push({
|
|
92
|
+
key: ind.key,
|
|
93
|
+
name: ind.name,
|
|
94
|
+
agency: ind.agency,
|
|
95
|
+
timeEt: ind.timeEt,
|
|
96
|
+
dataDescription: "Data are for previous month",
|
|
97
|
+
releases: days.map((day, idx) => ({ month: idx + 1, day })),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
year,
|
|
102
|
+
source: "PFEI Schedule of Release Dates for Principal Federal Economic Indicators",
|
|
103
|
+
sourceUrl,
|
|
104
|
+
parsedAt: new Date().toISOString(),
|
|
105
|
+
indicators,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=pfei-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pfei-parser.js","sourceRoot":"","sources":["../../src/lib/pfei-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// PFEI スケジュールデータ。
|
|
2
|
+
// scripts/update-pfei-schedule.mjs により自動生成 (手動編集禁止)。
|
|
3
|
+
// 再生成: `npm run build && node scripts/update-pfei-schedule.mjs`
|
|
4
|
+
export const PFEI_SCHEDULES = [
|
|
5
|
+
{
|
|
6
|
+
"year": 2026,
|
|
7
|
+
"source": "PFEI Schedule of Release Dates for Principal Federal Economic Indicators",
|
|
8
|
+
"sourceUrl": "https://www.whitehouse.gov/wp-content/uploads/2025/09/pfei_schedule_release_dates_cy2026.pdf",
|
|
9
|
+
"parsedAt": "2026-05-16T04:25:09.632Z",
|
|
10
|
+
"indicators": [
|
|
11
|
+
{
|
|
12
|
+
"key": "employment",
|
|
13
|
+
"name": "米 雇用統計 (Employment Situation)",
|
|
14
|
+
"agency": "BLS",
|
|
15
|
+
"timeEt": "08:30",
|
|
16
|
+
"dataDescription": "Data are for previous month",
|
|
17
|
+
"releases": [
|
|
18
|
+
{
|
|
19
|
+
"month": 1,
|
|
20
|
+
"day": 9
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"month": 2,
|
|
24
|
+
"day": 6
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"month": 3,
|
|
28
|
+
"day": 6
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"month": 4,
|
|
32
|
+
"day": 3
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"month": 5,
|
|
36
|
+
"day": 8
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"month": 6,
|
|
40
|
+
"day": 5
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"month": 7,
|
|
44
|
+
"day": 2
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"month": 8,
|
|
48
|
+
"day": 7
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"month": 9,
|
|
52
|
+
"day": 4
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"month": 10,
|
|
56
|
+
"day": 2
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"month": 11,
|
|
60
|
+
"day": 6
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"month": 12,
|
|
64
|
+
"day": 4
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"key": "ppi",
|
|
70
|
+
"name": "米 PPI (Producer Price Indexes)",
|
|
71
|
+
"agency": "BLS",
|
|
72
|
+
"timeEt": "08:30",
|
|
73
|
+
"dataDescription": "Data are for previous month",
|
|
74
|
+
"releases": [
|
|
75
|
+
{
|
|
76
|
+
"month": 1,
|
|
77
|
+
"day": 14
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"month": 2,
|
|
81
|
+
"day": 12
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"month": 3,
|
|
85
|
+
"day": 12
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"month": 4,
|
|
89
|
+
"day": 14
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"month": 5,
|
|
93
|
+
"day": 13
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"month": 6,
|
|
97
|
+
"day": 11
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"month": 7,
|
|
101
|
+
"day": 15
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"month": 8,
|
|
105
|
+
"day": 13
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"month": 9,
|
|
109
|
+
"day": 10
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"month": 10,
|
|
113
|
+
"day": 15
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"month": 11,
|
|
117
|
+
"day": 13
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"month": 12,
|
|
121
|
+
"day": 15
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"key": "cpi",
|
|
127
|
+
"name": "米 CPI (Consumer Price Index)",
|
|
128
|
+
"agency": "BLS",
|
|
129
|
+
"timeEt": "08:30",
|
|
130
|
+
"dataDescription": "Data are for previous month",
|
|
131
|
+
"releases": [
|
|
132
|
+
{
|
|
133
|
+
"month": 1,
|
|
134
|
+
"day": 13
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"month": 2,
|
|
138
|
+
"day": 11
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"month": 3,
|
|
142
|
+
"day": 11
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"month": 4,
|
|
146
|
+
"day": 10
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"month": 5,
|
|
150
|
+
"day": 12
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"month": 6,
|
|
154
|
+
"day": 10
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"month": 7,
|
|
158
|
+
"day": 14
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"month": 8,
|
|
162
|
+
"day": 12
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"month": 9,
|
|
166
|
+
"day": 11
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"month": 10,
|
|
170
|
+
"day": 14
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"month": 11,
|
|
174
|
+
"day": 10
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"month": 12,
|
|
178
|
+
"day": 10
|
|
179
|
+
}
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
];
|
|
185
|
+
//# sourceMappingURL=pfei-schedule-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pfei-schedule-data.js","sourceRoot":"","sources":["../../src/lib/pfei-schedule-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
type IndicatorKey = "nonfarmPayrolls" | "unemploymentRate" | "cpi" | "ppi" | "coreCpi" | "corePpi" | "averageHourlyEarnings";
|
|
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,177 @@
|
|
|
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: "CUUR0000SA0L1E",
|
|
40
|
+
key: "coreCpi",
|
|
41
|
+
displayName: "米 コア CPI(食料・エネルギー除く、1982-84=100)",
|
|
42
|
+
unit: "index",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "WPSFD4",
|
|
46
|
+
key: "ppi",
|
|
47
|
+
displayName: "米 PPI(最終需要、2009=100)",
|
|
48
|
+
unit: "index",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "WPSFD49104",
|
|
52
|
+
key: "corePpi",
|
|
53
|
+
displayName: "米 コア PPI(最終需要、食料・エネルギー除く、2009=100)",
|
|
54
|
+
unit: "index",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "CES0500000003",
|
|
58
|
+
key: "averageHourlyEarnings",
|
|
59
|
+
displayName: "米 平均時給(民間部門、季調済)",
|
|
60
|
+
unit: "USD/hour",
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
// "M01" -> 1。月レコード以外(M13=年間平均など)は null。
|
|
64
|
+
function periodToMonth(period) {
|
|
65
|
+
if (!/^M(0[1-9]|1[0-2])$/.test(period))
|
|
66
|
+
return null;
|
|
67
|
+
return parseInt(period.slice(1), 10);
|
|
68
|
+
}
|
|
69
|
+
// "158736" -> 158736、"-" や空文字は null(BLS の欠損表現)。
|
|
70
|
+
function parseValue(raw) {
|
|
71
|
+
if (!raw || raw === "-" || raw.trim() === "")
|
|
72
|
+
return null;
|
|
73
|
+
const n = Number(raw);
|
|
74
|
+
return Number.isFinite(n) ? n : null;
|
|
75
|
+
}
|
|
76
|
+
// BLS 速報判定: footnotes に code "P" があれば preliminary。
|
|
77
|
+
function isPreliminary(rec) {
|
|
78
|
+
return (rec.footnotes ?? []).some((f) => f?.code === "P");
|
|
79
|
+
}
|
|
80
|
+
function findByYM(data, year, month) {
|
|
81
|
+
return data.find((d) => Number(d.year) === year && periodToMonth(d.period) === month);
|
|
82
|
+
}
|
|
83
|
+
function roundTo(n, digits) {
|
|
84
|
+
const f = 10 ** digits;
|
|
85
|
+
return Math.round(n * f) / f;
|
|
86
|
+
}
|
|
87
|
+
// 1 系列の data 配列を IndicatorSummary に正規化する純関数(テスト容易性のため export)。
|
|
88
|
+
export function summarizeSeries(def, data) {
|
|
89
|
+
// 月次レコードのみに絞る(M13 等を除外)。
|
|
90
|
+
const monthly = data.filter((d) => periodToMonth(d.period) !== null);
|
|
91
|
+
// latest フラグがあればそれを優先、無ければ配列先頭(API は新しい→古い順で返す)。
|
|
92
|
+
const latestRec = monthly.find((d) => d.latest === "true") ?? monthly[0];
|
|
93
|
+
if (!latestRec) {
|
|
94
|
+
return {
|
|
95
|
+
displayName: def.displayName,
|
|
96
|
+
unit: def.unit,
|
|
97
|
+
latest: { year: 0, month: 0, value: null, preliminary: false },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const latestYear = Number(latestRec.year);
|
|
101
|
+
const latestMonth = periodToMonth(latestRec.period) ?? 0;
|
|
102
|
+
const latestValue = parseValue(latestRec.value);
|
|
103
|
+
const summary = {
|
|
104
|
+
displayName: def.displayName,
|
|
105
|
+
unit: def.unit,
|
|
106
|
+
latest: {
|
|
107
|
+
year: latestYear,
|
|
108
|
+
month: latestMonth,
|
|
109
|
+
value: latestValue,
|
|
110
|
+
preliminary: isPreliminary(latestRec),
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
if (latestValue === null)
|
|
114
|
+
return summary;
|
|
115
|
+
// 前月(1 月なら前年 12 月)。
|
|
116
|
+
const prevYear = latestMonth === 1 ? latestYear - 1 : latestYear;
|
|
117
|
+
const prevMonth = latestMonth === 1 ? 12 : latestMonth - 1;
|
|
118
|
+
const prevValue = parseValue(findByYM(monthly, prevYear, prevMonth)?.value);
|
|
119
|
+
// 前年同月。
|
|
120
|
+
const yoyValue = parseValue(findByYM(monthly, latestYear - 1, latestMonth)?.value);
|
|
121
|
+
summary.monthOverMonth = {
|
|
122
|
+
diff: prevValue !== null ? roundTo(latestValue - prevValue, 3) : null,
|
|
123
|
+
percent: prevValue !== null && prevValue !== 0
|
|
124
|
+
? roundTo(((latestValue - prevValue) / prevValue) * 100, 3)
|
|
125
|
+
: null,
|
|
126
|
+
};
|
|
127
|
+
summary.yearOverYear = {
|
|
128
|
+
diff: yoyValue !== null ? roundTo(latestValue - yoyValue, 3) : null,
|
|
129
|
+
percent: yoyValue !== null && yoyValue !== 0
|
|
130
|
+
? roundTo(((latestValue - yoyValue) / yoyValue) * 100, 3)
|
|
131
|
+
: null,
|
|
132
|
+
};
|
|
133
|
+
return summary;
|
|
134
|
+
}
|
|
135
|
+
// 全 4 系列をまとめて API 取得し、IndicatorSummary に正規化する。
|
|
136
|
+
// キャッシュは既存共有の 6 時間 TTL を再利用。
|
|
137
|
+
export async function fetchUsMacroLatest() {
|
|
138
|
+
return withCache("bls-us-macro-latest", DEFAULT_CACHE_TTL_MS, async () => {
|
|
139
|
+
const now = new Date();
|
|
140
|
+
const endYear = now.getUTCFullYear();
|
|
141
|
+
// 前年同月比のため 2 年分(年単位指定)取得する。
|
|
142
|
+
const startYear = endYear - 1;
|
|
143
|
+
const res = await fetch(BLS_API_URL, {
|
|
144
|
+
method: "POST",
|
|
145
|
+
headers: {
|
|
146
|
+
"Content-Type": "application/json",
|
|
147
|
+
"User-Agent": RELEASE_PULSE_UA,
|
|
148
|
+
Accept: "application/json",
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify({
|
|
151
|
+
seriesid: SERIES.map((s) => s.id),
|
|
152
|
+
startyear: String(startYear),
|
|
153
|
+
endyear: String(endYear),
|
|
154
|
+
}),
|
|
155
|
+
signal: AbortSignal.timeout(RELEASE_PULSE_FETCH_TIMEOUT_MS),
|
|
156
|
+
});
|
|
157
|
+
if (!res.ok)
|
|
158
|
+
throw new Error(`BLS API HTTP ${res.status}`);
|
|
159
|
+
const data = (await res.json());
|
|
160
|
+
if (data.status !== "REQUEST_SUCCEEDED") {
|
|
161
|
+
const detail = data.message?.length ? ` (${data.message.join("; ")})` : "";
|
|
162
|
+
throw new Error(`BLS API failed: ${data.status}${detail}`);
|
|
163
|
+
}
|
|
164
|
+
const seriesList = data.Results?.series ?? [];
|
|
165
|
+
const indicators = {};
|
|
166
|
+
for (const def of SERIES) {
|
|
167
|
+
const found = seriesList.find((s) => s.seriesID === def.id);
|
|
168
|
+
indicators[def.key] = summarizeSeries(def, found?.data ?? []);
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
fetchedAt: new Date().toISOString(),
|
|
172
|
+
source: "BLS Public Data API v2",
|
|
173
|
+
indicators,
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# 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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"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
// 経済指標リリース予定 リアルタイム取得ツール(v0.11.0 新設、v0.12.0 で NY 連銀・FRB
|
|
1
|
+
// 経済指標リリース予定 リアルタイム取得ツール(v0.11.0 新設、v0.12.0 で NY 連銀・FRB 追加、v0.14.0 で BLS(PFEI 経由)追加)。
|
|
2
2
|
//
|
|
3
3
|
// 役割分担:
|
|
4
|
-
// - 本ツール:
|
|
4
|
+
// - 本ツール: 公式機関のリリースカレンダーを取得し、収録漏れの無い「網羅性」を担保
|
|
5
5
|
// - get_economic_events_today: 手動キュレーション(★★★ 中心・半年 1 回更新・verify 済み)
|
|
6
6
|
// 両者は補完関係。市況サマリーでは両方を併用するのが望ましい。
|
|
7
7
|
//
|
|
8
|
-
// 現行カバー範囲(v0.
|
|
8
|
+
// 現行カバー範囲(v0.14.0):
|
|
9
9
|
// - BEA(米): GDP / 個人所得・支出(PCE)/ 貿易収支 / 企業収益 — 公式 JSON
|
|
10
10
|
// - NY 連銀(米): 製造業景気指数(Empire State)— 公式 HTML
|
|
11
11
|
// - FRB(米): 鉱工業生産(G.17)— 公式 HTML
|
|
12
|
+
// - BLS(米): 雇用統計 / CPI / PPI — ホワイトハウス PFEI 公式スケジュール PDF
|
|
13
|
+
// (BLS 公式の HTML/RSS は bot ブロックされるため PFEI 経由で取得)
|
|
12
14
|
// - 内閣府(日): 四半期別 GDP 速報 — 公式 HTML
|
|
13
15
|
// - 日銀(日): 金融政策決定会合 / 主な意見 / 短観 / 議事要旨 — lit-forge 収録データ再利用
|
|
14
|
-
// 次サイクル予定:
|
|
16
|
+
// 次サイクル予定: 総務省統計局(日 CPI)/ FOMC。
|
|
15
17
|
import { z } from "zod";
|
|
16
18
|
import { fetchEconomicReleasePulse, } from "../lib/economic-release-pulse/pulse.js";
|
|
17
19
|
import { jsonReply } from "./types.js";
|
|
@@ -35,10 +37,11 @@ export const getEconomicReleasePulseTool = {
|
|
|
35
37
|
"`get_economic_events_today` は運営者が一次ソースで裏取りした手動キュレーション(★★★ 中心、半年 1 回更新)で、" +
|
|
36
38
|
"収録対象を絞っているため取りこぼす『網羅性の穴』があります。" +
|
|
37
39
|
"本ツールは公式カレンダーを実取得することでその穴を埋める**補完ツール**です。市況サマリーでは両方を併用してください。" +
|
|
38
|
-
"【現行カバー範囲(v0.
|
|
40
|
+
"【現行カバー範囲(v0.14.0)】" +
|
|
39
41
|
"BEA(米 GDP / 個人所得・支出〔PCE〕/ 貿易収支 / 企業収益)、NY 連銀(米 製造業景気指数 Empire State)、" +
|
|
40
|
-
"FRB(米 鉱工業生産 G.17
|
|
41
|
-
"
|
|
42
|
+
"FRB(米 鉱工業生産 G.17)、**BLS**(雇用統計・CPI・PPI — ホワイトハウス PFEI 公式スケジュール経由)、" +
|
|
43
|
+
"内閣府(四半期別 GDP 速報)、日銀(金融政策決定会合 / 主な意見 / 短観 / 議事要旨)。" +
|
|
44
|
+
"総務省統計局(日 CPI)・FOMC は次サイクルで追加予定で、現時点では本ツールに含まれません。" +
|
|
42
45
|
"【利用上の注意】" +
|
|
43
46
|
"アダプタ単位の取得失敗は sources 配列に error として記録され、他アダプタの結果は返されます(部分成功)。" +
|
|
44
47
|
"結果は 6 時間キャッシュされます。各イベントには一次ソース URL(sourceUrl)が付きます。",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-economic-release-pulse.js","sourceRoot":"","sources":["../../src/tools/get-economic-release-pulse.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"get-economic-release-pulse.js","sourceRoot":"","sources":["../../src/tools/get-economic-release-pulse.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,EAAE;AACF,QAAQ;AACR,+CAA+C;AAC/C,sEAAsE;AACtE,mCAAmC;AACnC,EAAE;AACF,oBAAoB;AACpB,wDAAwD;AACxD,+CAA+C;AAC/C,mCAAmC;AACnC,2DAA2D;AAC3D,oDAAoD;AACpD,oCAAoC;AACpC,8DAA8D;AAC9D,gCAAgC;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,yBAAyB,GAE1B,MAAM,wCAAwC,CAAC;AAEhD,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,sCAAsC,CAAC;IACnD,OAAO,EAAE,CAAC;SACP,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SACpC,QAAQ,EAAE;SACV,QAAQ,CACP,gDAAgD;QAC9C,wCAAwC,CAC3C;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAiB;IACvD,IAAI,EAAE,4BAA4B;IAClC,KAAK,EAAE,gCAAgC;IACvC,WAAW,EACT,gDAAgD;QAChD,0DAA0D;QAC1D,kCAAkC;QAClC,0EAA0E;QAC1E,gCAAgC;QAChC,8DAA8D;QAC9D,oBAAoB;QACpB,uEAAuE;QACvE,oEAAoE;QACpE,mDAAmD;QACnD,mDAAmD;QACnD,UAAU;QACV,8DAA8D;QAC9D,qDAAqD;IACvD,WAAW;IACX,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,MAAM,cAAc,GAAG,CAAC,KAAK,IAAI,OAAO,CAAiB,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC;YAC7C,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,OAAqC;SAC/C,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EACF,sCAAsC;gBACtC,+CAA+C;gBAC/C,uCAAuC;SAC1C,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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 リクエストで叩き、7 系列を集約して返します。" +
|
|
19
|
+
"API key 不要・無認証で動作(BLS 公開 API、未登録枠の 1 日 25 リクエストで運用、6 時間キャッシュ込み)。" +
|
|
20
|
+
"【取得系列(v0.14.0 で 4→7 系列に拡張)】" +
|
|
21
|
+
"雇用統計 = 非農業部門就業者数(CES0000000001、千人)/ " +
|
|
22
|
+
"失業率(LNS14000000、%)/ " +
|
|
23
|
+
"CPI 都市部全消費者(CUUR0000SA0、index 1982-84=100)/ " +
|
|
24
|
+
"**コア CPI**(食料・エネルギー除く、CUUR0000SA0L1E、index)/ " +
|
|
25
|
+
"PPI 最終需要(WPSFD4、index 2009=100)/ " +
|
|
26
|
+
"**コア PPI**(食料・エネルギー除く、WPSFD49104、index)/ " +
|
|
27
|
+
"**平均時給**(民間部門季調済、CES0500000003、USD/hour)。" +
|
|
28
|
+
"【返却内容】" +
|
|
29
|
+
"各指標について最新月の値・前月差・前月比%・前年同月差・前年同月比% を返します。" +
|
|
30
|
+
"速報値(preliminary)には preliminary=true が立ち、後日確定値に更新されます。" +
|
|
31
|
+
"データ欠損月(政府閉鎖等で BLS が値を出せなかった月)は value=null。" +
|
|
32
|
+
"【関連ツール】" +
|
|
33
|
+
"発表予定日は別ツール `get_economic_release_pulse`(公式機関カレンダー)/ " +
|
|
34
|
+
"`get_economic_events_today`(手動キュレ)を参照。本ツールは『今の指標値』、" +
|
|
35
|
+
"それらは『次にいつ出るか』を答えます。" +
|
|
36
|
+
"【利用上の注意】" +
|
|
37
|
+
"BLS は HTML カレンダー / RSS への bot アクセスを拒否しており、" +
|
|
38
|
+
"本ツールが扱う『最新値』のみが自動取得可能です。投資助言ではなく情報集約。",
|
|
39
|
+
inputSchema,
|
|
40
|
+
handler: async () => {
|
|
41
|
+
try {
|
|
42
|
+
const result = await fetchUsMacroLatest();
|
|
43
|
+
return jsonReply({
|
|
44
|
+
...result,
|
|
45
|
+
note: "BLS Public Data API v2 から取得。" +
|
|
46
|
+
"発表予定日は get_economic_release_pulse / get_economic_events_today を併用してください。" +
|
|
47
|
+
"preliminary=true の月は後日確定値に更新されます。投資助言ではありません。",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
const msg = e instanceof Error ? e.message : "fetch failed";
|
|
52
|
+
return errorReply(`BLS Public Data API 取得失敗: ${msg}`);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# 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,sEAAsE;QACtE,6DAA6D;QAC7D,kEAAkE;QAClE,6BAA6B;QAC7B,sCAAsC;QACtC,sBAAsB;QACtB,8CAA8C;QAC9C,+CAA+C;QAC/C,mCAAmC;QACnC,2CAA2C;QAC3C,2CAA2C;QAC3C,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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -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
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;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;
|
|
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.
|
|
3
|
+
"version": "0.14.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",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"verify:jp-macro": "node scripts/verify-jp-macro-events.mjs",
|
|
51
51
|
"verify:geopolitical": "node scripts/verify-geopolitical-events.mjs",
|
|
52
52
|
"verify:all": "npm run verify:cb && npm run verify:us-macro && npm run verify:jp-macro && npm run verify:geopolitical",
|
|
53
|
+
"update:pfei": "npm run build && node scripts/update-pfei-schedule.mjs",
|
|
53
54
|
"prepare": "npm run build",
|
|
54
55
|
"prepublishOnly": "npm run build && npm run verify:all"
|
|
55
56
|
},
|