building-standards-act-mcp 1.6.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +80 -53
  2. package/dist/lib/article-analyzer.js +3 -4
  3. package/dist/lib/article-analyzer.js.map +1 -1
  4. package/dist/lib/article-fetcher.d.ts +12 -0
  5. package/dist/lib/article-fetcher.js +65 -0
  6. package/dist/lib/article-fetcher.js.map +1 -0
  7. package/dist/lib/article-schemas.d.ts +165 -0
  8. package/dist/lib/article-schemas.js +47 -0
  9. package/dist/lib/article-schemas.js.map +1 -0
  10. package/dist/lib/citation-verifier.js +5 -6
  11. package/dist/lib/citation-verifier.js.map +1 -1
  12. package/dist/lib/egov-client.d.ts +13 -1
  13. package/dist/lib/egov-client.js +58 -1
  14. package/dist/lib/egov-client.js.map +1 -1
  15. package/dist/lib/egov-parser.d.ts +38 -0
  16. package/dist/lib/egov-parser.js +14 -3
  17. package/dist/lib/egov-parser.js.map +1 -1
  18. package/dist/lib/errors.d.ts +3 -2
  19. package/dist/lib/errors.js +5 -3
  20. package/dist/lib/errors.js.map +1 -1
  21. package/dist/lib/kokuji-registry.d.ts +2 -3
  22. package/dist/lib/kokuji-registry.js +9 -77
  23. package/dist/lib/kokuji-registry.js.map +1 -1
  24. package/dist/lib/mlit-client.d.ts +5 -2
  25. package/dist/lib/mlit-client.js +52 -6
  26. package/dist/lib/mlit-client.js.map +1 -1
  27. package/dist/lib/openapi-spec.js +2 -1
  28. package/dist/lib/openapi-spec.js.map +1 -1
  29. package/dist/lib/related-law-finder.js +3 -4
  30. package/dist/lib/related-law-finder.js.map +1 -1
  31. package/dist/lib/resilience.js +3 -1
  32. package/dist/lib/resilience.js.map +1 -1
  33. package/dist/lib/revision-tracker.d.ts +5 -5
  34. package/dist/lib/revision-tracker.js +16 -8
  35. package/dist/lib/revision-tracker.js.map +1 -1
  36. package/dist/lib/tool-helpers.d.ts +15 -0
  37. package/dist/lib/tool-helpers.js +37 -0
  38. package/dist/lib/tool-helpers.js.map +1 -1
  39. package/dist/lib/tool-invoker.d.ts +4 -0
  40. package/dist/lib/tool-invoker.js +2 -1
  41. package/dist/lib/tool-invoker.js.map +1 -1
  42. package/dist/lib/types.d.ts +17 -0
  43. package/dist/lib/version.d.ts +2 -0
  44. package/dist/lib/version.js +3 -0
  45. package/dist/lib/version.js.map +1 -0
  46. package/dist/server.js +10 -4
  47. package/dist/server.js.map +1 -1
  48. package/dist/tools/analyze-article.js +37 -2
  49. package/dist/tools/analyze-article.js.map +1 -1
  50. package/dist/tools/check-law-updates.js +31 -9
  51. package/dist/tools/check-law-updates.js.map +1 -1
  52. package/dist/tools/get-full-law.js +23 -3
  53. package/dist/tools/get-full-law.js.map +1 -1
  54. package/dist/tools/get-kokuji.js +54 -17
  55. package/dist/tools/get-kokuji.js.map +1 -1
  56. package/dist/tools/get-law.js +52 -8
  57. package/dist/tools/get-law.js.map +1 -1
  58. package/dist/tools/get-laws-batch.js +44 -41
  59. package/dist/tools/get-laws-batch.js.map +1 -1
  60. package/dist/tools/get-metrics.js +28 -2
  61. package/dist/tools/get-metrics.js.map +1 -1
  62. package/dist/tools/search-articles.d.ts +2 -0
  63. package/dist/tools/search-articles.js +86 -0
  64. package/dist/tools/search-articles.js.map +1 -0
  65. package/dist/tools/search-law.js +7 -2
  66. package/dist/tools/search-law.js.map +1 -1
  67. package/dist/tools/suggest-related.js +7 -2
  68. package/dist/tools/suggest-related.js.map +1 -1
  69. package/dist/tools/verify-citation.js +41 -3
  70. package/dist/tools/verify-citation.js.map +1 -1
  71. package/package.json +10 -2
package/README.md CHANGED
@@ -11,12 +11,13 @@ AI の建築法規回答に含まれるハルシネーションを、条文原
11
11
 
12
12
  ## 特徴
13
13
 
