building-standards-act-mcp 1.5.0 → 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/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 +41 -49
- 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
|
@@ -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":"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"}
|
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"}
|
|
@@ -3,6 +3,7 @@ import { LawRegistry } from "../lib/law-registry.js";
|
|
|
3
3
|
import { resolveLawId } from "../lib/law-resolver.js";
|
|
4
4
|
import { checkLawUpdate, checkLawUpdates, getLawRevisionHistory, mapWithConcurrency, RATE_LIMIT_DELAY_MS, CONCURRENCY, sleep, } from "../lib/revision-tracker.js";
|
|
5
5
|
import { hasSearchCached } from "../lib/egov-client.js";
|
|
6
|
+
import { wrapToolHandler } from "../lib/tool-helpers.js";
|
|
6
7
|
const registry = new LawRegistry();
|
|
7
8
|
const schema = {
|
|
8
9
|
law_name: z
|
|
@@ -90,58 +91,49 @@ function formatHistory(result) {
|
|
|
90
91
|
return lines.join("\n");
|
|
91
92
|
}
|
|
92
93
|
export function registerCheckLawUpdatesTool(server) {
|
|
93
|
-
server.tool("check_law_updates", "法令の改正状況をe-Gov APIで確認する。法令名指定で単体チェック、グループ指定でバッチチェック、show_historyで改正履歴表示が可能。", schema, async ({ law_name, group, show_history }) => {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
const result = show_history
|
|
109
|
-
? await getLawRevisionHistory(resolved)
|
|
110
|
-
: await checkLawUpdate(resolved);
|
|
111
|
-
const text = show_history
|
|
112
|
-
? formatHistory(result)
|
|
113
|
-
: formatSummary([result]);
|
|
114
|
-
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
|
+
};
|
|
115
107
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return { content: [{ type: "text", text: msg }] };
|
|
123
|
-
}
|
|
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);
|
|
108
|
+
const result = show_history
|
|
109
|
+
? await getLawRevisionHistory(resolved)
|
|
110
|
+
: await checkLawUpdate(resolved);
|
|
111
|
+
const text = show_history
|
|
112
|
+
? formatHistory(result)
|
|
113
|
+
: formatSummary([result]);
|
|
136
114
|
return { content: [{ type: "text", text }] };
|
|
137
115
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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 }] };
|
|
144
123
|
}
|
|
145
|
-
|
|
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
|
+
}));
|
|
146
138
|
}
|
|
147
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,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,KAAK,GACN,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
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"}
|