building-standards-act-mcp 0.4.0 → 0.5.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 CHANGED
@@ -22,7 +22,67 @@ AI の建築法規回答に含まれるハルシネーションを、条文原
22
22
  - **API 耐障害性** — 自動リトライ(exponential backoff)+ サーキットブレーカー
23
23
  - **運用可視化** — 構造化 JSON ログ + 使用量メトリクス(`get_metrics` ツール)
24
24
 
25
- ## セットアップ
25
+ ## Web で使う(Vercel デプロイ)
26
+
27
+ Vercel にデプロイすると、ChatGPT・Claude.ai・Gemini CLI からすぐに使えます。環境変数の設定は不要です(e-Gov API は公開 API)。
28
+
29
+ [![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)
30
+
31
+ ### カスタム GPT でのセットアップ(ChatGPT Plus/Pro/Team/Enterprise)
32
+
33
+ 1. 上の「Deploy with Vercel」ボタンでデプロイ(ワンクリック)
34
+ 2. [chatgpt.com/create](https://chatgpt.com/create) にアクセス
35
+ 3. 「Configure」タブで名前を入力(例: `建築法規アシスタント`)
36
+ 4. Instructions に以下を貼り付け:
37
+ ```
38
+ 建築確認申請の法規に関する質問に回答してください。
39
+ 回答には必ず条文番号を引用し、get_law で原文と照合してください。
40
+ ```
41
+ 5. 「Add Action」→「Import from URL」をクリック
42
+ 6. URL に `https://your-app.vercel.app/api/openapi.json`(your-app をデプロイ先に置換)を入力
43
+ 7. 「Save」→ 公開設定を選択
44
+
45
+ > 参考: [Building and publishing a GPT](https://help.openai.com/en/articles/8798878-building-and-publishing-a-gpt)
46
+
47
+ ### Claude.ai でのセットアップ(Free/Pro/Max/Team/Enterprise)
48
+
49
+ > **注意**: Custom Connectors はベータ版のため、接続が不安定な場合があります。安定してご利用いただくには [npx(ローカル)でのセットアップ](#npx推奨)もご検討ください。
50
+
51
+ 1. 上の「Deploy with Vercel」ボタンでデプロイ(ワンクリック)
52
+ 2. [claude.ai](https://claude.ai) → プロフィールアイコン → Settings → Connectors
53
+ 3. 「Add custom connector」をクリック
54
+ 4. URL に `https://your-app.vercel.app/api/mcp`(your-app をデプロイ先に置換)を入力
55
+ 5. チャットで「+」→「Connectors」→ building-law を有効化
56
+ 6. 「建築基準法第20条を教えて」と質問
57
+
58
+ > 参考: [Get started with custom connectors using remote MCP](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp)
59
+
60
+ ### Gemini CLI でのセットアップ(開発者向け)
61
+
62
+ 1. 上の「Deploy with Vercel」ボタンでデプロイ(ワンクリック)
63
+ 2. `~/.gemini/settings.json` に以下を追加:
64
+ ```json
65
+ {
66
+ "mcpServers": {
67
+ "building-law": {
68
+ "httpUrl": "https://your-app.vercel.app/api/mcp"
69
+ }
70
+ }
71
+ }
72
+ ```
73
+ 3. `gemini` コマンドで「建築基準法第20条を取得して」と質問
74
+
75
+ > 参考: [MCP servers with the Gemini CLI](https://geminicli.com/docs/tools/mcp-server/)
76
+
77
+ ### Vercel Free tier の制限事項
78
+
79
+ - 関数の実行時間が **10 秒** に制限されます(Pro プランでは 60 秒)
80
+ - `get_kokuji`(告示取得)は PDF ダウンロード + パースが重いため、タイムアウトする場合があります
81
+ - `BUILDING_LAW_REQUEST_TIMEOUT=8000` を設定してタイムアウトを短縮できます
82
+
83
+ ---
84
+
85
+ ## ローカルで使う(stdio)
26
86
 
27
87
  ### npx(推奨)
28
88
 
@@ -200,12 +260,48 @@ npm run build
200
260
 
201
261
  ## ハルシネーション防止ワークフロー
202
262
 
203
- 本ツールを使って AI の建築法規回答の正確性を担保するワークフローです。
263
+ AI が建築法規について回答する際、条文の引用ミスや存在しない条文の捏造(ハルシネーション)が発生することがあります。本ツールは **4 段階の防止メカニズム** でこれを解決します。
204
264
 
205
- 1. Claude が建築法規の質問に仮回答を作成
206
- 2. 引用した条文・告示番号を `get_law` / `get_kokuji` で取得
207
- 3. 実際の原文と仮回答を照合し、誤りがあれば修正
265
+ ### 基本ワークフロー(自動実行)
266
+
267
+ ```
268
+ ユーザーの質問
269
+ ↓
270
+ 1. AI が仮回答を作成
271
+ ↓
272
+ 2. get_law / get_kokuji で引用した条文・告示の原文を取得
273
+ ↓
274
+ 3. 原文と仮回答を照合 → 誤りがあれば修正
275
+ ↓
208
276
  4. 2〜3 を収束するまで繰り返す(最大 4 ラウンド)
277
+ ↓
278
+ 照合済みの条文番号・告示番号を引用元として明示した最終回答
279
+ ```
280
+
281
+ このワークフローは MCP サーバーの [システムプロンプト](src/server.ts) に組み込まれており、AI が自動的に実行します。
282
+
283
+ ### 追加の検証ツール
284
+
285
+ 基本ワークフローに加えて、以下の専用ツールを使用することでさらに精度を高められます。
286
+
287
+ | ツール | 用途 | 使い方 |
288
+ | ----------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
289
+ | `verify_citation` | AI の回答に含まれる **法令引用を自動検証** する | 回答テキストから条文番号・法令名を自動抽出し、e-Gov API から原文を取得して照合。不一致があれば指摘し、正しい条文を提示する(最大 10 件同時検証) |
290
+ | `suggest_related` | 指定条文の **関連法令を自動提案** する | 条文間の参照(委任先・同法令内参照)を解析し、見落としがちな関連規定を提示。施行令への委任や別の章への参照を漏れなく把握できる |
291
+ | `analyze_article` | 条文の **構造を解析** する | 項数・号数・参照先の統計情報をメタデータとして返す。複雑な条文の全体像を把握し、読み落としを防ぐ |
292
+ | `get_laws_batch` | **複数条文を一括取得** する | 関連する複数の条文をまとめて取得し、条文間の整合性を確認する(最大 20 件) |
293
+
294
+ ### 使用例:引用検証
295
+
296
+ ```
297
+ 「建築基準法第20条で木造建築物の構造計算が必要な条件を教えて」
298
+
299
+ → AI が回答を作成
300
+ → verify_citation で回答内の引用を自動検証
301
+ → 「第20条第1項第四号の引用が正確であることを確認しました」
302
+ または
303
+ → 「第20条第1項第三号の記載に誤りがあります。正しくは…」
304
+ ```
209
305
 
210
306
  ## 対応法令一覧(115 法令)
211
307
 
@@ -407,11 +503,12 @@ e-Gov API は告示を収録していないため、`get_kokuji` は国土交通
407
503
 
408
504
  ## 環境変数
409
505
 
410
- | 変数 | 説明 | デフォルト |
411
- | ------------------------ | ------------------------------------------------- | ---------------------------- |
412
- | `BUILDING_LAW_CACHE` | キャッシュモード(`memory` / `file`) | `memory` |
413
- | `BUILDING_LAW_CACHE_DIR` | ファイルキャッシュの保存先ディレクトリ | `~/.cache/building-law-mcp/` |
414
- | `BUILDING_LAW_LOG_LEVEL` | ログレベル(`debug` / `info` / `warn` / `error`) | `info` |
506
+ | 変数 | 説明 | デフォルト |
507
+ | ------------------------------ | ------------------------------------------------- | ---------------------------- |
508
+ | `BUILDING_LAW_CACHE` | キャッシュモード(`memory` / `file`) | `memory` |
509
+ | `BUILDING_LAW_CACHE_DIR` | ファイルキャッシュの保存先ディレクトリ | `~/.cache/building-law-mcp/` |
510
+ | `BUILDING_LAW_LOG_LEVEL` | ログレベル(`debug` / `info` / `warn` / `error`) | `info` |
511
+ | `BUILDING_LAW_REQUEST_TIMEOUT` | API リクエストタイムアウト(ミリ秒) | `30000` |
415
512
 
416
513
  ### 永続キャッシュの有効化
417
514
 
@@ -441,7 +538,8 @@ e-Gov API は告示を収録していないため、`get_kokuji` は国土交通
441
538
  | 告示 PDF テキストキャッシュ | 24 時間 |
442
539
  | プリセット検証キャッシュ TTL | 7 日間 |
443
540
  | リビジョン履歴キャッシュ TTL | 1 時間 |
444
- | リクエストタイムアウト | 30 秒 |
541
+ | リクエストタイムアウト | 30 秒(環境変数で変更可能) |
542
+ | Vercel デプロイ | 対応(MCP-over-HTTP + REST API) |
445
543
  | Node.js | >= 20.0.0 |
446
544
 
447
545
  ## データソース
package/dist/index.js CHANGED
File without changes
@@ -7,7 +7,7 @@ const BASE_URL = "https://laws.e-gov.go.jp/api/2";
7
7
  const SEARCH_CACHE_TTL = 30 * 60 * 1000; // 30 minutes
8
8
  const LAW_DATA_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours
9
9
  const REVISIONS_CACHE_TTL = 60 * 60 * 1000; // 1 hour
10
- const REQUEST_TIMEOUT = 30_000; // 30 seconds
10
+ const REQUEST_TIMEOUT = Number(process.env.BUILDING_LAW_REQUEST_TIMEOUT) || 30_000; // 30 seconds
11
11
  const searchCache = createCache("search", SEARCH_CACHE_TTL);
12
12
  const lawDataCache = createCache("law-data", LAW_DATA_CACHE_TTL);
13
13
  const revisionsCache = createCache("revisions", REVISIONS_CACHE_TTL);
@@ -1 +1 @@
1
- {"version":3,"file":"egov-client.js","sourceRoot":"","sources":["../../src/lib/egov-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"egov-client.js","sourceRoot":"","sources":["../../src/lib/egov-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface OpenApiSpec {
2
+ openapi: string;
3
+ info: {
4
+ title: string;
5
+ version: string;
6
+ description: string;
7
+ };
8
+ servers: Array<{
9
+ url: string;
10
+ description: string;
11
+ }>;
12
+ paths: Record<string, object>;
13
+ }
14
+ export declare function generateOpenApiSpec(baseUrl?: string): Promise<OpenApiSpec>;
@@ -0,0 +1,100 @@
1
+ import { listTools } from "./tool-invoker.js";
2
+ const EXCLUDED_TOOLS = new Set(["validate_presets", "get_metrics"]);
3
+ export async function generateOpenApiSpec(baseUrl = "https://your-app.vercel.app") {
4
+ const tools = await listTools();
5
+ const paths = {};
6
+ for (const tool of tools) {
7
+ if (EXCLUDED_TOOLS.has(tool.name))
8
+ continue;
9
+ const properties = tool.inputSchema.properties ?? {};
10
+ const required = tool.inputSchema.required ?? [];
11
+ // Build query parameters for GET
12
+ const parameters = Object.entries(properties).map(([name, schema]) => ({
13
+ name,
14
+ in: "query",
15
+ required: required.includes(name),
16
+ schema,
17
+ description: schema.description ?? "",
18
+ }));
19
+ paths[`/api/tools/${tool.name}`] = {
20
+ post: {
21
+ operationId: tool.name,
22
+ summary: tool.description ?? tool.name,
23
+ requestBody: {
24
+ required: true,
25
+ content: {
26
+ "application/json": {
27
+ schema: tool.inputSchema,
28
+ },
29
+ },
30
+ },
31
+ responses: {
32
+ "200": {
33
+ description: "Tool execution result",
34
+ content: {
35
+ "application/json": {
36
+ schema: {
37
+ type: "object",
38
+ properties: {
39
+ content: {
40
+ type: "array",
41
+ items: {
42
+ type: "object",
43
+ properties: {
44
+ type: { type: "string" },
45
+ text: { type: "string" },
46
+ },
47
+ },
48
+ },
49
+ isError: { type: "boolean" },
50
+ },
51
+ },
52
+ },
53
+ },
54
+ },
55
+ },
56
+ },
57
+ get: {
58
+ operationId: `${tool.name}_get`,
59
+ summary: `${tool.description ?? tool.name} (GET)`,
60
+ parameters,
61
+ responses: {
62
+ "200": {
63
+ description: "Tool execution result",
64
+ content: {
65
+ "application/json": {
66
+ schema: {
67
+ type: "object",
68
+ properties: {
69
+ content: {
70
+ type: "array",
71
+ items: {
72
+ type: "object",
73
+ properties: {
74
+ type: { type: "string" },
75
+ text: { type: "string" },
76
+ },
77
+ },
78
+ },
79
+ isError: { type: "boolean" },
80
+ },
81
+ },
82
+ },
83
+ },
84
+ },
85
+ },
86
+ },
87
+ };
88
+ }
89
+ return {
90
+ openapi: "3.1.0",
91
+ info: {
92
+ title: "Building Standards Act MCP — REST API",
93
+ version: "0.5.0",
94
+ description: "Japanese building regulations API. Fetches law text from e-Gov API v2 to prevent AI hallucination in building permit reviews.",
95
+ },
96
+ servers: [{ url: baseUrl, description: "Vercel deployment" }],
97
+ paths,
98
+ };
99
+ }
100
+ //# sourceMappingURL=openapi-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-spec.js","sourceRoot":"","sources":["../../src/lib/openapi-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface ToolResult {
2
+ content: Array<{
3
+ type: string;
4
+ text?: string;
5
+ [key: string]: unknown;
6
+ }>;
7
+ isError?: boolean;
8
+ }
9
+ export declare function invokeTool(name: string, args: Record<string, unknown>): Promise<ToolResult>;
10
+ export declare function listTools(): Promise<Array<{
11
+ name: string;
12
+ description?: string;
13
+ inputSchema: {
14
+ type: "object";
15
+ properties?: Record<string, object>;
16
+ required?: string[];
17
+ };
18
+ }>>;
19
+ /** Reset the cached client instance (for testing) */
20
+ export declare function _resetClient(): void;
@@ -0,0 +1,32 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
3
+ import { createServer } from "../server.js";
4
+ let clientInstance = null;
5
+ async function getClient() {
6
+ if (clientInstance)
7
+ return clientInstance;
8
+ const server = createServer();
9
+ const client = new Client({ name: "tool-invoker", version: "1.0.0" });
10
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
11
+ await Promise.all([
12
+ client.connect(clientTransport),
13
+ server.connect(serverTransport),
14
+ ]);
15
+ clientInstance = client;
16
+ return client;
17
+ }
18
+ export async function invokeTool(name, args) {
19
+ const client = await getClient();
20
+ const result = await client.callTool({ name, arguments: args });
21
+ return result;
22
+ }
23
+ export async function listTools() {
24
+ const client = await getClient();
25
+ const result = await client.listTools();
26
+ return result.tools;
27
+ }
28
+ /** Reset the cached client instance (for testing) */
29
+ export function _resetClient() {
30
+ clientInstance = null;
31
+ }
32
+ //# sourceMappingURL=tool-invoker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-invoker.js","sourceRoot":"","sources":["../../src/lib/tool-invoker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,IAAI,cAAc,GAAkB,IAAI,CAAC;AAEzC,KAAK,UAAU,SAAS;IACtB,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GACtC,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IAEvC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;KAChC,CAAC,CAAC;IAEH,cAAc,GAAG,MAAM,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,IAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,MAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAW7B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACxC,OAAO,MAAM,CAAC,KAQZ,CAAC;AACL,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,YAAY;IAC1B,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
package/dist/server.js CHANGED
@@ -11,7 +11,7 @@ import { registerSuggestRelatedTool } from "./tools/suggest-related.js";
11
11
  import { registerAnalyzeArticleTool } from "./tools/analyze-article.js";
12
12
  import { registerGetMetricsTool } from "./tools/get-metrics.js";
13
13
  const SERVER_NAME = "building-law-mcp";
14
- const SERVER_VERSION = "0.4.0";
14
+ const SERVER_VERSION = "0.5.0";
15
15
  const INSTRUCTIONS = `あなたは建築確認申請の法規照合アシスタントです。
16
16
 
17
17
  ## 利用可能なツール
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "building-standards-act-mcp",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
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
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -36,6 +36,7 @@
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^22.0.0",
39
+ "@vercel/node": "^5.1.8",
39
40
  "@vitest/coverage-v8": "^3.2.4",
40
41
  "tsx": "^4.0.0",
41
42
  "typescript": "^5.7.0",