14
- - **法令取得** — e-Gov 法令 API v2 から条文を Markdown 形式で取得
15
- - **法令検索** — キーワードで法令を横断検索
14
+ - **法令取得** — e-Gov 法令 API v2 から条文を条単位(`elm` 指定)で取得。1 条あたり数 KB で済み、全文 1 MB 超を読まない
15
+ - **法令検索** — 法令名で建築関連法令を横断検索
16
+ - **条文本文検索** — e-Gov のキーワード検索 API で条文本文を全文検索(`search_articles`)
16
17
  - **法令全文取得** — 法令全体のテキストを取得
17
18
  - **告示取得** — 建築基準法が技術基準を委任している告示を国土交通省の告示データベース(PDF)から取得
18
19
  - **検索ファースト** — e-Gov API 検索による動的な法令解決。プリセットに限らず、e-Gov 収録の全法令を取得可能
19
- - **略称マップ** — 建築基準法・消防法・都市計画法ほか 112 法令の略称を登録済み。「建基法」「都計法」「消防法」等の略称で指定可能
20
+ - **略称マップ** — 建築基準法・消防法・都市計画法ほか 116 法令の略称を登録済み。「建基法」「都計法」「消防法」等の略称で指定可能
20
21
  - **キャッシュ** — 検索 30 分・法令データ 24 時間の TTL キャッシュ(永続化オプションあり)
21
22
  - **API 耐障害性** — 自動リトライ(exponential backoff)+ サーキットブレーカー
22
23
  - **運用可視化** — 構造化 JSON ログ + 使用量メトリクス(`get_metrics` ツール)
@@ -25,27 +26,29 @@ AI の建築法規回答に含まれるハルシネーションを、条文原
25
26
 
26
27
  Vercel にデプロイすると、Claude.ai からすぐに使えます。環境変数の設定は不要です(e-Gov API は公開 API)。
27
28
 
29
+ 公開インスタンス: `https://building-standards-act-mcp.vercel.app/api/mcp`(自分でデプロイしなくても、この URL をそのまま Custom Connector に登録できます)
30
+
28
31
  [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FSora-bluesky%2Fbuilding-standards-act-mcp)
29
32
 
30
33
  ### Claude.ai でのセットアップ(Free/Pro/Max/Team/Enterprise)
31
34
 
