building-standards-act-mcp 1.4.1 → 1.6.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 +5 -0
- package/dist/lib/egov-client.d.ts +8 -0
- package/dist/lib/egov-client.js +12 -0
- package/dist/lib/egov-client.js.map +1 -1
- package/dist/lib/mlit-client.js +1 -1
- package/dist/lib/pdf-extractor.js +1 -1
- package/dist/lib/revision-tracker.d.ts +10 -1
- package/dist/lib/revision-tracker.js +30 -12
- package/dist/lib/revision-tracker.js.map +1 -1
- package/dist/lib/tool-helpers.d.ts +31 -0
- package/dist/lib/tool-helpers.js +107 -0
- package/dist/lib/tool-helpers.js.map +1 -0
- package/dist/server.js +1 -1
- package/dist/tools/analyze-article.js +12 -20
- package/dist/tools/analyze-article.js.map +1 -1
- package/dist/tools/check-law-updates.js +43 -48
- package/dist/tools/check-law-updates.js.map +1 -1
- package/dist/tools/get-full-law.js +20 -28
- package/dist/tools/get-full-law.js.map +1 -1
- package/dist/tools/get-kokuji.js +110 -118
- package/dist/tools/get-kokuji.js.map +1 -1
- package/dist/tools/get-law.js +58 -66
- package/dist/tools/get-law.js.map +1 -1
- package/dist/tools/get-laws-batch.js +125 -133
- package/dist/tools/get-laws-batch.js.map +1 -1
- package/dist/tools/get-metrics.js +3 -2
- package/dist/tools/get-metrics.js.map +1 -1
- package/dist/tools/search-law.js +29 -37
- package/dist/tools/search-law.js.map +1 -1
- package/dist/tools/suggest-related.js +6 -14
- package/dist/tools/suggest-related.js.map +1 -1
- package/dist/tools/verify-citation.js +27 -35
- package/dist/tools/verify-citation.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -44,6 +44,7 @@ Vercel にデプロイすると、Claude.ai からすぐに使えます。環境
|
|
|
44
44
|
|
|
45
45
|
- 関数の実行時間が **10 秒** に制限されます(Pro プランでは 60 秒)
|
|
46
46
|
- `get_kokuji`(告示取得)は PDF ダウンロード + パースが重いため、タイムアウトする場合があります
|
|
47
|
+
- `check_law_updates` の大規模グループ(9章: 53法令)は Free tier ではタイムアウトする場合があります(Pro プランでは並行実行により対応可能)
|
|
47
48
|
- `BUILDING_LAW_REQUEST_TIMEOUT=8000` を設定してタイムアウトを短縮できます
|
|
48
49
|
|
|
49
50
|
---
|
|
@@ -528,6 +529,8 @@ e-Gov API は告示を収録していないため、`get_kokuji` は国土交通
|
|
|
528
529
|
| `BUILDING_LAW_CACHE_DIR` | ファイルキャッシュの保存先ディレクトリ | `~/.cache/building-standards-act-mcp/` |
|
|
529
530
|
| `BUILDING_LAW_LOG_LEVEL` | ログレベル(`debug` / `info` / `warn` / `error`) | `info` |
|
|
530
531
|
| `BUILDING_LAW_REQUEST_TIMEOUT` | API リクエストタイムアウト(ミリ秒) | `30000` |
|
|
532
|
+
| `BUILDING_LAW_RATE_LIMIT_MS` | API 呼び出し間隔(ミリ秒) | `200` |
|
|
533
|
+
| `BUILDING_LAW_CONCURRENCY` | 最大並行 API 呼び出し数 | `5` |
|
|
531
534
|
|
|
532
535
|
### 永続キャッシュの有効化
|
|
533
536
|
|
|
@@ -557,7 +560,9 @@ e-Gov API は告示を収録していないため、`get_kokuji` は国土交通
|
|
|
557
560
|
| 告示 PDF テキストキャッシュ | 24 時間 |
|
|
558
561
|
| リビジョン履歴キャッシュ TTL | 1 時間 |
|
|
559
562
|
| リクエストタイムアウト | 30 秒(環境変数で変更可能) |
|
|
563
|
+
| API 並行呼び出し | 最大 5 並行(200ms 間隔) |
|
|
560
564
|
| Vercel デプロイ | 対応(MCP-over-HTTP + REST API) |
|
|
565
|
+
| Vercel 関数タイムアウト | 60 秒(maxDuration) |
|
|
561
566
|
| Node.js | >= 20.0.0 |
|
|
562
567
|
|
|
563
568
|
## セキュリティ
|
|
@@ -18,3 +18,11 @@ export declare function getLawData(lawId: string): Promise<EgovLawDataResponse>;
|
|
|
18
18
|
* Uses GET /api/2/law_revisions/{lawId}
|
|
19
19
|
*/
|
|
20
20
|
export declare function getLawRevisions(lawId: string): Promise<EgovLawRevisionsResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* Check whether revisions for the given lawId are already cached.
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasRevisionsCached(lawId: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Check whether search results for the given lawTitle are already cached.
|
|
27
|
+
*/
|
|
28
|
+
export declare function hasSearchCached(lawTitle: string): boolean;
|
package/dist/lib/egov-client.js
CHANGED
|
@@ -124,4 +124,16 @@ export async function getLawRevisions(lawId) {
|
|
|
124
124
|
revisionsCache.set(cacheKey, result);
|
|
125
125
|
return result;
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Check whether revisions for the given lawId are already cached.
|
|
129
|
+
*/
|
|
130
|
+
export function hasRevisionsCached(lawId) {
|
|
131
|
+
return revisionsCache.has(`revisions:${lawId}`);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check whether search results for the given lawTitle are already cached.
|
|
135
|
+
*/
|
|
136
|
+
export function hasSearchCached(lawTitle) {
|
|
137
|
+
return searchCache.has(`search:${lawTitle}`);
|
|
138
|
+
}
|
|
127
139
|
//# sourceMappingURL=egov-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"egov-client.js","sourceRoot":"","sources":["../../src/lib/egov-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAO5D,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AAClD,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AACtD,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAC3D,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AACrD,MAAM,eAAe,GACnB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,MAAM,CAAC,CAAC,aAAa;AAE3E,MAAM,WAAW,GAAG,WAAW,CAC7B,QAAQ,EACR,gBAAgB,CACjB,CAAC;AACF,MAAM,YAAY,GAAG,WAAW,CAC9B,UAAU,EACV,kBAAkB,CACnB,CAAC;AACF,MAAM,cAAc,GAAG,WAAW,CAChC,WAAW,EACX,mBAAmB,CACpB,CAAC;AAEF,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;AAE5C,2CAA2C;AAC3C,IAAI,YAAY,GAAoD,EAAE,CAAC;AAEvE,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAC9B,IAAqD;IAErD,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,oBAAoB;IAClC,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,YAAY,CAAI,GAAW;IACxC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,YAAY,CACpB,sBAAsB,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,EAC/D,QAAQ,CAAC,MAAM,EACf,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,IAAI,YAAY,CAAC,6BAA6B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,IAAI,YAAY,CACpB,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACrF,SAAS,EACT,GAAG,CACJ,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAI,GAAW;IACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAC/C,SAAS,CAAC,GAAG,EAAE,CAAC,YAAY,CAAI,GAAG,CAAC,EAAE,YAAY,CAAC,CACpD,CAAC;QACF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC7B,QAAQ;YACR,MAAM;YACN,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SACvB,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB;IAEhB,MAAM,QAAQ,GAAG,UAAU,QAAQ,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,GAAG,QAAQ,mBAAmB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAwB,GAAG,CAAC,CAAC;IAE3D,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,MAAM,QAAQ,GAAG,OAAO,KAAK,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,GAAG,QAAQ,aAAa,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAsB,GAAG,CAAC,CAAC;IAEzD,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAa;IAEb,MAAM,QAAQ,GAAG,aAAa,KAAK,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAG,GAAG,QAAQ,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,SAAS,CAA2B,GAAG,CAAC,CAAC;IAE9D,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"egov-client.js","sourceRoot":"","sources":["../../src/lib/egov-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/mlit-client.js
CHANGED
|
@@ -5,7 +5,7 @@ const EXCEL_URL_CACHE_TTL = 6 * 60 * 60 * 1000; // 6 hours
|
|
|
5
5
|
const EXCEL_DATA_CACHE_TTL = 6 * 60 * 60 * 1000; // 6 hours
|
|
6
6
|
const REQUEST_TIMEOUT = 30_000; // 30 seconds
|
|
7
7
|
// User-Agent for MLIT requests — some government sites block requests without it
|
|
8
|
-
const MLIT_USER_AGENT = "BuildingStandardsActMCP/1.
|
|
8
|
+
const MLIT_USER_AGENT = "BuildingStandardsActMCP/1.5 (https://github.com/Sora-bluesky/building-standards-act-mcp)";
|
|
9
9
|
// Column indices in the Excel spreadsheet (0-based)
|
|
10
10
|
const COL_TITLE = 0;
|
|
11
11
|
const COL_DOCUMENT_NUMBER = 1;
|
|
@@ -46,7 +46,7 @@ export function isAllowedPdfUrl(url) {
|
|
|
46
46
|
return false;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
const PDF_USER_AGENT = "BuildingStandardsActMCP/1.
|
|
49
|
+
const PDF_USER_AGENT = "BuildingStandardsActMCP/1.5 (https://github.com/Sora-bluesky/building-standards-act-mcp)";
|
|
50
50
|
const pdfTextCache = createCache("pdf-text", PDF_TEXT_CACHE_TTL);
|
|
51
51
|
/**
|
|
52
52
|
* Fetch a PDF binary from a URL with timeout handling.
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import type { ResolvedLaw, LawUpdateCheckResult } from "./types.js";
|
|
2
|
+
export declare const RATE_LIMIT_DELAY_MS: number;
|
|
3
|
+
export declare const CONCURRENCY: number;
|
|
4
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Run an async mapper over items with bounded concurrency.
|
|
7
|
+
* Preserves input order in the returned results array.
|
|
8
|
+
*/
|
|
9
|
+
export declare function mapWithConcurrency<T, R>(items: T[], mapper: (item: T) => Promise<R>, concurrency: number): Promise<R[]>;
|
|
2
10
|
/**
|
|
3
11
|
* Check if a single resolved law has revisions or has been repealed.
|
|
4
12
|
*/
|
|
5
13
|
export declare function checkLawUpdate(resolved: ResolvedLaw): Promise<LawUpdateCheckResult>;
|
|
6
14
|
/**
|
|
7
|
-
* Check multiple resolved laws for updates with
|
|
15
|
+
* Check multiple resolved laws for updates with bounded concurrency.
|
|
16
|
+
* Rate-limit delay is applied only when the revisions response was NOT cached.
|
|
8
17
|
*/
|
|
9
18
|
export declare function checkLawUpdates(resolvedLaws: ResolvedLaw[]): Promise<LawUpdateCheckResult[]>;
|
|
10
19
|
/**
|
|
@@ -1,8 +1,27 @@
|
|
|
1
|
-
import { getLawRevisions } from "./egov-client.js";
|
|
2
|
-
const
|
|
3
|
-
|
|
1
|
+
import { getLawRevisions, hasRevisionsCached } from "./egov-client.js";
|
|
2
|
+
const DEFAULT_RATE_LIMIT_MS = 200;
|
|
3
|
+
export const RATE_LIMIT_DELAY_MS = Number(process.env.BUILDING_LAW_RATE_LIMIT_MS) || DEFAULT_RATE_LIMIT_MS;
|
|
4
|
+
const DEFAULT_CONCURRENCY = 5;
|
|
5
|
+
export const CONCURRENCY = Number(process.env.BUILDING_LAW_CONCURRENCY) || DEFAULT_CONCURRENCY;
|
|
6
|
+
export function sleep(ms) {
|
|
4
7
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Run an async mapper over items with bounded concurrency.
|
|
11
|
+
* Preserves input order in the returned results array.
|
|
12
|
+
*/
|
|
13
|
+
export async function mapWithConcurrency(items, mapper, concurrency) {
|
|
14
|
+
const results = new Array(items.length);
|
|
15
|
+
let nextIndex = 0;
|
|
16
|
+
async function worker() {
|
|
17
|
+
while (nextIndex < items.length) {
|
|
18
|
+
const index = nextIndex++;
|
|
19
|
+
results[index] = await mapper(items[index]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
|
|
23
|
+
return results;
|
|
24
|
+
}
|
|
6
25
|
/**
|
|
7
26
|
* Check if a single resolved law has revisions or has been repealed.
|
|
8
27
|
*/
|
|
@@ -51,19 +70,18 @@ export async function checkLawUpdate(resolved) {
|
|
|
51
70
|
}
|
|
52
71
|
}
|
|
53
72
|
/**
|
|
54
|
-
* Check multiple resolved laws for updates with
|
|
73
|
+
* Check multiple resolved laws for updates with bounded concurrency.
|
|
74
|
+
* Rate-limit delay is applied only when the revisions response was NOT cached.
|
|
55
75
|
*/
|
|
56
76
|
export async function checkLawUpdates(resolvedLaws) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const result = await checkLawUpdate(
|
|
60
|
-
|
|
61
|
-
// Rate limiting: wait between API calls (skip after the last one)
|
|
62
|
-
if (i < resolvedLaws.length - 1) {
|
|
77
|
+
return mapWithConcurrency(resolvedLaws, async (resolved) => {
|
|
78
|
+
const wasCached = hasRevisionsCached(resolved.law_id);
|
|
79
|
+
const result = await checkLawUpdate(resolved);
|
|
80
|
+
if (!wasCached) {
|
|
63
81
|
await sleep(RATE_LIMIT_DELAY_MS);
|
|
64
82
|
}
|
|
65
|
-
|
|
66
|
-
|
|
83
|
+
return result;
|
|
84
|
+
}, CONCURRENCY);
|
|
67
85
|
}
|
|
68
86
|
/**
|
|
69
87
|
* Get full revision history for a single resolved law.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revision-tracker.js","sourceRoot":"","sources":["../../src/lib/revision-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"revision-tracker.js","sourceRoot":"","sources":["../../src/lib/revision-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,mBAAmB,GAC9B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,qBAAqB,CAAC;AAC1E,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,WAAW,GACtB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,mBAAmB,CAAC;AAEtE,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAU,EACV,MAA+B,EAC/B,WAAmB;IAEnB,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,UAAU,MAAM;QACnB,OAAO,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAC5E,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAqB;IAErB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QAErC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,MAAM,EAAE,SAAS;aAClB,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAE5B,mBAAmB;QACnB,IACE,MAAM,CAAC,aAAa,KAAK,EAAE;YAC3B,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,MAAM,EAC7C,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,MAAM,EAAE,UAAU;gBAClB,qBAAqB,EAAE,MAAM,CAAC,yBAAyB;gBACvD,oBAAoB,EAClB,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC,iBAAiB;aACzD,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,yBAAyB,CAAC;QACvD,MAAM,YAAY,GAAG,aAAa,KAAK,EAAE,CAAC;QAE1C,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YAClD,qBAAqB,EAAE,aAAa,IAAI,SAAS;YACjD,oBAAoB,EAClB,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC,iBAAiB,IAAI,SAAS;SACtE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAA2B;IAE3B,OAAO,kBAAkB,CACvB,YAAY,EACZ,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,WAAW,CACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAqB;IAErB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,MAAM,EAAE,yBAAyB,IAAI,EAAE,CAAC;QAC9D,MAAM,UAAU,GACd,MAAM;YACN,MAAM,CAAC,aAAa,KAAK,EAAE;YAC3B,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;QAChD,MAAM,YAAY,GAAG,CAAC,UAAU,IAAI,aAAa,KAAK,EAAE,CAAC;QAEzD,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM,EAAE,UAAU;gBAChB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,YAAY;oBACZ,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,SAAS;YACf,qBAAqB,EAAE,aAAa,IAAI,SAAS;YACjD,oBAAoB,EAClB,MAAM,EAAE,mBAAmB,IAAI,MAAM,EAAE,iBAAiB,IAAI,SAAS;YACvE,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACtE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for MCP tool handlers:
|
|
3
|
+
* - Error sanitization (Measure 5: hide internal details from client)
|
|
4
|
+
* - Audit logging (Measure 6: log tool invocations and results)
|
|
5
|
+
*/
|
|
6
|
+
/** MCP CallToolResult shape (minimal interface to avoid SDK dependency). */
|
|
7
|
+
interface ToolResult {
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
content: Array<{
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}>;
|
|
13
|
+
isError?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Generic tool handler function signature. */
|
|
16
|
+
type ToolHandler<T> = (params: T, extra?: unknown) => Promise<ToolResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Classify an error and return a sanitized user-facing message.
|
|
19
|
+
* Known user-friendly errors pass through; unknown errors are replaced
|
|
20
|
+
* with a generic message. Full details are always logged server-side.
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleToolError(toolName: string, error: unknown): ToolResult;
|
|
23
|
+
/**
|
|
24
|
+
* Wrap a tool handler with audit logging and error sanitization.
|
|
25
|
+
*
|
|
26
|
+
* - On entry: logs tool invocation with input params
|
|
27
|
+
* - On success: logs result status and duration, records metrics
|
|
28
|
+
* - On thrown error: sanitizes response, logs full details, records metrics
|
|
29
|
+
*/
|
|
30
|
+
export declare function wrapToolHandler<T>(toolName: string, handler: ToolHandler<T>): ToolHandler<T>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for MCP tool handlers:
|
|
3
|
+
* - Error sanitization (Measure 5: hide internal details from client)
|
|
4
|
+
* - Audit logging (Measure 6: log tool invocations and results)
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from "./logger.js";
|
|
7
|
+
import { recordToolCall } from "./metrics.js";
|
|
8
|
+
import { LawNotFoundError, ArticleNotFoundError, KokujiNotFoundError, } from "./errors.js";
|
|
9
|
+
import { EgovApiError } from "./errors.js";
|
|
10
|
+
/**
|
|
11
|
+
* Classify an error and return a sanitized user-facing message.
|
|
12
|
+
* Known user-friendly errors pass through; unknown errors are replaced
|
|
13
|
+
* with a generic message. Full details are always logged server-side.
|
|
14
|
+
*/
|
|
15
|
+
export function handleToolError(toolName, error) {
|
|
16
|
+
const isError = error instanceof Error;
|
|
17
|
+
const message = isError ? error.message : String(error);
|
|
18
|
+
const stack = isError ? error.stack : undefined;
|
|
19
|
+
const errorType = isError ? error.constructor.name : typeof error;
|
|
20
|
+
// Always log full details server-side
|
|
21
|
+
logger.error("tool_error", {
|
|
22
|
+
tool: toolName,
|
|
23
|
+
errorType,
|
|
24
|
+
message,
|
|
25
|
+
...(stack ? { stack } : {}),
|
|
26
|
+
...(error instanceof EgovApiError && error.statusCode !== undefined
|
|
27
|
+
? { statusCode: error.statusCode }
|
|
28
|
+
: {}),
|
|
29
|
+
...(error instanceof EgovApiError && error.endpoint !== undefined
|
|
30
|
+
? { endpoint: error.endpoint }
|
|
31
|
+
: {}),
|
|
32
|
+
});
|
|
33
|
+
// Known user-friendly errors: pass through their message
|
|
34
|
+
if (error instanceof LawNotFoundError ||
|
|
35
|
+
error instanceof ArticleNotFoundError ||
|
|
36
|
+
error instanceof KokujiNotFoundError) {
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: `エラー: ${error.message}` }],
|
|
39
|
+
isError: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// EgovApiError: hide status code and endpoint
|
|
43
|
+
if (error instanceof EgovApiError) {
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: "text",
|
|
48
|
+
text: "エラー: e-Gov APIとの通信中にエラーが発生しました。時間をおいて再度お試しください。",
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
isError: true,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Generic Error: hide internal details
|
|
55
|
+
if (isError) {
|
|
56
|
+
return {
|
|
57
|
+
content: [
|
|
58
|
+
{
|
|
59
|
+
type: "text",
|
|
60
|
+
text: "エラー: 内部エラーが発生しました。時間をおいて再度お試しください。",
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
isError: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Non-Error throw
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{ type: "text", text: "エラー: 予期しないエラーが発生しました。" },
|
|
70
|
+
],
|
|
71
|
+
isError: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Wrap a tool handler with audit logging and error sanitization.
|
|
76
|
+
*
|
|
77
|
+
* - On entry: logs tool invocation with input params
|
|
78
|
+
* - On success: logs result status and duration, records metrics
|
|
79
|
+
* - On thrown error: sanitizes response, logs full details, records metrics
|
|
80
|
+
*/
|
|
81
|
+
export function wrapToolHandler(toolName, handler) {
|
|
82
|
+
return async (params, extra) => {
|
|
83
|
+
const start = Date.now();
|
|
84
|
+
logger.info("tool_call", {
|
|
85
|
+
tool: toolName,
|
|
86
|
+
params: params,
|
|
87
|
+
});
|
|
88
|
+
try {
|
|
89
|
+
const result = await handler(params, extra);
|
|
90
|
+
const durationMs = Date.now() - start;
|
|
91
|
+
const hasError = result.isError === true;
|
|
92
|
+
logger.info("tool_result", {
|
|
93
|
+
tool: toolName,
|
|
94
|
+
durationMs,
|
|
95
|
+
isError: hasError,
|
|
96
|
+
});
|
|
97
|
+
recordToolCall(toolName, durationMs, !hasError);
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const durationMs = Date.now() - start;
|
|
102
|
+
recordToolCall(toolName, durationMs, false);
|
|
103
|
+
return handleToolError(toolName, error);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=tool-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-helpers.js","sourceRoot":"","sources":["../../src/lib/tool-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAc;IAC9D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC;IAElE,sCAAsC;IACtC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;QACzB,IAAI,EAAE,QAAQ;QACd,SAAS;QACT,OAAO;QACP,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;YACjE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE;YAClC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAC/D,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;YAC9B,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IAEH,yDAAyD;IACzD,IACE,KAAK,YAAY,gBAAgB;QACjC,KAAK,YAAY,oBAAoB;QACrC,KAAK,YAAY,mBAAmB,EACpC,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1D,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,iDAAiD;iBACxD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oCAAoC;iBAC3C;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE;SAChD;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,OAAuB;IAEvB,OAAO,KAAK,EAAE,MAAS,EAAE,KAAe,EAAuB,EAAE;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;YACvB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,MAAiC;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;YAEzC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE;gBACzB,IAAI,EAAE,QAAQ;gBACd,UAAU;gBACV,OAAO,EAAE,QAAQ;aAClB,CAAC,CAAC;YACH,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;YAEhD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACtC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -10,7 +10,7 @@ import { registerSuggestRelatedTool } from "./tools/suggest-related.js";
|
|
|
10
10
|
import { registerAnalyzeArticleTool } from "./tools/analyze-article.js";
|
|
11
11
|
import { registerGetMetricsTool } from "./tools/get-metrics.js";
|
|
12
12
|
const SERVER_NAME = "building-standards-act-mcp";
|
|
13
|
-
const SERVER_VERSION = "
|
|
13
|
+
const SERVER_VERSION = "1.6.0";
|
|
14
14
|
const INSTRUCTIONS = `あなたは建築確認申請の法規照合アシスタントです。
|
|
15
15
|
|
|
16
16
|
## 利用可能なツール
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { analyzeArticle } from "../lib/article-analyzer.js";
|
|
3
|
+
import { wrapToolHandler } from "../lib/tool-helpers.js";
|
|
3
4
|
const schema = {
|
|
4
5
|
law_name: z
|
|
5
6
|
.string()
|
|
@@ -8,25 +9,16 @@ const schema = {
|
|
|
8
9
|
article_number: z.string().max(100).describe("条文番号(例: 第20条、20)"),
|
|
9
10
|
};
|
|
10
11
|
export function registerAnalyzeArticleTool(server) {
|
|
11
|
-
server.tool("analyze_article", "条文の構造を解析し、項数・号数・参照統計・プレビューなどのメタデータをJSON形式で返す。AIが要約・解説を生成する際の素材データとして活用。", schema, async ({ law_name, article_number }) => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
25
|
-
return {
|
|
26
|
-
content: [{ type: "text", text: `エラー: ${message}` }],
|
|
27
|
-
isError: true,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
});
|
|
12
|
+
server.tool("analyze_article", "条文の構造を解析し、項数・号数・参照統計・プレビューなどのメタデータをJSON形式で返す。AIが要約・解説を生成する際の素材データとして活用。", schema, wrapToolHandler("analyze_article", async ({ law_name, article_number }) => {
|
|
13
|
+
const analysis = await analyzeArticle(law_name, article_number);
|
|
14
|
+
return {
|
|
15
|
+
content: [
|
|
16
|
+
{
|
|
17
|
+
type: "text",
|
|
18
|
+
text: JSON.stringify(analysis, null, 2),
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
}));
|
|
31
23
|
}
|
|
32
24
|
//# sourceMappingURL=analyze-article.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-article.js","sourceRoot":"","sources":["../../src/tools/analyze-article.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-article.js","sourceRoot":"","sources":["../../src/tools/analyze-article.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,MAAM,GAAG;IACb,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACjE,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,yEAAyE,EACzE,MAAM,EACN,eAAe,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE;QACxE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAEhE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { LawRegistry } from "../lib/law-registry.js";
|
|
3
3
|
import { resolveLawId } from "../lib/law-resolver.js";
|
|
4
|
-
import { checkLawUpdate, checkLawUpdates, getLawRevisionHistory, } from "../lib/revision-tracker.js";
|
|
4
|
+
import { checkLawUpdate, checkLawUpdates, getLawRevisionHistory, mapWithConcurrency, RATE_LIMIT_DELAY_MS, CONCURRENCY, sleep, } from "../lib/revision-tracker.js";
|
|
5
|
+
import { hasSearchCached } from "../lib/egov-client.js";
|
|
6
|
+
import { wrapToolHandler } from "../lib/tool-helpers.js";
|
|
5
7
|
const registry = new LawRegistry();
|
|
6
8
|
const schema = {
|
|
7
9
|
law_name: z
|
|
@@ -89,56 +91,49 @@ function formatHistory(result) {
|
|
|
89
91
|
return lines.join("\n");
|
|
90
92
|
}
|
|
91
93
|
export function registerCheckLawUpdatesTool(server) {
|
|
92
|
-
server.tool("check_law_updates", "法令の改正状況をe-Gov APIで確認する。法令名指定で単体チェック、グループ指定でバッチチェック、show_historyで改正履歴表示が可能。", schema, async ({ law_name, group, show_history }) => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
const result = show_history
|
|
108
|
-
? await getLawRevisionHistory(resolved)
|
|
109
|
-
: await checkLawUpdate(resolved);
|
|
110
|
-
const text = show_history
|
|
111
|
-
? formatHistory(result)
|
|
112
|
-
: formatSummary([result]);
|
|
113
|
-
return { content: [{ type: "text", text }] };
|
|
94
|
+
server.tool("check_law_updates", "法令の改正状況をe-Gov APIで確認する。法令名指定で単体チェック、グループ指定でバッチチェック、show_historyで改正履歴表示が可能。", schema, wrapToolHandler("check_law_updates", async ({ law_name, group, show_history }) => {
|
|
95
|
+
// Single law check with optional history
|
|
96
|
+
if (law_name) {
|
|
97
|
+
const resolved = await resolveLawId(law_name);
|
|
98
|
+
if (!resolved) {
|
|
99
|
+
return {
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
type: "text",
|
|
103
|
+
text: `法令「${law_name}」が見つかりませんでした。`,
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
};
|
|
114
107
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return { content: [{ type: "text", text: msg }] };
|
|
122
|
-
}
|
|
123
|
-
// Resolve each alias to get law_id
|
|
124
|
-
const resolvedLaws = [];
|
|
125
|
-
for (const alias of aliases) {
|
|
126
|
-
const resolved = await resolveLawId(alias.title);
|
|
127
|
-
if (resolved) {
|
|
128
|
-
resolvedLaws.push(resolved);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
const results = await checkLawUpdates(resolvedLaws);
|
|
132
|
-
const text = formatSummary(results);
|
|
108
|
+
const result = show_history
|
|
109
|
+
? await getLawRevisionHistory(resolved)
|
|
110
|
+
: await checkLawUpdate(resolved);
|
|
111
|
+
const text = show_history
|
|
112
|
+
? formatHistory(result)
|
|
113
|
+
: formatSummary([result]);
|
|
133
114
|
return { content: [{ type: "text", text }] };
|
|
134
115
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
116
|
+
// Batch check (group or all)
|
|
117
|
+
const aliases = group ? registry.getByGroup(group) : registry.getAll();
|
|
118
|
+
if (aliases.length === 0) {
|
|
119
|
+
const msg = group
|
|
120
|
+
? `グループ「${group}」に該当する法令が見つかりませんでした。`
|
|
121
|
+
: "登録済み法令がありません。";
|
|
122
|
+
return { content: [{ type: "text", text: msg }] };
|
|
141
123
|
}
|
|
142
|
-
|
|
124
|
+
// Resolve each alias to get law_id (concurrent with rate-limit on cache miss)
|
|
125
|
+
const resolveResults = await mapWithConcurrency(aliases, async (alias) => {
|
|
126
|
+
const wasCached = hasSearchCached(alias.title);
|
|
127
|
+
const resolved = await resolveLawId(alias.title);
|
|
128
|
+
if (!wasCached) {
|
|
129
|
+
await sleep(RATE_LIMIT_DELAY_MS);
|
|
130
|
+
}
|
|
131
|
+
return resolved;
|
|
132
|
+
}, CONCURRENCY);
|
|
133
|
+
const resolvedLaws = resolveResults.filter((r) => r !== null);
|
|
134
|
+
const results = await checkLawUpdates(resolvedLaws);
|
|
135
|
+
const text = formatSummary(results);
|
|
136
|
+
return { content: [{ type: "text", text }] };
|
|
137
|
+
}));
|
|
143
138
|
}
|
|
144
139
|
//# sourceMappingURL=check-law-updates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-law-updates.js","sourceRoot":"","sources":["../../src/tools/check-law-updates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,
|
|
1
|
+
{"version":3,"file":"check-law-updates.js","sourceRoot":"","sources":["../../src/tools/check-law-updates.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { resolveLawId } from "../lib/law-resolver.js";
|
|
|
3
3
|
import { getLawData } from "../lib/egov-client.js";
|
|
4
4
|
import { parseFullLaw } from "../lib/egov-parser.js";
|
|
5
5
|
import { LawNotFoundError } from "../lib/errors.js";
|
|
6
|
+
import { wrapToolHandler } from "../lib/tool-helpers.js";
|
|
6
7
|
const schema = {
|
|
7
8
|
law_name: z
|
|
8
9
|
.string()
|
|
@@ -10,35 +11,26 @@ const schema = {
|
|
|
10
11
|
.describe("法令名(正式名称、略称のいずれか。例: 建築基準法施行令、建基令)"),
|
|
11
12
|
};
|
|
12
13
|
export function registerGetFullLawTool(server) {
|
|
13
|
-
server.tool("get_full_law", "法令の全文を取得する。条番号を指定せず法令全体のテキストを返す。", schema, async ({ law_name }) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
throw new LawNotFoundError(law_name);
|
|
18
|
-
}
|
|
19
|
-
const lawData = await getLawData(resolved.law_id);
|
|
20
|
-
const fullText = parseFullLaw(lawData.law_full_text);
|
|
21
|
-
const lines = [
|
|
22
|
-
`【${resolved.title}】全文`,
|
|
23
|
-
`法令番号: ${resolved.law_num}`,
|
|
24
|
-
"",
|
|
25
|
-
fullText,
|
|
26
|
-
"",
|
|
27
|
-
`出典: e-Gov法令検索`,
|
|
28
|
-
];
|
|
29
|
-
if (resolved.source === "egov_search") {
|
|
30
|
-
lines.push("※ この法令は略称マップに登録されていないため、e-Gov法令検索から取得しました。");
|
|
31
|
-
}
|
|
32
|
-
const text = lines.join("\n");
|
|
33
|
-
return { content: [{ type: "text", text }] };
|
|
14
|
+
server.tool("get_full_law", "法令の全文を取得する。条番号を指定せず法令全体のテキストを返す。", schema, wrapToolHandler("get_full_law", async ({ law_name }) => {
|
|
15
|
+
const resolved = await resolveLawId(law_name);
|
|
16
|
+
if (!resolved) {
|
|
17
|
+
throw new LawNotFoundError(law_name);
|
|
34
18
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
const lawData = await getLawData(resolved.law_id);
|
|
20
|
+
const fullText = parseFullLaw(lawData.law_full_text);
|
|
21
|
+
const lines = [
|
|
22
|
+
`【${resolved.title}】全文`,
|
|
23
|
+
`法令番号: ${resolved.law_num}`,
|
|
24
|
+
"",
|
|
25
|
+
fullText,
|
|
26
|
+
"",
|
|
27
|
+
`出典: e-Gov法令検索`,
|
|
28
|
+
];
|
|
29
|
+
if (resolved.source === "egov_search") {
|
|
30
|
+
lines.push("※ この法令は略称マップに登録されていないため、e-Gov法令検索から取得しました。");
|
|
41
31
|
}
|
|
42
|
-
|
|
32
|
+
const text = lines.join("\n");
|
|
33
|
+
return { content: [{ type: "text", text }] };
|
|
34
|
+
}));
|
|
43
35
|
}
|
|
44
36
|
//# sourceMappingURL=get-full-law.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-full-law.js","sourceRoot":"","sources":["../../src/tools/get-full-law.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-full-law.js","sourceRoot":"","sources":["../../src/tools/get-full-law.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,MAAM,GAAG;IACb,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CACP,mCAAmC,CACpC;CACJ,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kCAAkC,EAClC,MAAM,EACN,eAAe,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAErD,MAAM,KAAK,GAAG;YACZ,IAAI,QAAQ,CAAC,KAAK,KAAK;YACvB,SAAS,QAAQ,CAAC,OAAO,EAAE;YAC3B,EAAE;YACF,QAAQ;YACR,EAAE;YACF,eAAe;SAChB,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CACR,4CAA4C,CAC7C,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACxD,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|