building-standards-act-mcp 1.9.0 → 1.9.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.
- package/README.md +10 -2
- package/dist/lib/tool-helpers.d.ts +7 -0
- package/dist/lib/tool-helpers.js +18 -5
- package/dist/lib/tool-helpers.js.map +1 -1
- package/dist/lib/types.d.ts +10 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/server.js +2 -2
- package/dist/tools/get-law.js +35 -7
- package/dist/tools/get-law.js.map +1 -1
- package/dist/tools/get-laws-batch.js +90 -6
- package/dist/tools/get-laws-batch.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -138,13 +138,13 @@ npm run build
|
|
|
138
138
|
|
|
139
139
|
| ツール | 説明 |
|
|
140
140
|
| ------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
141
|
-
| `get_law` |
|
|
141
|
+
| `get_law` | 条番号を指定して条文を取得する。テキスト本文は `max_chars`(既定 100,000)で区切り、続きは `offset` で取得 |
|
|
142
142
|
| `get_full_law` | 法令の全文を取得する。`max_chars`(既定 100,000)で区切り、続きは `offset` で取る |
|
|
143
143
|
| `search_law` | 法令名(タイトル)で建築関連法令を検索する。略称マップと e-Gov API の両方を検索。条文本文の検索は `search_articles` |
|
|
144
144
|
| `search_articles` | 条文本文をキーワードで全文検索する(e-Gov `/keyword`)。法令名で絞り込み可。条番号は返らないので `get_law` で確定する |
|
|
145
145
|
| `get_kokuji` | 建築基準法が技術基準を委任している告示の全文を取得する(省エネ告示は国交省 PDF から直接取得) |
|
|
146
146
|
| `check_law_updates` | 法令の改正状況を e-Gov API で確認する。`since`(既定は 12 か月前)より後の改正だけを「改正あり」にする |
|
|
147
|
-
| `get_laws_batch` |
|
|
147
|
+
| `get_laws_batch` | 複数条文を一括取得(最大20件)。`max_chars_per_item`(既定 8,000)で切り詰め、`max_total_chars`(既定 60,000)を超える後続本文は省略 |
|
|
148
148
|
| `verify_citation` | AIの回答に含まれる法令引用を検証する(条文存在確認・テキスト照合、最大10件) |
|
|
149
149
|
| `suggest_related` | 指定した条文の関連法令・委任先・同法令内参照を自動抽出して提案する |
|
|
150
150
|
| `analyze_article` | 条文の構造解析メタデータ(項数・号数・参照統計・プレビュー)をJSON形式で返す |
|
|
@@ -159,6 +159,10 @@ npm run build
|
|
|
159
159
|
| `law_name` | 法令名(正式名称または略称) | `建築基準法`, `建基法` |
|
|
160
160
|
| `article_number` | 条文番号(附則・別表にも対応) | `第20条`, `附則`, `別表第一` |
|
|
161
161
|
| `format` | 出力形式(`text` または `structured`、省略時は `text`) | `structured` |
|
|
162
|
+
| `max_chars` | 本文の最大文字数(1,000〜500,000、既定 100,000)。`format=text` のみ | `8000` |
|
|
163
|
+
| `offset` | 本文内の開始位置(既定 0)。`format=text` のみ。続きは `next_offset` を指定 | `8000` |
|
|
164
|
+
|
|
165
|
+
`offset` は見出し・参照・出典を含まない本文内の文字位置です。`get_laws_batch` の `next_offset` をそのまま指定できます。
|
|
162
166
|
|
|
163
167
|
#### `get_full_law`
|
|
164
168
|
|
|
@@ -205,6 +209,10 @@ npm run build
|
|
|
205
209
|
| パラメータ | 説明 | 例 |
|
|
206
210
|
| ---------- | ---------------------------------------------------------------------- | --- |
|
|
207
211
|
| `requests` | 取得対象の配列。各要素に `law_name`, `article_number`, `format` を指定 | — |
|
|
212
|
+
| `max_chars_per_item` | 条文ごとの最大文字数(1,000〜50,000、既定 8,000)。構造化形式はJSONの長さを基準に項単位で切り詰め | `8000` |
|
|
213
|
+
| `max_total_chars` | 応答全体のJSONの最大文字数(10,000〜500,000、既定 60,000)。超過する後続本文は省略 | `60000` |
|
|
214
|
+
|
|
215
|
+
切り詰めたテキストの続きは、案内された `offset` を `get_law` に指定して取得します。本文を省略した結果は `omitted: true` と省略一覧で示します。取得の成功・失敗件数は本文の省略によって変わりません。
|
|
208
216
|
|
|
209
217
|
#### `verify_citation`
|
|
210
218
|
|
|
@@ -11,6 +11,13 @@ export declare function paginateText(text: string, offset: number, maxChars: num
|
|
|
11
11
|
offset: number;
|
|
12
12
|
next_offset: number | null;
|
|
13
13
|
};
|
|
14
|
+
/** Prefer a line boundary in the second half of the page, without adding a note. */
|
|
15
|
+
export declare function paginateAtLineBoundary(text: string, offset: number, maxChars: number): {
|
|
16
|
+
text: string;
|
|
17
|
+
total_chars: number;
|
|
18
|
+
offset: number;
|
|
19
|
+
next_offset: number | null;
|
|
20
|
+
};
|
|
14
21
|
export declare const TOOL_ANNOTATIONS: {
|
|
15
22
|
readonly readOnlyHint: true;
|
|
16
23
|
readonly destructiveHint: false;
|
package/dist/lib/tool-helpers.js
CHANGED
|
@@ -8,8 +8,7 @@ import { recordToolCall } from "./metrics.js";
|
|
|
8
8
|
import { LawNotFoundError, ArticleNotFoundError, KokujiNotFoundError, } from "./errors.js";
|
|
9
9
|
import { EgovApiError } from "./errors.js";
|
|
10
10
|
export const DEFAULT_MAX_CHARS = 100_000;
|
|
11
|
-
|
|
12
|
-
export function paginateText(text, offset, maxChars) {
|
|
11
|
+
function paginate(text, offset, maxChars, atLineBoundary) {
|
|
13
12
|
const total_chars = text.length;
|
|
14
13
|
if (offset >= total_chars && total_chars > 0) {
|
|
15
14
|
return {
|
|
@@ -32,11 +31,25 @@ export function paginateText(text, offset, maxChars) {
|
|
|
32
31
|
// A one-unit page must still advance past a complete pair.
|
|
33
32
|
end += end - offset === 1 ? 1 : -1;
|
|
34
33
|
}
|
|
34
|
+
if (atLineBoundary && end < total_chars) {
|
|
35
|
+
const newline = text.lastIndexOf("\n", end - 1);
|
|
36
|
+
if (newline > offset + maxChars / 2)
|
|
37
|
+
end = newline + 1;
|
|
38
|
+
}
|
|
35
39
|
const next_offset = end < total_chars ? end : null;
|
|
36
|
-
|
|
40
|
+
return { text: text.slice(offset, end), total_chars, offset, next_offset };
|
|
41
|
+
}
|
|
42
|
+
/** Paginate UTF-16 text without cutting a surrogate pair. */
|
|
43
|
+
export function paginateText(text, offset, maxChars) {
|
|
44
|
+
const page = paginate(text, offset, maxChars, false);
|
|
45
|
+
const note = page.next_offset === null
|
|
37
46
|
? ""
|
|
38
|
-
: `\n\n(続きがあります。offset=${next_offset} を指定して続きを取得してください。全体 ${total_chars} 文字)`;
|
|
39
|
-
return { text: text
|
|
47
|
+
: `\n\n(続きがあります。offset=${page.next_offset} を指定して続きを取得してください。全体 ${page.total_chars} 文字)`;
|
|
48
|
+
return { ...page, text: page.text + note };
|
|
49
|
+
}
|
|
50
|
+
/** Prefer a line boundary in the second half of the page, without adding a note. */
|
|
51
|
+
export function paginateAtLineBoundary(text, offset, maxChars) {
|
|
52
|
+
return paginate(text, offset, maxChars, true);
|
|
40
53
|
}
|
|
41
54
|
export const TOOL_ANNOTATIONS = {
|
|
42
55
|
readOnlyHint: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-helpers.js","sourceRoot":"","sources":["../../src/lib/tool-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,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;AAE3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,
|
|
1
|
+
{"version":3,"file":"tool-helpers.js","sourceRoot":"","sources":["../../src/lib/tool-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -135,12 +135,22 @@ export interface BatchFetchItem {
|
|
|
135
135
|
structured?: StructuredArticle;
|
|
136
136
|
revision_note?: string;
|
|
137
137
|
error_message?: string;
|
|
138
|
+
truncated?: boolean;
|
|
139
|
+
next_offset?: number | null;
|
|
140
|
+
total_chars?: number;
|
|
141
|
+
omitted?: boolean;
|
|
142
|
+
note?: string;
|
|
138
143
|
}
|
|
139
144
|
export interface BatchFetchResult {
|
|
140
145
|
total: number;
|
|
141
146
|
success: number;
|
|
142
147
|
failed: number;
|
|
143
148
|
results: BatchFetchItem[];
|
|
149
|
+
omitted?: Array<{
|
|
150
|
+
law_name: string;
|
|
151
|
+
article_number: string;
|
|
152
|
+
}>;
|
|
153
|
+
note?: string;
|
|
144
154
|
}
|
|
145
155
|
export interface CitationVerification {
|
|
146
156
|
law_name: string;
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Must match package.json `version`; a unit test enforces this. */
|
|
2
|
-
export declare const SERVER_VERSION = "1.9.
|
|
2
|
+
export declare const SERVER_VERSION = "1.9.1";
|
package/dist/lib/version.js
CHANGED
package/dist/server.js
CHANGED
|
@@ -15,7 +15,7 @@ const SERVER_NAME = "building-standards-act-mcp";
|
|
|
15
15
|
const INSTRUCTIONS = `あなたは建築確認申請の法規照合アシスタントです。
|
|
16
16
|
|
|
17
17
|
## 利用可能なツール
|
|
18
|
-
- get_law: 条番号を指定して条文を取得(例: 建築基準法 第20
|
|
18
|
+
- get_law: 条番号を指定して条文を取得(例: 建築基準法 第20条、附則、別表第一)。テキスト本文は max_chars(既定100,000)で区切り、続きは offset で取得
|
|
19
19
|
- 別表: 「別表第一」「別表第二」等で数値基準を含む別表を取得可能
|
|
20
20
|
- 改正附則: 「附則(令和○年政令第○号)」で特定改正の経過措置を取得可能。法令番号は check_law_updates で確認
|
|
21
21
|
- get_full_law: 法令全文を取得(例: 建築基準法施行令)
|
|
@@ -24,7 +24,7 @@ const INSTRUCTIONS = `あなたは建築確認申請の法規照合アシスタ
|
|
|
24
24
|
- get_kokuji: 告示の全文を国土交通省の告示データベース(PDF)から動的に取得する。正式名称またはキーワードで指定可能(例: 耐火構造の構造方法を定める件)。
|
|
25
25
|
※ 国交省データベースに未収録の告示は取得できません。取得失敗時は類似告示を提案します
|
|
26
26
|
- check_law_updates: 法令の改正状況を確認する(法令名指定で単体チェック、グループ指定でバッチチェック、show_historyで改正履歴表示)
|
|
27
|
-
- get_laws_batch: 複数の法令・条文を一括取得する(最大20件、e-Gov
|
|
27
|
+
- get_laws_batch: 複数の法令・条文を一括取得する(最大20件、e-Govから条単位取得)。max_chars_per_item(既定8,000)と max_total_chars(既定60,000)で応答量を制限
|
|
28
28
|
- verify_citation: AIの回答に含まれる法令引用を検証する(条文存在確認・テキスト照合、最大10件)
|
|
29
29
|
- suggest_related: 指定した条文の関連法令・委任先・同法令内参照を自動抽出して提案する
|
|
30
30
|
- analyze_article: 条文の構造解析メタデータ(項数・号数・参照統計・プレビュー)をJSON形式で返す
|
package/dist/tools/get-law.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { resolveLawId } from "../lib/law-resolver.js";
|
|
3
3
|
import { fetchParsedArticle } from "../lib/article-fetcher.js";
|
|
4
4
|
import { LawNotFoundError, ArticleNotFoundError } from "../lib/errors.js";
|
|
5
|
-
import { TOOL_ANNOTATIONS, wrapToolHandler } from "../lib/tool-helpers.js";
|
|
5
|
+
import { DEFAULT_MAX_CHARS, paginateAtLineBoundary, TOOL_ANNOTATIONS, wrapToolHandler, } from "../lib/tool-helpers.js";
|
|
6
6
|
import { parsedArticleSchema, structuredArticleSchema, } from "../lib/article-schemas.js";
|
|
7
7
|
const schema = {
|
|
8
8
|
law_name: z
|
|
@@ -17,6 +17,19 @@ const schema = {
|
|
|
17
17
|
.enum(["text", "structured"])
|
|
18
18
|
.default("text")
|
|
19
19
|
.describe("出力形式。text: 従来のテキスト形式、structured: 条→項→号の階層を持つJSON構造化形式"),
|
|
20
|
+
max_chars: z
|
|
21
|
+
.number()
|
|
22
|
+
.int()
|
|
23
|
+
.min(1_000)
|
|
24
|
+
.max(500_000)
|
|
25
|
+
.default(DEFAULT_MAX_CHARS)
|
|
26
|
+
.describe("本文の最大文字数(1,000〜500,000)。省略時は100,000文字。format=text のみ適用。"),
|
|
27
|
+
offset: z
|
|
28
|
+
.number()
|
|
29
|
+
.int()
|
|
30
|
+
.min(0)
|
|
31
|
+
.default(0)
|
|
32
|
+
.describe("本文の取得開始位置(0から始まる文字位置)。続きは案内された offset を指定。format=text のみ適用。"),
|
|
20
33
|
};
|
|
21
34
|
const outputSchema = {
|
|
22
35
|
law_title: z.string(),
|
|
@@ -24,6 +37,10 @@ const outputSchema = {
|
|
|
24
37
|
source: z.literal("e-Gov法令検索"),
|
|
25
38
|
format: z.enum(["text", "structured"]),
|
|
26
39
|
article: z.union([parsedArticleSchema, structuredArticleSchema]),
|
|
40
|
+
total_chars: z.number().optional(),
|
|
41
|
+
offset: z.number().optional(),
|
|
42
|
+
next_offset: z.number().nullable().optional(),
|
|
43
|
+
truncated: z.boolean().optional(),
|
|
27
44
|
note: z.string().optional(),
|
|
28
45
|
revision_note: z.string().optional(),
|
|
29
46
|
revision: z.object({
|
|
@@ -39,7 +56,7 @@ export function registerGetLawTool(server) {
|
|
|
39
56
|
inputSchema: schema,
|
|
40
57
|
annotations: TOOL_ANNOTATIONS,
|
|
41
58
|
outputSchema,
|
|
42
|
-
}, wrapToolHandler("get_law", async ({ law_name, article_number, format }) => {
|
|
59
|
+
}, wrapToolHandler("get_law", async ({ law_name, article_number, format, max_chars = DEFAULT_MAX_CHARS, offset = 0, }) => {
|
|
43
60
|
const resolved = await resolveLawId(law_name);
|
|
44
61
|
if (!resolved) {
|
|
45
62
|
throw new LawNotFoundError(law_name);
|
|
@@ -73,19 +90,26 @@ export function registerGetLawTool(server) {
|
|
|
73
90
|
],
|
|
74
91
|
};
|
|
75
92
|
}
|
|
76
|
-
//
|
|
93
|
+
// Offsets address only the article body, matching get_laws_batch.
|
|
77
94
|
const fetched = await fetchParsedArticle(resolved.law_id, article_number, "text");
|
|
78
95
|
const article = fetched?.article;
|
|
79
96
|
if (!article) {
|
|
80
97
|
throw new ArticleNotFoundError(article_number, resolved.title);
|
|
81
98
|
}
|
|
99
|
+
const page = paginateAtLineBoundary(article.text, offset, max_chars);
|
|
100
|
+
const references = offset > 0 || page.next_offset !== null
|
|
101
|
+
? article.references?.filter((ref) => page.text.includes(ref.raw_text))
|
|
102
|
+
: article.references;
|
|
82
103
|
const lines = [
|
|
83
104
|
`【${resolved.title}】${article.article_title}`,
|
|
84
105
|
article.article_caption ? article.article_caption : "",
|
|
85
106
|
"",
|
|
86
|
-
|
|
107
|
+
page.text,
|
|
87
108
|
].filter((line) => line !== undefined);
|
|
88
|
-
if (
|
|
109
|
+
if (page.next_offset !== null) {
|
|
110
|
+
lines.push(`(続きがあります。offset=${page.next_offset} を指定して続きを取得してください。本文全体 ${page.total_chars} 文字)`);
|
|
111
|
+
}
|
|
112
|
+
if (references && references.length > 0) {
|
|
89
113
|
const refLabels = {
|
|
90
114
|
cross_law: "他法令",
|
|
91
115
|
same_law: "同法令",
|
|
@@ -95,7 +119,7 @@ export function registerGetLawTool(server) {
|
|
|
95
119
|
};
|
|
96
120
|
lines.push("");
|
|
97
121
|
lines.push("■ 検出された参照:");
|
|
98
|
-
for (const ref of
|
|
122
|
+
for (const ref of references) {
|
|
99
123
|
const label = refLabels[ref.ref_type] ?? ref.ref_type;
|
|
100
124
|
lines.push(` - [${label}] ${ref.raw_text}`);
|
|
101
125
|
}
|
|
@@ -115,7 +139,11 @@ export function registerGetLawTool(server) {
|
|
|
115
139
|
law_num: resolved.law_num,
|
|
116
140
|
source: "e-Gov法令検索",
|
|
117
141
|
format: "text",
|
|
118
|
-
article,
|
|
142
|
+
article: { ...article, text: page.text, ...(references ? { references } : {}) },
|
|
143
|
+
total_chars: page.total_chars,
|
|
144
|
+
offset: page.offset,
|
|
145
|
+
next_offset: page.next_offset,
|
|
146
|
+
truncated: page.next_offset !== null,
|
|
119
147
|
...(fetched?.revision
|
|
120
148
|
? { revision: fetched.revision, revision_note: fetched.revisionNote }
|
|
121
149
|
: {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-law.js","sourceRoot":"","sources":["../../src/tools/get-law.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"get-law.js","sourceRoot":"","sources":["../../src/tools/get-law.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,11 @@ import { z } from "zod";
|
|
|
2
2
|
import { resolveLawId } from "../lib/law-resolver.js";
|
|
3
3
|
import { fetchParsedArticle } from "../lib/article-fetcher.js";
|
|
4
4
|
import { ArticleNotFoundError, formatArticleRef } from "../lib/errors.js";
|
|
5
|
-
import { TOOL_ANNOTATIONS, wrapToolHandler } from "../lib/tool-helpers.js";
|
|
5
|
+
import { paginateAtLineBoundary, TOOL_ANNOTATIONS, wrapToolHandler, } from "../lib/tool-helpers.js";
|
|
6
6
|
import { structuredArticleSchema } from "../lib/article-schemas.js";
|
|
7
7
|
const MAX_REQUESTS = 20;
|
|
8
|
+
const DEFAULT_MAX_CHARS_PER_ITEM = 8_000;
|
|
9
|
+
const DEFAULT_MAX_TOTAL_CHARS = 60_000;
|
|
8
10
|
const schema = {
|
|
9
11
|
requests: z
|
|
10
12
|
.array(z.object({
|
|
@@ -20,6 +22,20 @@ const schema = {
|
|
|
20
22
|
}))
|
|
21
23
|
.max(20)
|
|
22
24
|
.describe("取得対象の条文リスト(最大20件)"),
|
|
25
|
+
max_chars_per_item: z
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(1_000)
|
|
29
|
+
.max(50_000)
|
|
30
|
+
.default(DEFAULT_MAX_CHARS_PER_ITEM)
|
|
31
|
+
.describe("条文ごとの最大文字数(1,000〜50,000)。省略時は8,000文字。"),
|
|
32
|
+
max_total_chars: z
|
|
33
|
+
.number()
|
|
34
|
+
.int()
|
|
35
|
+
.min(10_000)
|
|
36
|
+
.max(500_000)
|
|
37
|
+
.default(DEFAULT_MAX_TOTAL_CHARS)
|
|
38
|
+
.describe("応答全体のJSONの最大文字数(10,000〜500,000)。省略時は60,000文字。超過分の本文は省略。"),
|
|
23
39
|
};
|
|
24
40
|
const outputSchema = {
|
|
25
41
|
total: z.number(),
|
|
@@ -38,7 +54,17 @@ const outputSchema = {
|
|
|
38
54
|
structured: structuredArticleSchema.optional(),
|
|
39
55
|
error_message: z.string().optional(),
|
|
40
56
|
revision_note: z.string().optional(),
|
|
57
|
+
truncated: z.boolean().optional(),
|
|
58
|
+
next_offset: z.number().nullable().optional(),
|
|
59
|
+
total_chars: z.number().optional(),
|
|
60
|
+
omitted: z.boolean().optional(),
|
|
61
|
+
note: z.string().optional(),
|
|
41
62
|
})),
|
|
63
|
+
omitted: z.array(z.object({
|
|
64
|
+
law_name: z.string(),
|
|
65
|
+
article_number: z.string(),
|
|
66
|
+
})).optional(),
|
|
67
|
+
note: z.string().optional(),
|
|
42
68
|
};
|
|
43
69
|
export function registerGetLawsBatchTool(server) {
|
|
44
70
|
server.registerTool("get_laws_batch", {
|
|
@@ -47,7 +73,7 @@ export function registerGetLawsBatchTool(server) {
|
|
|
47
73
|
inputSchema: schema,
|
|
48
74
|
annotations: TOOL_ANNOTATIONS,
|
|
49
75
|
outputSchema,
|
|
50
|
-
}, wrapToolHandler("get_laws_batch", async ({ requests }) => {
|
|
76
|
+
}, wrapToolHandler("get_laws_batch", async ({ requests, max_chars_per_item = DEFAULT_MAX_CHARS_PER_ITEM, max_total_chars = DEFAULT_MAX_TOTAL_CHARS, }) => {
|
|
51
77
|
if (requests.length > MAX_REQUESTS) {
|
|
52
78
|
return {
|
|
53
79
|
content: [
|
|
@@ -103,11 +129,26 @@ export function registerGetLawsBatchTool(server) {
|
|
|
103
129
|
});
|
|
104
130
|
}
|
|
105
131
|
else {
|
|
132
|
+
const truncated = JSON.stringify(structured).length > max_chars_per_item;
|
|
133
|
+
const limited = truncated ? { ...structured, paragraphs: [] } : structured;
|
|
134
|
+
if (truncated) {
|
|
135
|
+
for (const paragraph of structured.paragraphs) {
|
|
136
|
+
const candidate = { ...limited, paragraphs: [...limited.paragraphs, paragraph] };
|
|
137
|
+
if (JSON.stringify(candidate).length > max_chars_per_item)
|
|
138
|
+
break;
|
|
139
|
+
limited.paragraphs = candidate.paragraphs;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
106
142
|
results.push({
|
|
107
143
|
law_name: resolvedInfo.title,
|
|
108
144
|
article_number: req.article_number,
|
|
109
145
|
status: "success",
|
|
110
|
-
structured,
|
|
146
|
+
structured: limited,
|
|
147
|
+
...(truncated ? {
|
|
148
|
+
truncated: true,
|
|
149
|
+
next_offset: null,
|
|
150
|
+
note: `構造化形式は項単位で切り詰めました。全文は get_law("${resolvedInfo.title}", "${req.article_number}", format="text", offset=0) から offset で順に取得してください。`,
|
|
151
|
+
} : {}),
|
|
111
152
|
...(fetched?.revisionNote ? { revision_note: fetched.revisionNote } : {}),
|
|
112
153
|
});
|
|
113
154
|
}
|
|
@@ -124,11 +165,24 @@ export function registerGetLawsBatchTool(server) {
|
|
|
124
165
|
});
|
|
125
166
|
}
|
|
126
167
|
else {
|
|
168
|
+
const page = paginateAtLineBoundary(article.text, 0, max_chars_per_item);
|
|
169
|
+
const truncated = page.next_offset !== null;
|
|
170
|
+
let text = page.text;
|
|
171
|
+
if (truncated) {
|
|
172
|
+
text += `\n\n(続きは get_law("${resolvedInfo.title}", "${req.article_number}", offset=${page.next_offset}, max_chars=${max_chars_per_item}) で取得。本文全体 ${page.total_chars} 文字)`;
|
|
173
|
+
}
|
|
174
|
+
if (fetched?.revisionNote)
|
|
175
|
+
text += `\n\n${fetched.revisionNote}`;
|
|
127
176
|
results.push({
|
|
128
177
|
law_name: resolvedInfo.title,
|
|
129
178
|
article_number: req.article_number,
|
|
130
179
|
status: "success",
|
|
131
|
-
text
|
|
180
|
+
text,
|
|
181
|
+
...(truncated ? {
|
|
182
|
+
truncated: true,
|
|
183
|
+
next_offset: page.next_offset,
|
|
184
|
+
total_chars: page.total_chars,
|
|
185
|
+
} : {}),
|
|
132
186
|
});
|
|
133
187
|
}
|
|
134
188
|
}
|
|
@@ -145,18 +199,48 @@ export function registerGetLawsBatchTool(server) {
|
|
|
145
199
|
}
|
|
146
200
|
}
|
|
147
201
|
const successCount = results.filter((r) => r.status === "success").length;
|
|
148
|
-
|
|
202
|
+
let response = {
|
|
149
203
|
total: results.length,
|
|
150
204
|
success: successCount,
|
|
151
205
|
failed: results.length - successCount,
|
|
152
206
|
results,
|
|
153
207
|
};
|
|
208
|
+
// Measure the final JSON, including omission metadata, for each prefix.
|
|
209
|
+
let text = JSON.stringify(response, null, 2);
|
|
210
|
+
if (text.length > max_total_chars) {
|
|
211
|
+
for (let keep = results.length - 1; keep >= 0; keep--) {
|
|
212
|
+
const omitted = results.slice(keep).map(({ law_name, article_number }) => ({
|
|
213
|
+
law_name, article_number,
|
|
214
|
+
}));
|
|
215
|
+
response = {
|
|
216
|
+
...response,
|
|
217
|
+
results: results.map((item, index) => {
|
|
218
|
+
if (index < keep)
|
|
219
|
+
return item;
|
|
220
|
+
const omittedItem = { ...item, omitted: true };
|
|
221
|
+
delete omittedItem.text;
|
|
222
|
+
delete omittedItem.structured;
|
|
223
|
+
delete omittedItem.revision_note;
|
|
224
|
+
delete omittedItem.truncated;
|
|
225
|
+
delete omittedItem.next_offset;
|
|
226
|
+
delete omittedItem.total_chars;
|
|
227
|
+
delete omittedItem.note;
|
|
228
|
+
return omittedItem;
|
|
229
|
+
}),
|
|
230
|
+
omitted,
|
|
231
|
+
note: `応答全体の上限(max_total_chars=${max_total_chars})に達したため、次の ${omitted.length} 件は本文を省略しました。未取得: ${omitted.map((item) => `${item.law_name} ${item.article_number}`).join(", ")} 。get_law で個別に取得するか、件数を減らして再実行してください。`,
|
|
232
|
+
};
|
|
233
|
+
text = JSON.stringify(response, null, 2);
|
|
234
|
+
if (text.length <= max_total_chars)
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
154
238
|
return {
|
|
155
239
|
structuredContent: { ...response },
|
|
156
240
|
content: [
|
|
157
241
|
{
|
|
158
242
|
type: "text",
|
|
159
|
-
text
|
|
243
|
+
text,
|
|
160
244
|
},
|
|
161
245
|
],
|
|
162
246
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-laws-batch.js","sourceRoot":"","sources":["../../src/tools/get-laws-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"get-laws-batch.js","sourceRoot":"","sources":["../../src/tools/get-laws-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAOpE,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,0BAA0B,GAAG,KAAK,CAAC;AACzC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,GAAG;IACb,QAAQ,EAAE,CAAC;SACR,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACxD,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,CAAC,kBAAkB,CAAC;QAC/B,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;aAC5B,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CAAC,MAAM,CAAC;KACpB,CAAC,CACH;SACA,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,mBAAmB,CAAC;IAChC,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,KAAK,CAAC;SACV,GAAG,CAAC,MAAM,CAAC;SACX,OAAO,CAAC,0BAA0B,CAAC;SACnC,QAAQ,CAAC,uCAAuC,CAAC;IACpD,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,MAAM,CAAC;SACX,GAAG,CAAC,OAAO,CAAC;SACZ,OAAO,CAAC,uBAAuB,CAAC;SAChC,QAAQ,CAAC,yDAAyD,CAAC;CACvE,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;YACb,SAAS;YACT,eAAe;YACf,mBAAmB;YACnB,OAAO;SACR,CAAC;QACF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,uBAAuB,CAAC,QAAQ,EAAE;QAC9C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACpC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACpC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC,CACH;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;KAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACJ,CAAC;AAE1B,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,gBAAgB;QAC7B,YAAY;KACb,EACD,eAAe,CAAC,gBAAgB,EAAE,KAAK,EAAE,EACvC,QAAQ,EACR,kBAAkB,GAAG,0BAA0B,EAC/C,eAAe,GAAG,uBAAuB,GAC1C,EAAE,EAAE;QACH,IAAI,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,kBAAkB,YAAY,aAAa,QAAQ,CAAC,MAAM,KAAK;qBACtE;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iBAAiB;qBACxB;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,MAAM,WAAW,GAAG,IAAI,GAAG,EAA8B,CAAC;QAC1D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,cAAc,EAAE,GAAG,CAAC,cAAc;oBAClC,MAAM,EAAE,eAAe;oBACvB,aAAa,EAAE,MAAM,GAAG,CAAC,QAAQ,eAAe;iBACjD,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;oBAChC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CACtC,YAAY,CAAC,MAAM,EACnB,GAAG,CAAC,cAAc,EAClB,YAAY,CACb,CAAC;oBACF,MAAM,UAAU,GAAG,OAAO,EAAE,OAAO,CAAC;oBACpC,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,OAAO,CAAC,IAAI,CAAC;4BACX,QAAQ,EAAE,YAAY,CAAC,KAAK;4BAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;4BAClC,MAAM,EAAE,mBAAmB;4BAC3B,aAAa,EAAE,GAAG,YAAY,CAAC,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc;yBAC3F,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,kBAAkB,CAAC;wBACzE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;wBAC3E,IAAI,SAAS,EAAE,CAAC;4BACd,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gCAC9C,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;gCACjF,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,kBAAkB;oCAAE,MAAM;gCACjE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;4BAC5C,CAAC;wBACH,CAAC;wBACD,OAAO,CAAC,IAAI,CAAC;4BACX,QAAQ,EAAE,YAAY,CAAC,KAAK;4BAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;4BAClC,MAAM,EAAE,SAAS;4BACjB,UAAU,EAAE,OAAO;4BACnB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;gCACd,SAAS,EAAE,IAAI;gCACf,WAAW,EAAE,IAAI;gCACjB,IAAI,EAAE,kCAAkC,YAAY,CAAC,KAAK,OAAO,GAAG,CAAC,cAAc,oDAAoD;6BACxI,CAAC,CAAC,CAAC,EAAE,CAAC;4BACP,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC1E,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,OAAO,GAAG,MAAM,kBAAkB,CACtC,YAAY,CAAC,MAAM,EACnB,GAAG,CAAC,cAAc,EAClB,MAAM,CACP,CAAC;oBACF,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;oBACjC,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,CAAC,IAAI,CAAC;4BACX,QAAQ,EAAE,YAAY,CAAC,KAAK;4BAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;4BAClC,MAAM,EAAE,mBAAmB;4BAC3B,aAAa,EAAE,GAAG,YAAY,CAAC,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc;yBAC3F,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;wBACzE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;wBAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;wBACrB,IAAI,SAAS,EAAE,CAAC;4BACd,IAAI,IAAI,qBAAqB,YAAY,CAAC,KAAK,OAAO,GAAG,CAAC,cAAc,aAAa,IAAI,CAAC,WAAW,eAAe,kBAAkB,cAAc,IAAI,CAAC,WAAW,MAAM,CAAC;wBAC7K,CAAC;wBACD,IAAI,OAAO,EAAE,YAAY;4BAAE,IAAI,IAAI,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;wBACjE,OAAO,CAAC,IAAI,CAAC;4BACX,QAAQ,EAAE,YAAY,CAAC,KAAK;4BAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;4BAClC,MAAM,EAAE,SAAS;4BACjB,IAAI;4BACJ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;gCACd,SAAS,EAAE,IAAI;gCACf,WAAW,EAAE,IAAI,CAAC,WAAW;gCAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;6BAC9B,CAAC,CAAC,CAAC,EAAE,CAAC;yBACR,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,YAAY,CAAC,KAAK;oBAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;oBAClC,MAAM,EAAE,KAAK,YAAY,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO;oBAC7E,aAAa,EACX,KAAK,YAAY,oBAAoB;wBACnC,CAAC,CAAC,KAAK,CAAC,OAAO;wBACf,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,iBAAiB;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAE1E,IAAI,QAAQ,GAAqB;YAC/B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY;YACrC,OAAO;SACR,CAAC;QAEF,wEAAwE;QACxE,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAClC,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;gBACtD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;oBACzE,QAAQ,EAAE,cAAc;iBACzB,CAAC,CAAC,CAAC;gBACJ,QAAQ,GAAG;oBACT,GAAG,QAAQ;oBACX,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;wBACnC,IAAI,KAAK,GAAG,IAAI;4BAAE,OAAO,IAAI,CAAC;wBAC9B,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;wBAC/C,OAAO,WAAW,CAAC,IAAI,CAAC;wBACxB,OAAO,WAAW,CAAC,UAAU,CAAC;wBAC9B,OAAO,WAAW,CAAC,aAAa,CAAC;wBACjC,OAAO,WAAW,CAAC,SAAS,CAAC;wBAC7B,OAAO,WAAW,CAAC,WAAW,CAAC;wBAC/B,OAAO,WAAW,CAAC,WAAW,CAAC;wBAC/B,OAAO,WAAW,CAAC,IAAI,CAAC;wBACxB,OAAO,WAAW,CAAC;oBACrB,CAAC,CAAC;oBACF,OAAO;oBACP,IAAI,EAAE,2BAA2B,eAAe,cAAc,OAAO,CAAC,MAAM,qBAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uCAAuC;iBACpN,CAAC;gBACF,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,MAAM,IAAI,eAAe;oBAAE,MAAM;YAC5C,CAAC;QACH,CAAC;QAED,OAAO;YACL,iBAAiB,EAAE,EAAE,GAAG,QAAQ,EAAE;YAClC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "building-standards-act-mcp",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"description": "MCP server for Japanese building regulations — fetches law text from e-Gov API v2 to prevent AI hallucination in building permit reviews",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|