32
- > **注意**: Custom Connectors はベータ版のため、接続が不安定な場合があります。安定してご利用いただくには [npx(ローカル)でのセットアップ](#npx推奨)もご検討ください。
35
+ > Custom Connectors は Free / Pro / Max / Team / Enterprise の各プランで利用できます(Free プランは 1 件まで)。ローカルで動かしたい場合は [npx(ローカル)でのセットアップ](#npx推奨) を参照してください。
33
36
 
34
- 1. 上の「Deploy with Vercel」ボタンでデプロイ(ワンクリック)
35
- 2. [claude.ai](https://claude.ai) → プロフィールアイコン → Settings → Connectors
36
- 3. 「Add custom connector」をクリック
37
- 4. URL に `https://your-app.vercel.app/api/mcp`(your-app をデプロイ先に置換)を入力
37
+ 1. 公開インスタンスを使う場合はこの手順を飛ばす。自分でホストする場合は上の「Deploy with Vercel」ボタンでデプロイ(ワンクリック)
38
+ 2. [claude.ai](https://claude.ai) → Customize → Connectors
39
+ 3. 「+ Add」→「Add custom connector」をクリック
40
+ 4. URL に `https://building-standards-act-mcp.vercel.app/api/mcp`(自分でデプロイした場合はその URL)を入力し、認証は「No sign in」を選択
38
41
  5. チャットで「+」→「Connectors」→ building-standards-act を有効化
39
42
  6. 「建築基準法第20条を教えて」と質問
40
43
 
41
44
  > 参考: [Get started with custom connectors using remote MCP](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp)
42
45
 
43
- ### Vercel Free tier の制限事項
46
+ ### Vercel での実行時間
44
47
 
45
- - 関数の実行時間が **10 秒** に制限されます(Pro プランでは 60 秒)
46
- - `get_kokuji`(告示取得)は PDF ダウンロード + パースが重いため、タイムアウトする場合があります
47
- - `check_law_updates` の大規模グループ(9章: 53法令)は Free tier ではタイムアウトする場合があります(Pro プランでは並行実行により対応可能)
48
- - `BUILDING_LAW_REQUEST_TIMEOUT=8000` を設定してタイムアウトを短縮できます
48
+ - Vercel Functions の実行時間は Hobby プランでも既定 300 秒です(Fluid compute)。本リポの `vercel.json` は `maxDuration` を 60 秒に設定しています
49
+ - `get_kokuji`(告示取得)は PDF ダウンロード + パースが重いため、60 秒を超える場合は `vercel.json` の `maxDuration` を引き上げてください
50
+ - `check_law_updates` の大規模グループ(9章: 53法令)は最大 5 並行で実行します(`BUILDING_LAW_CONCURRENCY` で調整可能)
51
+ - `BUILDING_LAW_REQUEST_TIMEOUT=8000` を設定して e-Gov API 呼び出しのタイムアウトを短縮できます
49
52
 
50
53
  ---
51
54
 
@@ -137,18 +140,19 @@ npm run build
137
140
 
138
141
  ## MCP ツール
139
142
 
140
- | ツール | 説明 |
141
- | ------------------- | --------------------------------------------------------------------------------------------- |
142
- | `get_law` | 条番号を指定して法令の条文を取得する。略称・正式名称のいずれでも指定可能 |
143
- | `get_full_law` | 法令の全文を取得する。条番号を指定せず法令全体のテキストを返す |
144
- | `search_law` | キーワードで建築関連法令を横断検索する。略称マップと e-Gov API の両方を検索 |
145
- | `get_kokuji` | 建築基準法が技術基準を委任している告示の全文を取得する(省エネ告示は国交省 PDF から直接取得) |
146
- | `check_law_updates` | 法令の改正状況を e-Gov API で確認する(単体/バッチ/改正履歴表示に対応) |
147
- | `get_laws_batch` | 複数の法令・条文を一括取得する(最大20件、同一法令は1回のAPI呼び出しで効率処理) |
148
- | `verify_citation` | AIの回答に含まれる法令引用を検証する(条文存在確認・テキスト照合、最大10件) |
149
- | `suggest_related` | 指定した条文の関連法令・委任先・同法令内参照を自動抽出して提案する |
150
- | `analyze_article` | 条文の構造解析メタデータ(項数・号数・参照統計・プレビュー)をJSON形式で返す |
151
- | `get_metrics` | サーバーの使用量メトリクスを返す(ツール呼び出し回数・APIリクエスト数・キャッシュヒット率) |
143
+ | ツール | 説明 |
144
+ | ------------------- | --------------------------------------------------------------------------------------------------------------- |
145
+ | `get_law` | 条番号を指定して法令の条文を取得する。略称・正式名称のいずれでも指定可能 |
146
+ | `get_full_law` | 法令の全文を取得する。`max_chars`(既定 100,000)で区切り、続きは `offset` で取る |
147
+ | `search_law` | 法令名(タイトル)で建築関連法令を検索する。略称マップと e-Gov API の両方を検索。条文本文の検索は `search_articles` |
148
+ | `search_articles` | 条文本文をキーワードで全文検索する(e-Gov `/keyword`)。法令名で絞り込み可。条番号は返らないので `get_law` で確定する |
149
+ | `get_kokuji` | 建築基準法が技術基準を委任している告示の全文を取得する(省エネ告示は国交省 PDF から直接取得) |
150
+ | `check_law_updates` | 法令の改正状況を e-Gov API で確認する。`since`(既定は 12 か月前)より後の改正だけを「改正あり」にする |
151
+ | `get_laws_batch` | 複数の法令・条文を一括取得する(最大20件、1 条ごとに条単位で取得) |
152
+ | `verify_citation` | AIの回答に含まれる法令引用を検証する(条文存在確認・テキスト照合、最大10件) |
153
+ | `suggest_related` | 指定した条文の関連法令・委任先・同法令内参照を自動抽出して提案する |
154
+ | `analyze_article` | 条文の構造解析メタデータ(項数・号数・参照統計・プレビュー)をJSON形式で返す |
155
+ | `get_metrics` | サーバーの使用量メトリクスを返す(ツール呼び出し回数・APIリクエスト数・キャッシュヒット率) |
152
156
 
153
157
  ### パラメータ
154
158
 
@@ -162,21 +166,34 @@ npm run build
162
166
 
163
167
  #### `get_full_law`
164
168
 
165
- | パラメータ | 説明 | 例 |
166
- | ---------- | ---------------------------- | ---------------------------- |
167
- | `law_name` | 法令名(正式名称または略称) | `建築基準法施行令`, `建基令` |
169
+ | パラメータ | 説明 | 例 |
170
+ | ----------- | --------------------------------------------- | ---------------------------- |
171
+ | `law_name` | 法令名(正式名称または略称) | `建築基準法施行令`, `建基令` |
172
+ | `max_chars` | 1 回に返す最大文字数(既定 100,000) | `50000` |
173
+ | `offset` | 続きを取るときの開始位置(末尾の案内に出る値) | `100000` |
168
174
 
169
175
  #### `search_law`
170
176
 
171
- | パラメータ | 説明 | 例 |
172
- | ---------- | -------------- | ---------------------- |
173
- | `keyword` | 検索キーワード | `耐火構造`, `用途変更` |
177
+ | パラメータ | 説明 | 例 |
178
+ | ---------- | ---------------------- | ---------------------- |
179
+ | `keyword` | 法令名に含まれる語 | `建築`, `都市計画` |
180
+
181
+ #### `search_articles`
182
+
183
+ | パラメータ | 説明 | 例 |
184
+ | ----------- | ------------------------------------------------------------ | ---------------------- |
185
+ | `keyword` | 条文本文に含まれる語。AND / OR / NOT と `*` `?` が使える | `耐火構造`, `壁量` |
186
+ | `law_title` | 法令名または略称で絞り込み(省略時は e-Gov の全法令) | `建築基準法` |
187
+ | `limit` | 返す該当文の数(既定 10、最大 50) | `20` |
188
+ | `offset` | 続きを取るときの開始位置(応答の `next_offset` を渡す) | `10` |
174
189
 
175
190
  #### `get_kokuji`
176
191
 
177
- | パラメータ | 説明 | 例 |
178
- | ------------- | ------ | ------------------------------ |
179
- | `kokuji_name` | 告示名 | `耐火構造の構造方法を定める件` |
192
+ | パラメータ | 説明 | 例 |
193
+ | ------------- | ------------------------------------- | ------------------------------ |
194
+ | `kokuji_name` | 告示名 | `耐火構造の構造方法を定める件` |
195
+ | `max_chars` | 1 回に返す最大文字数(既定 100,000) | `50000` |
196
+ | `offset` | 続きを取るときの開始位置 | `100000` |
180
197
 
181
198
  #### `check_law_updates`
182
199
 
@@ -185,6 +202,7 @@ npm run build
185
202
  | `law_name` | 法令名または略称(単体チェック) | `建築基準法` |
186
203
  | `group` | 章グループ(バッチチェック、省略時は全章) | `1章` |
187
204
  | `show_history` | 改正履歴の詳細を表示(`law_name` 指定時) | `true` |
205
+ | `since` | 基準日。これより後の改正だけを報告(省略時は 12 か月前) | `2026-01-01` |
188
206
 
189
207
  #### `get_laws_batch`
190
208
 
@@ -235,8 +253,16 @@ npm run build
235
253
  ### 法令検索
236
254
 
237
255
  ```
238
- 耐火構造に関する法令を検索して
239
- → search_law(keyword="耐火構造")
256
+ 都市計画に関する法令を検索して
257
+ → search_law(keyword="都市計画")
258
+ ```
259
+
260
+ ### 条文本文検索
261
+
262
+ ```
263
+ 建築基準法で「耐火構造」が出てくる条文を探して
264
+ → search_articles(keyword="耐火構造", law_title="建築基準法")
265
+ → 該当文と区分(本則 / 附則)が返るので、条番号は get_law で確定する
240
266
  ```
241
267
 
242
268
  ### 全文取得
@@ -261,6 +287,9 @@ npm run build
261
287
 
262
288
  建築基準法施行令の附則第1条を取得して
263
289
  → get_law(law_name="建築基準法施行令", article_number="附則第1条")
290
+
291
+ 未施行の改正附則(現行データに無いときは改正履歴から未施行版を取る)
292
+ → get_law(law_name="建築基準法施行令", article_number="附則(令和8年政令第284号)")
264
293
  ```
265
294
 
266
295
  ### 別表取得
@@ -315,9 +344,9 @@ AI が建築法規について回答する際、条文の引用ミスや存在
315
344
  → 「第20条第1項第三号の記載に誤りがあります。正しくは…」
316
345
  ```
317
346
 
318
- ## 対応法令一覧(112 法令 + e-Gov 全法令)
347
+ ## 対応法令一覧(116 法令 + e-Gov 全法令)
319
348
 
320
- > 以下の 112 法令は略称マップに登録済みです。略称マップに含まれない法令も、正式名称を指定すれば e-Gov API 検索で動的に取得できます。
349
+ > 以下の 116 法令は略称マップに登録済みです。略称マップに含まれない法令も、正式名称を指定すれば e-Gov API 検索で動的に取得できます。
321
350
 
322
351
  ### 総則(4 法令)
323
352
 
@@ -495,21 +524,19 @@ AI が建築法規について回答する際、条文の引用ミスや存在
495
524
  | 被災市街地復興特別措置法 | 被災市街地復興法 |
496
525
  | 被災区分所有建物の再建等に関する特別措置法 | 被災マンション法 |
497
526
 
498
- ## 対応告示(9 件)
499
-
500
- e-Gov API は告示を収録していないため、`get_kokuji` は国土交通省の告示・通達データベース(Excel → PDF)から取得します。省エネ関連の告示第265号・第266号は国交省 PDF から直接取得します。見つからない場合は e-Gov API のキーワード検索にフォールバックします。
501
-
502
- | 告示名 | 分野 |
503
- | -------------------------------------------------------------------------------------------- | ------------------------ |
504
- | 耐火構造の構造方法を定める件 | 防火・耐火 |
505
- | 準耐火構造の構造方法を定める件 | 防火・耐火 |
506
- | 防火構造の構造方法を定める件 | 防火・耐火 |
507
- | 不燃材料を定める件 | 防火・耐火 |
508
- | 採光に有効な部分の面積の算定方法を定める件 | 採光 |
509
- | 避難安全検証法に関する算出方法等を定める件 | 避難 |
510
- | 許容応力度計算等の方法を定める件 | 構造 |
511
- | 建築物エネルギー消費性能基準等を定める省令における算出方法等に係る事項 | 省エネ(UA値) |
512
- | 住宅部分の外壁、窓等を通しての熱の損失の防止に関する基準及び一次エネルギー消費量に関する基準 | 省エネ(断熱等性能等級) |
527
+ ## 告示の取得
528
+
529
+ e-Gov API は告示を収録していないため、`get_kokuji` は国土交通省の告示・通達データベース(Excel → PDF)から正式名称で動的に取得します。見つからない場合は e-Gov API のキーワード検索にフォールバックします。
530
+
531
+ ハードコードされたプリセットは持たず、常に最新の告示データベースから取得するため、改正後も陳腐化しません。
532
+
533
+ ```
534
+ 耐火構造の構造方法を定める件を取得して
535
+ → get_kokuji(kokuji_name="耐火構造の構造方法を定める件")
536
+
537
+ 木造建築物の軸組の設置の基準を定める件を取得して
538
+ → get_kokuji(kokuji_name="木造建築物の軸組の設置の基準を定める件")
539
+ ```
513
540
 
514
541
  ## 法令解決の仕組み
515
542
 
@@ -1,5 +1,4 @@
1
- import { getLawData } from "./egov-client.js";
2
- import { parseArticleStructured } from "./egov-parser.js";
1
+ import { fetchParsedArticle } from "./article-fetcher.js";
3
2
  import { formatArticleRef } from "./errors.js";
4
3
  import { resolveLawId } from "./law-resolver.js";
5
4
  const PREVIEW_LENGTH = 100;
@@ -60,8 +59,8 @@ export async function analyzeArticle(lawName, articleNumber) {
60
59
  if (!resolved) {
61
60
  throw new Error(`法令「${lawName}」が見つかりませんでした。`);
62
61
  }
63
- const lawData = await getLawData(resolved.law_id);
64
- const article = parseArticleStructured(lawData.law_full_text, articleNumber);
62
+ const fetched = await fetchParsedArticle(resolved.law_id, articleNumber, "structured");
63
+ const article = fetched?.article;
65
64
  if (!article) {
66
65
  throw new Error(`${resolved.title}に${formatArticleRef(articleNumber)}が見つかりませんでした。`);
67
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"article-analyzer.js","sourceRoot":"","sources":["../../src/lib/article-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"article-analyzer.js","sourceRoot":"","sources":["../../src/lib/article-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { EgovLawDataResponse, EgovRevisionInfo, ParsedArticle, StructuredArticle } from "./types.js";
2
+ export interface FetchedArticle<T> {
3
+ article: T;
4
+ revision?: Pick<EgovRevisionInfo, "law_revision_id" | "amendment_enforcement_date" | "current_revision_status">;
5
+ revisionNote?: string;
6
+ }
7
+ /** Choose the smallest API response that can satisfy the request. */
8
+ export declare function fetchArticleData(lawId: string, articleNumber: string): Promise<EgovLawDataResponse | null>;
9
+ /** Resolve amendment supplements against a matching revision only after a miss. */
10
+ export declare function fetchParsedArticle(lawId: string, articleNumber: string, format?: "text"): Promise<FetchedArticle<ParsedArticle> | null>;
11
+ export declare function fetchParsedArticle(lawId: string, articleNumber: string, format: "structured"): Promise<FetchedArticle<StructuredArticle> | null>;
12
+ export declare function fetchParsedArticle(lawId: string, articleNumber: string, format: "text" | "structured"): Promise<FetchedArticle<ParsedArticle | StructuredArticle> | null>;
@@ -0,0 +1,65 @@
1
+ import { getLawArticle, getLawData, getLawDataByRevision, getLawRevisions, } from "./egov-client.js";
2
+ import { detectSpecialSection, findAmendmentSupplProvision, getSupplProvisionArticleNumbers, matchAmendLawNum, parseArticle, parseArticleStructured, toArticleElm, } from "./egov-parser.js";
3
+ import { ArticleNotFoundError } from "./errors.js";
4
+ /** Choose the smallest API response that can satisfy the request. */
5
+ export async function fetchArticleData(lawId, articleNumber) {
6
+ const elm = toArticleElm(articleNumber);
7
+ return elm !== null ? await getLawArticle(lawId, elm) : await getLawData(lawId);
8
+ }
9
+ export async function fetchParsedArticle(lawId, articleNumber, format = "text") {
10
+ const data = await fetchArticleData(lawId, articleNumber);
11
+ if (!data)
12
+ return null;
13
+ const parse = format === "structured" ? parseArticleStructured : parseArticle;
14
+ const article = parse(data.law_full_text, articleNumber);
15
+ if (article)
16
+ return { article };
17
+ const special = detectSpecialSection(articleNumber);
18
+ if (special?.type !== "suppl_amendment" &&
19
+ special?.type !== "suppl_amendment_article") {
20
+ return null;
21
+ }
22
+ const revisions = await getLawRevisions(lawId);
23
+ const revision = revisions.revisions.find((entry) => entry.law_revision_id !== data.revision_info.law_revision_id &&
24
+ matchAmendLawNum(special.amendLawNum, entry.amendment_law_num));
25
+ let missingData = data;
26
+ if (revision) {
27
+ const revisionData = await getLawDataByRevision(revision.law_revision_id);
28
+ const revisedArticle = parse(revisionData.law_full_text, articleNumber);
29
+ if (revisedArticle) {
30
+ const metadata = {
31
+ law_revision_id: revision.law_revision_id,
32
+ amendment_enforcement_date: revision.amendment_enforcement_date,
33
+ current_revision_status: revision.current_revision_status,
34
+ };
35
+ const label = revision.current_revision_status === "UnEnforced"
36
+ ? "未施行の改正"
37
+ : "別の改正";
38
+ return {
39
+ article: revisedArticle,
40
+ revision: metadata,
41
+ revisionNote: `※ この附則は${label}(施行日 ${revision.amendment_enforcement_date})の法令データから取得しました。`,
42
+ };
43
+ }
44
+ if (findAmendmentSupplProvision(revisionData.law_full_text, special.amendLawNum)) {
45
+ missingData = revisionData;
46
+ }
47
+ }
48
+ if (special.type === "suppl_amendment_article") {
49
+ const suppl = findAmendmentSupplProvision(missingData.law_full_text, special.amendLawNum);
50
+ if (suppl) {
51
+ const numbers = getSupplProvisionArticleNumbers(suppl).map((num) => {
52
+ const [main, ...branches] = num.split("_");
53
+ return `第${main}条${branches.map((branch) => `の${branch}`).join("")}`;
54
+ });
55
+ const title = missingData.revision_info.law_title;
56
+ const qualifier = suppl.attr?.["Extract"] === "true" ? "は抄録で、" : "には";
57
+ const contents = numbers.length > 0
58
+ ? `${numbers.join("・")}のみ収録されています。`
59
+ : "条番号付きの条文は収録されていません。";
60
+ throw new ArticleNotFoundError(articleNumber, title, `${title}の附則(${special.amendLawNum})${qualifier}${contents}`);
61
+ }
62
+ }
63
+ return null;
64
+ }
65
+ //# sourceMappingURL=article-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-fetcher.js","sourceRoot":"","sources":["../../src/lib/article-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import { z } from "zod";
2
+ import type { StructuredSubitem } from "./types.js";
3
+ export declare const parsedArticleSchema: z.ZodObject<{
4
+ article_num: z.ZodString;
5
+ article_caption: z.ZodString;
6
+ article_title: z.ZodString;
7
+ text: z.ZodString;
8
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
9
+ raw_text: z.ZodString;
10
+ ref_type: z.ZodEnum<["same_law", "cross_law", "relative", "delegation", "unknown"]>;
11
+ target_law: z.ZodOptional<z.ZodString>;
12
+ target_article: z.ZodOptional<z.ZodString>;
13
+ target_paragraph: z.ZodOptional<z.ZodString>;
14
+ target_item: z.ZodOptional<z.ZodString>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ raw_text: string;
17
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
18
+ target_law?: string | undefined;
19
+ target_article?: string | undefined;
20
+ target_paragraph?: string | undefined;
21
+ target_item?: string | undefined;
22
+ }, {
23
+ raw_text: string;
24
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
25
+ target_law?: string | undefined;
26
+ target_article?: string | undefined;
27
+ target_paragraph?: string | undefined;
28
+ target_item?: string | undefined;
29
+ }>, "many">>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ text: string;
32
+ article_num: string;
33
+ article_caption: string;
34
+ article_title: string;
35
+ references?: {
36
+ raw_text: string;
37
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
38
+ target_law?: string | undefined;
39
+ target_article?: string | undefined;
40
+ target_paragraph?: string | undefined;
41
+ target_item?: string | undefined;
42
+ }[] | undefined;
43
+ }, {
44
+ text: string;
45
+ article_num: string;
46
+ article_caption: string;
47
+ article_title: string;
48
+ references?: {
49
+ raw_text: string;
50
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
51
+ target_law?: string | undefined;
52
+ target_article?: string | undefined;
53
+ target_paragraph?: string | undefined;
54
+ target_item?: string | undefined;
55
+ }[] | undefined;
56
+ }>;
57
+ export declare const structuredArticleSchema: z.ZodObject<{
58
+ article_num: z.ZodString;
59
+ article_caption: z.ZodString;
60
+ article_title: z.ZodString;
61
+ paragraphs: z.ZodArray<z.ZodObject<{
62
+ paragraph_num: z.ZodString;
63
+ paragraph_sentence: z.ZodString;
64
+ items: z.ZodArray<z.ZodObject<{
65
+ item_num: z.ZodString;
66
+ item_title: z.ZodString;
67
+ item_sentence: z.ZodString;
68
+ subitems: z.ZodArray<z.ZodType<StructuredSubitem, z.ZodTypeDef, StructuredSubitem>, "many">;
69
+ }, "strip", z.ZodTypeAny, {
70
+ subitems: StructuredSubitem[];
71
+ item_num: string;
72
+ item_title: string;
73
+ item_sentence: string;
74
+ }, {
75
+ subitems: StructuredSubitem[];
76
+ item_num: string;
77
+ item_title: string;
78
+ item_sentence: string;
79
+ }>, "many">;
80
+ }, "strip", z.ZodTypeAny, {
81
+ paragraph_num: string;
82
+ paragraph_sentence: string;
83
+ items: {
84
+ subitems: StructuredSubitem[];
85
+ item_num: string;
86
+ item_title: string;
87
+ item_sentence: string;
88
+ }[];
89
+ }, {
90
+ paragraph_num: string;
91
+ paragraph_sentence: string;
92
+ items: {
93
+ subitems: StructuredSubitem[];
94
+ item_num: string;
95
+ item_title: string;
96
+ item_sentence: string;
97
+ }[];
98
+ }>, "many">;
99
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
100
+ raw_text: z.ZodString;
101
+ ref_type: z.ZodEnum<["same_law", "cross_law", "relative", "delegation", "unknown"]>;
102
+ target_law: z.ZodOptional<z.ZodString>;
103
+ target_article: z.ZodOptional<z.ZodString>;
104
+ target_paragraph: z.ZodOptional<z.ZodString>;
105
+ target_item: z.ZodOptional<z.ZodString>;
106
+ }, "strip", z.ZodTypeAny, {
107
+ raw_text: string;
108
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
109
+ target_law?: string | undefined;
110
+ target_article?: string | undefined;
111
+ target_paragraph?: string | undefined;
112
+ target_item?: string | undefined;
113
+ }, {
114
+ raw_text: string;
115
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
116
+ target_law?: string | undefined;
117
+ target_article?: string | undefined;
118
+ target_paragraph?: string | undefined;
119
+ target_item?: string | undefined;
120
+ }>, "many">>;
121
+ }, "strip", z.ZodTypeAny, {
122
+ article_num: string;
123
+ article_caption: string;
124
+ article_title: string;
125
+ paragraphs: {
126
+ paragraph_num: string;
127
+ paragraph_sentence: string;
128
+ items: {
129
+ subitems: StructuredSubitem[];
130
+ item_num: string;
131
+ item_title: string;
132
+ item_sentence: string;
133
+ }[];
134
+ }[];
135
+ references?: {
136
+ raw_text: string;
137
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
138
+ target_law?: string | undefined;
139
+ target_article?: string | undefined;
140
+ target_paragraph?: string | undefined;
141
+ target_item?: string | undefined;
142
+ }[] | undefined;
143
+ }, {
144
+ article_num: string;
145
+ article_caption: string;
146
+ article_title: string;
147
+ paragraphs: {
148
+ paragraph_num: string;
149
+ paragraph_sentence: string;
150
+ items: {
151
+ subitems: StructuredSubitem[];
152
+ item_num: string;
153
+ item_title: string;
154
+ item_sentence: string;
155
+ }[];
156
+ }[];
157
+ references?: {
158
+ raw_text: string;
159
+ ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
160
+ target_law?: string | undefined;
161
+ target_article?: string | undefined;
162
+ target_paragraph?: string | undefined;
163
+ target_item?: string | undefined;
164
+ }[] | undefined;
165
+ }>;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ const articleReferenceSchema = z.object({
3
+ raw_text: z.string(),
4
+ ref_type: z.enum([
5
+ "same_law",
6
+ "cross_law",
7
+ "relative",
8
+ "delegation",
9
+ "unknown",
10
+ ]),
11
+ target_law: z.string().optional(),
12
+ target_article: z.string().optional(),
13
+ target_paragraph: z.string().optional(),
14
+ target_item: z.string().optional(),
15
+ });
16
+ export const parsedArticleSchema = z.object({
17
+ article_num: z.string(),
18
+ article_caption: z.string(),
19
+ article_title: z.string(),
20
+ text: z.string(),
21
+ references: z.array(articleReferenceSchema).optional(),
22
+ });
23
+ const structuredSubitemSchema = z.lazy(() => z.object({
24
+ subitem_num: z.string(),
25
+ subitem_title: z.string(),
26
+ subitem_sentence: z.string(),
27
+ subitems: z.array(structuredSubitemSchema),
28
+ }));
29
+ const structuredItemSchema = z.object({
30
+ item_num: z.string(),
31
+ item_title: z.string(),
32
+ item_sentence: z.string(),
33
+ subitems: z.array(structuredSubitemSchema),
34
+ });
35
+ const structuredParagraphSchema = z.object({
36
+ paragraph_num: z.string(),
37
+ paragraph_sentence: z.string(),
38
+ items: z.array(structuredItemSchema),
39
+ });
40
+ export const structuredArticleSchema = z.object({
41
+ article_num: z.string(),
42
+ article_caption: z.string(),
43
+ article_title: z.string(),
44
+ paragraphs: z.array(structuredParagraphSchema),
45
+ references: z.array(articleReferenceSchema).optional(),
46
+ });
47
+ //# sourceMappingURL=article-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-schemas.js","sourceRoot":"","sources":["../../src/lib/article-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;QACf,UAAU;QACV,WAAW;QACX,UAAU;QACV,YAAY;QACZ,SAAS;KACV,CAAC;IACF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAiC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACxE,CAAC,CAAC,MAAM,CAAC;IACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC,CACH,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAC"}
@@ -1,6 +1,5 @@
1
- import { getLawData } from "./egov-client.js";
2
- import { parseArticle } from "./egov-parser.js";
3
- import { formatArticleRef } from "./errors.js";
1
+ import { fetchParsedArticle } from "./article-fetcher.js";
2
+ import { ArticleNotFoundError, formatArticleRef } from "./errors.js";
4
3
  import { resolveLawId } from "./law-resolver.js";
5
4
  const MAX_PREVIEW_LENGTH = 200;
6
5
  /**
@@ -86,8 +85,8 @@ export async function verifyCitation(lawName, articleNumber, claimedText) {
86
85
  error_message: `法令「${lawName}」が見つかりませんでした。`,
87
86
  };
88
87
  }
89
- const lawData = await getLawData(resolved.law_id);
90
- const article = parseArticle(lawData.law_full_text, articleNumber);
88
+ const fetched = await fetchParsedArticle(resolved.law_id, articleNumber, "text");
89
+ const article = fetched?.article;
91
90
  if (!article) {
92
91
  return {
93
92
  law_name: resolved.title,
@@ -131,7 +130,7 @@ export async function verifyCitation(lawName, articleNumber, claimedText) {
131
130
  return {
132
131
  law_name: lawName,
133
132
  article_number: articleNumber,
134
- status: "error",
133
+ status: error instanceof ArticleNotFoundError ? "article_not_found" : "error",
135
134
  error_message: error instanceof Error ? error.message : String(error),
136
135
  };
137
136
  }
@@ -1 +1 @@
1
- {"version":3,"file":"citation-verifier.js","sourceRoot":"","sources":["../../src/lib/citation-verifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"citation-verifier.js","sourceRoot":"","sources":["../../src/lib/citation-verifier.ts"],"names":[],"mappings":"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"}