@shuji-bonji/houki-egov-mcp 0.2.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/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/config.d.ts +74 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +71 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +27 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -0
- package/dist/formatters/markdown.d.ts +37 -0
- package/dist/formatters/markdown.d.ts.map +1 -0
- package/dist/formatters/markdown.js +114 -0
- package/dist/formatters/markdown.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/law-hierarchy.d.ts +49 -0
- package/dist/knowledge/law-hierarchy.d.ts.map +1 -0
- package/dist/knowledge/law-hierarchy.js +220 -0
- package/dist/knowledge/law-hierarchy.js.map +1 -0
- package/dist/services/egov-client.d.ts +118 -0
- package/dist/services/egov-client.d.ts.map +1 -0
- package/dist/services/egov-client.js +99 -0
- package/dist/services/egov-client.js.map +1 -0
- package/dist/services/law-service.d.ts +127 -0
- package/dist/services/law-service.d.ts.map +1 -0
- package/dist/services/law-service.js +312 -0
- package/dist/services/law-service.js.map +1 -0
- package/dist/services/law-tree.d.ts +79 -0
- package/dist/services/law-tree.d.ts.map +1 -0
- package/dist/services/law-tree.js +159 -0
- package/dist/services/law-tree.js.map +1 -0
- package/dist/tools/definitions.d.ts +6 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +168 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers.d.ts +141 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +123 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/types/index.d.ts +43 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/article-num.d.ts +27 -0
- package/dist/utils/article-num.d.ts.map +1 -0
- package/dist/utils/article-num.js +40 -0
- package/dist/utils/article-num.js.map +1 -0
- package/dist/utils/cache.d.ts +18 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +51 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 shuji-bonji
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Houki e-Gov MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://github.com/shuji-bonji/houki-egov-mcp/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@shuji-bonji/houki-egov-mcp)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://nodejs.org/)
|
|
7
|
+
|
|
8
|
+
日本の法令(憲法・法律・政令・省令・規則)を **e-Gov 法令API v2** 経由で取得する MCP サーバ。
|
|
9
|
+
|
|
10
|
+
LLM が条文をキーワード・略称・分野で検索したり、特定の条項を Markdown / JSON で取得したり、改正履歴を引いたりできるようにする。
|
|
11
|
+
|
|
12
|
+
## 提供ツール
|
|
13
|
+
|
|
14
|
+
| Tool | 用途 |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `search_law` | 法令タイトルでキーワード検索(略称→正式名解決済み) |
|
|
17
|
+
| `get_law` | 条/項/号レベルで本文取得(Markdown / JSON / TOC) |
|
|
18
|
+
| `get_toc` | 目次のみ取得(トークン節約) |
|
|
19
|
+
| `get_law_revisions` | 改正履歴を取得(公布日・施行日・状態) |
|
|
20
|
+
| `search_fulltext` | 全文検索(Phase 2 まで `search_law` にフォールバック) |
|
|
21
|
+
| `resolve_abbreviation` | 略称→正式名解決の診断 |
|
|
22
|
+
| `explain_law_type` | 法令種別(憲法・法律・政令・省令・通達 等)の解説 |
|
|
23
|
+
|
|
24
|
+
略称辞書(165エントリ・6分野)は [`@shuji-bonji/houki-abbreviations`](https://github.com/shuji-bonji/houki-abbreviations) を内部で利用しています。
|
|
25
|
+
|
|
26
|
+
## インストール
|
|
27
|
+
|
|
28
|
+
### Claude Desktop で使う
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
// claude_desktop_config.json
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"houki-egov": {
|
|
35
|
+
"command": "npx",
|
|
36
|
+
"args": ["-y", "@shuji-bonji/houki-egov-mcp"]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### ローカル開発
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
git clone git@github.com:shuji-bonji/houki-egov-mcp.git
|
|
46
|
+
cd houki-egov-mcp
|
|
47
|
+
npm install
|
|
48
|
+
npm run build
|
|
49
|
+
npm test
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
// 開発中の動作確認 (.mcp.json)
|
|
54
|
+
{
|
|
55
|
+
"mcpServers": {
|
|
56
|
+
"houki-egov-local": {
|
|
57
|
+
"command": "node",
|
|
58
|
+
"args": ["/absolute/path/to/houki-egov-mcp/dist/index.js"]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 使用例
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
# LLM への問いかけ → MCP ツール呼び出し
|
|
68
|
+
|
|
69
|
+
「消費税法30条1項を見せて」
|
|
70
|
+
→ get_law(law_name="消法", article="30", paragraph=1)
|
|
71
|
+
|
|
72
|
+
「労働基準法の目次を取得」
|
|
73
|
+
→ get_toc(law_name="労基法")
|
|
74
|
+
|
|
75
|
+
「個人情報保護法の改正履歴を最新5件」
|
|
76
|
+
→ get_law_revisions(law_name="個情法", latest=5)
|
|
77
|
+
|
|
78
|
+
「電帳法って正式名称なに?」
|
|
79
|
+
→ resolve_abbreviation(abbr="電帳法")
|
|
80
|
+
→ 電子計算機を使用して作成する国税関係帳簿書類の保存方法等の特例に関する法律
|
|
81
|
+
|
|
82
|
+
「政令と省令の違いは?」
|
|
83
|
+
→ explain_law_type(name="政令")
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 状態
|
|
87
|
+
|
|
88
|
+
**v0.2.0 (2026-04-27)**
|
|
89
|
+
|
|
90
|
+
- [x] e-Gov 法令API v2 クライアント(`searchLaws` / `getLawData` / `getLawRevisions`)
|
|
91
|
+
- [x] 法令ツリー走査(条/項/号、目次抽出)+ LRU cache
|
|
92
|
+
- [x] 7ツール本実装
|
|
93
|
+
- [x] 略称辞書を [`@shuji-bonji/houki-abbreviations`](https://github.com/shuji-bonji/houki-abbreviations) ^0.1.0 に分離
|
|
94
|
+
- [x] 法令階層ナレッジ(憲法・法律・政令・省令・規則・条例・告示・訓令・通達・通知 の10種別)
|
|
95
|
+
- [x] Trusted Publisher (OIDC) で publish
|
|
96
|
+
- [x] テストスイート(**50 tests**)
|
|
97
|
+
|
|
98
|
+
### 計画中
|
|
99
|
+
|
|
100
|
+
- [ ] Phase 2: `search_fulltext` 本実装(bulkDL + SQLite FTS5)
|
|
101
|
+
- [ ] 漢数字対応(「第三十条」を 30 に変換)
|
|
102
|
+
- [ ] 大規模法令の応答サイズ対策(民法・会社法)
|
|
103
|
+
- [ ] エラーメッセージの LLM 可読化向上
|
|
104
|
+
|
|
105
|
+
## houki-hub MCP family
|
|
106
|
+
|
|
107
|
+
houki-egov-mcp は **単体で利用可能**ですが、houki-hub MCP family の一員でもあります。同じ family 内の他 MCP(計画中)と組み合わせると、通達・判例等まで横断的に扱えます。
|
|
108
|
+
|
|
109
|
+
| パッケージ | 役割 | 状態 |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `@shuji-bonji/houki-abbreviations` | 略称辞書(共有ライブラリ) | ✅ v0.1.0 |
|
|
112
|
+
| **`@shuji-bonji/houki-egov-mcp`** | **e-Gov 法令API クライアント(このリポジトリ)** | ✅ v0.2.0 |
|
|
113
|
+
| `@shuji-bonji/houki-nta-mcp` | 国税庁通達・Q&A・タックスアンサー | 計画中 |
|
|
114
|
+
| `@shuji-bonji/houki-mhlw-mcp` | 厚労省通達・通知 | 計画中 |
|
|
115
|
+
| `@shuji-bonji/houki-court-mcp` | 判例(裁判所サイト) | 構想中 |
|
|
116
|
+
| `@shuji-bonji/houki-saiketsu-mcp` | 国税不服審判所裁決 | 構想中 |
|
|
117
|
+
| `@shuji-bonji/houki-hub` | meta-package(一括 install) | 計画中 |
|
|
118
|
+
|
|
119
|
+
family 全体の設計思想・想定利用シーン・業法との関係は [`docs/DESIGN.md`](docs/DESIGN.md) を参照。
|
|
120
|
+
|
|
121
|
+
## ドキュメント
|
|
122
|
+
|
|
123
|
+
- [`docs/LAW-HIERARCHY.md`](docs/LAW-HIERARCHY.md) — 法令種別の階層リファレンス(専門家でない利用者向け)
|
|
124
|
+
- [`docs/USE-CASES.md`](docs/USE-CASES.md) — プロダクト開発の典型ユースケース(電帳法・電子契約・個情法・e-KYC)
|
|
125
|
+
- [`docs/DESIGN.md`](docs/DESIGN.md) — 設計原則・houki-hub family のロードマップ・業法との関係
|
|
126
|
+
- [`DISCLAIMER.md`](DISCLAIMER.md) — 利用上の注意(業法との関係)
|
|
127
|
+
- [`CONTRIBUTING.md`](CONTRIBUTING.md) — 貢献方法
|
|
128
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — リリースノート
|
|
129
|
+
|
|
130
|
+
## 業法との関係
|
|
131
|
+
|
|
132
|
+
本MCPは **一次情報の取得・提示のみ** を担います。分析は LLM、判断は利用者(または有資格者)の責任です。**業としての法律事務・税務業務への利用は想定外**です — 詳細は [DISCLAIMER.md](DISCLAIMER.md) 参照。
|
|
133
|
+
|
|
134
|
+
## デジタル庁公式 MCP との関係
|
|
135
|
+
|
|
136
|
+
デジタル庁は 2025年12月〜2026年3月の「法令×デジタル」ハッカソンで法令API / MCP のプロトタイプを試行提供した。将来一般公開された場合は、本 MCP のコアを公式 MCP に委譲し、houki-hub family 全体は **公式が手を出さないレイヤ(通達・裁決・判例の横断インデックス、業法対応 Skill 等)** に注力する方針。
|
|
137
|
+
|
|
138
|
+
## ライセンス
|
|
139
|
+
|
|
140
|
+
MIT — 個人利用・学習用途のフォーク・改変・再配布を自由に許可します。
|
|
141
|
+
|
|
142
|
+
ただし、**業としての使用(弁護士法72条・税理士法52条・社労士法27条が定める独占業務)** については想定外であり、作者は一切の責任を負いません。[DISCLAIMER.md](DISCLAIMER.md) を必ずご確認ください。
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Configuration
|
|
3
|
+
* Centralized configuration management
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Package information (dynamically loaded from package.json)
|
|
7
|
+
*/
|
|
8
|
+
export declare const PACKAGE_INFO: {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly version: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* e-Gov Law API v2 endpoints
|
|
14
|
+
* Spec: https://laws.e-gov.go.jp/api/2/swagger-ui
|
|
15
|
+
*
|
|
16
|
+
* NOTE: Query parameters use snake_case (law_title, law_type, ...) — verified 2026-04-23
|
|
17
|
+
*/
|
|
18
|
+
export declare const EGOV_API: {
|
|
19
|
+
readonly baseUrl: "https://laws.e-gov.go.jp/api/2";
|
|
20
|
+
/** Search laws by keyword/title/number */
|
|
21
|
+
readonly laws: "https://laws.e-gov.go.jp/api/2/laws";
|
|
22
|
+
/** Fetch law body (JSON tree) */
|
|
23
|
+
readonly lawData: (lawId: string) => string;
|
|
24
|
+
/** Fetch law revisions list */
|
|
25
|
+
readonly lawRevisions: (lawId: string) => string;
|
|
26
|
+
/** Public-facing URL(出典として返却) */
|
|
27
|
+
readonly publicLawUrl: (lawId: string) => string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* e-Gov XML bulk download
|
|
31
|
+
* Used as local-FTS source when HOUKI_HUB_BULK_CACHE=1
|
|
32
|
+
*/
|
|
33
|
+
export declare const EGOV_BULK: {
|
|
34
|
+
readonly indexUrl: "https://laws.e-gov.go.jp/bulkdownload/";
|
|
35
|
+
/** Per-category bulk archive URL (populated at fetch time) */
|
|
36
|
+
readonly categoryBase: "https://laws.e-gov.go.jp/download/";
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* HTTP request configuration
|
|
40
|
+
*/
|
|
41
|
+
export declare const HTTP_CONFIG: {
|
|
42
|
+
readonly userAgent: `${string}/${string}`;
|
|
43
|
+
readonly timeout: 30000;
|
|
44
|
+
readonly maxRetries: 3;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Cache configuration
|
|
48
|
+
*/
|
|
49
|
+
export declare const CACHE_CONFIG: {
|
|
50
|
+
readonly xml: {
|
|
51
|
+
readonly maxSize: 20;
|
|
52
|
+
readonly name: "XMLCache";
|
|
53
|
+
};
|
|
54
|
+
readonly parsed: {
|
|
55
|
+
readonly maxSize: 50;
|
|
56
|
+
readonly name: "ParseCache";
|
|
57
|
+
};
|
|
58
|
+
readonly searchResults: {
|
|
59
|
+
readonly maxSize: 30;
|
|
60
|
+
readonly name: "SearchCache";
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Runtime flags from environment
|
|
65
|
+
*/
|
|
66
|
+
export declare const RUNTIME_FLAGS: {
|
|
67
|
+
/** Enable local bulk-download cache (SQLite FTS5) */
|
|
68
|
+
readonly bulkCache: boolean;
|
|
69
|
+
/** Comma-separated list of extension packages to load */
|
|
70
|
+
readonly extensions: string[];
|
|
71
|
+
/** Enable debug logs */
|
|
72
|
+
readonly debug: boolean;
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;IAEnB,0CAA0C;;IAE1C,iCAAiC;8BAChB,MAAM;IACvB,+BAA+B;mCACT,MAAM;IAC5B,iCAAiC;mCACX,MAAM;CACpB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,SAAS;;IAEpB,8DAA8D;;CAEtD,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAIf,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB,qDAAqD;;IAErD,yDAAyD;;IAKzD,wBAAwB;;CAEhB,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Configuration
|
|
3
|
+
* Centralized configuration management
|
|
4
|
+
*/
|
|
5
|
+
import { createRequire } from 'module';
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const packageJson = require('../package.json');
|
|
8
|
+
/**
|
|
9
|
+
* Package information (dynamically loaded from package.json)
|
|
10
|
+
*/
|
|
11
|
+
export const PACKAGE_INFO = {
|
|
12
|
+
name: packageJson.name,
|
|
13
|
+
version: packageJson.version,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* e-Gov Law API v2 endpoints
|
|
17
|
+
* Spec: https://laws.e-gov.go.jp/api/2/swagger-ui
|
|
18
|
+
*
|
|
19
|
+
* NOTE: Query parameters use snake_case (law_title, law_type, ...) — verified 2026-04-23
|
|
20
|
+
*/
|
|
21
|
+
export const EGOV_API = {
|
|
22
|
+
baseUrl: 'https://laws.e-gov.go.jp/api/2',
|
|
23
|
+
/** Search laws by keyword/title/number */
|
|
24
|
+
laws: 'https://laws.e-gov.go.jp/api/2/laws',
|
|
25
|
+
/** Fetch law body (JSON tree) */
|
|
26
|
+
lawData: (lawId) => `https://laws.e-gov.go.jp/api/2/law_data/${lawId}`,
|
|
27
|
+
/** Fetch law revisions list */
|
|
28
|
+
lawRevisions: (lawId) => `https://laws.e-gov.go.jp/api/2/law_revisions/${lawId}`,
|
|
29
|
+
/** Public-facing URL(出典として返却) */
|
|
30
|
+
publicLawUrl: (lawId) => `https://laws.e-gov.go.jp/law/${lawId}`,
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* e-Gov XML bulk download
|
|
34
|
+
* Used as local-FTS source when HOUKI_HUB_BULK_CACHE=1
|
|
35
|
+
*/
|
|
36
|
+
export const EGOV_BULK = {
|
|
37
|
+
indexUrl: 'https://laws.e-gov.go.jp/bulkdownload/',
|
|
38
|
+
/** Per-category bulk archive URL (populated at fetch time) */
|
|
39
|
+
categoryBase: 'https://laws.e-gov.go.jp/download/',
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* HTTP request configuration
|
|
43
|
+
*/
|
|
44
|
+
export const HTTP_CONFIG = {
|
|
45
|
+
userAgent: `${PACKAGE_INFO.name}/${PACKAGE_INFO.version}`,
|
|
46
|
+
timeout: 30000,
|
|
47
|
+
maxRetries: 3,
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Cache configuration
|
|
51
|
+
*/
|
|
52
|
+
export const CACHE_CONFIG = {
|
|
53
|
+
xml: { maxSize: 20, name: 'XMLCache' },
|
|
54
|
+
parsed: { maxSize: 50, name: 'ParseCache' },
|
|
55
|
+
searchResults: { maxSize: 30, name: 'SearchCache' },
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Runtime flags from environment
|
|
59
|
+
*/
|
|
60
|
+
export const RUNTIME_FLAGS = {
|
|
61
|
+
/** Enable local bulk-download cache (SQLite FTS5) */
|
|
62
|
+
bulkCache: process.env.HOUKI_HUB_BULK_CACHE === '1',
|
|
63
|
+
/** Comma-separated list of extension packages to load */
|
|
64
|
+
extensions: (process.env.HOUKI_HUB_EXTENSIONS ?? '')
|
|
65
|
+
.split(',')
|
|
66
|
+
.map((s) => s.trim())
|
|
67
|
+
.filter(Boolean),
|
|
68
|
+
/** Enable debug logs */
|
|
69
|
+
debug: process.env.DEBUG === '1' || process.env.DEBUG === 'true',
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CACpB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,gCAAgC;IACzC,0CAA0C;IAC1C,IAAI,EAAE,qCAAqC;IAC3C,iCAAiC;IACjC,OAAO,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,2CAA2C,KAAK,EAAE;IAC9E,+BAA+B;IAC/B,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,gDAAgD,KAAK,EAAE;IACxF,iCAAiC;IACjC,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,gCAAgC,KAAK,EAAE;CAChE,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,wCAAwC;IAClD,8DAA8D;IAC9D,YAAY,EAAE,oCAAoC;CAC1C,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE;IACzD,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,CAAC;CACL,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;IACtC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;IAC3C,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;CAC3C,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;IACnD,yDAAyD;IACzD,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;SACjD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;IAClB,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM;CACxD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Constants — egov-mcp 固有
|
|
3
|
+
*
|
|
4
|
+
* 略称辞書系の定数(LAW_TYPE_CODES / DOMAINS)は @shuji-bonji/houki-abbreviations
|
|
5
|
+
* から re-export している。Single Source of Truth はそちら。
|
|
6
|
+
*/
|
|
7
|
+
export { LAW_TYPE_CODES, DOMAINS } from '@shuji-bonji/houki-abbreviations';
|
|
8
|
+
export type { LawTypeCode, Domain } from '@shuji-bonji/houki-abbreviations';
|
|
9
|
+
/** 元号コード(e-Gov law_id の先頭1文字) */
|
|
10
|
+
export declare const ERA_CODES: {
|
|
11
|
+
readonly 1: "Meiji";
|
|
12
|
+
readonly 2: "Taisho";
|
|
13
|
+
readonly 3: "Showa";
|
|
14
|
+
readonly 4: "Heisei";
|
|
15
|
+
readonly 5: "Reiwa";
|
|
16
|
+
};
|
|
17
|
+
/** 検索結果・取得件数の上限 */
|
|
18
|
+
export declare const LIMITS: {
|
|
19
|
+
readonly searchDefault: 10;
|
|
20
|
+
readonly searchMax: 50;
|
|
21
|
+
readonly fulltextDefault: 10;
|
|
22
|
+
readonly fulltextMax: 30;
|
|
23
|
+
};
|
|
24
|
+
/** 出力フォーマットの列挙 */
|
|
25
|
+
export declare const OUTPUT_FORMATS: readonly ["markdown", "json", "toc"];
|
|
26
|
+
export type OutputFormat = (typeof OUTPUT_FORMATS)[number];
|
|
27
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3E,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAE5E,iCAAiC;AACjC,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAC;AAEX,mBAAmB;AACnB,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AAEX,kBAAkB;AAClB,eAAO,MAAM,cAAc,sCAAuC,CAAC;AACnE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Constants — egov-mcp 固有
|
|
3
|
+
*
|
|
4
|
+
* 略称辞書系の定数(LAW_TYPE_CODES / DOMAINS)は @shuji-bonji/houki-abbreviations
|
|
5
|
+
* から re-export している。Single Source of Truth はそちら。
|
|
6
|
+
*/
|
|
7
|
+
// houki-abbreviations から共有定数を re-export
|
|
8
|
+
export { LAW_TYPE_CODES, DOMAINS } from '@shuji-bonji/houki-abbreviations';
|
|
9
|
+
/** 元号コード(e-Gov law_id の先頭1文字) */
|
|
10
|
+
export const ERA_CODES = {
|
|
11
|
+
1: 'Meiji',
|
|
12
|
+
2: 'Taisho',
|
|
13
|
+
3: 'Showa',
|
|
14
|
+
4: 'Heisei',
|
|
15
|
+
5: 'Reiwa',
|
|
16
|
+
};
|
|
17
|
+
/** 検索結果・取得件数の上限 */
|
|
18
|
+
export const LIMITS = {
|
|
19
|
+
searchDefault: 10,
|
|
20
|
+
searchMax: 50,
|
|
21
|
+
fulltextDefault: 10,
|
|
22
|
+
fulltextMax: 30,
|
|
23
|
+
};
|
|
24
|
+
/** 出力フォーマットの列挙 */
|
|
25
|
+
export const OUTPUT_FORMATS = ['markdown', 'json', 'toc'];
|
|
26
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wCAAwC;AACxC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAG3E,iCAAiC;AACjC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,OAAO;CACF,CAAC;AAEX,mBAAmB;AACnB,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,aAAa,EAAE,EAAE;IACjB,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,EAAE;IACnB,WAAW,EAAE,EAAE;CACP,CAAC;AAEX,kBAAkB;AAClB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 法令を Markdown に整形する。
|
|
3
|
+
*
|
|
4
|
+
* 出力規約:
|
|
5
|
+
* - 見出しは `# 法令名 第X条第Y項第Z号`(指定された粒度に応じて)
|
|
6
|
+
* - 末尾に必ず出典 URL と取得日時を付ける
|
|
7
|
+
* - 本MCPは事実情報の提示に徹し、判断・解釈は加えない
|
|
8
|
+
*/
|
|
9
|
+
import type { LawNode } from '../services/egov-client.js';
|
|
10
|
+
import { type TocNode } from '../services/law-tree.js';
|
|
11
|
+
export interface FormatArticleOptions {
|
|
12
|
+
lawTitle: string;
|
|
13
|
+
lawId: string;
|
|
14
|
+
article: LawNode;
|
|
15
|
+
/** 項を指定して取得する場合 */
|
|
16
|
+
paragraph?: LawNode;
|
|
17
|
+
/** 号を指定して取得する場合 */
|
|
18
|
+
item?: LawNode;
|
|
19
|
+
retrievedAt: string;
|
|
20
|
+
at?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 条文を Markdown に整形する。
|
|
24
|
+
* paragraph / item 指定があればその範囲だけ出力。
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatArticleMarkdown(opts: FormatArticleOptions): string;
|
|
27
|
+
/**
|
|
28
|
+
* TOC を Markdown に整形。
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatTocMarkdown(opts: {
|
|
31
|
+
lawTitle: string;
|
|
32
|
+
lawId: string;
|
|
33
|
+
toc: TocNode[];
|
|
34
|
+
retrievedAt: string;
|
|
35
|
+
at?: string;
|
|
36
|
+
}): string;
|
|
37
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAiCxE;AAoCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,MAAM,CAWT"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 法令を Markdown に整形する。
|
|
3
|
+
*
|
|
4
|
+
* 出力規約:
|
|
5
|
+
* - 見出しは `# 法令名 第X条第Y項第Z号`(指定された粒度に応じて)
|
|
6
|
+
* - 末尾に必ず出典 URL と取得日時を付ける
|
|
7
|
+
* - 本MCPは事実情報の提示に徹し、判断・解釈は加えない
|
|
8
|
+
*/
|
|
9
|
+
import { extractText, findChildByTag, findChildrenByTag, getArticleCaption, } from '../services/law-tree.js';
|
|
10
|
+
import { fromEgovArticleNum } from '../utils/article-num.js';
|
|
11
|
+
import { EGOV_API } from '../config.js';
|
|
12
|
+
/**
|
|
13
|
+
* 条文を Markdown に整形する。
|
|
14
|
+
* paragraph / item 指定があればその範囲だけ出力。
|
|
15
|
+
*/
|
|
16
|
+
export function formatArticleMarkdown(opts) {
|
|
17
|
+
const { lawTitle, lawId, article, paragraph, item, retrievedAt, at } = opts;
|
|
18
|
+
const articleNum = article.attr?.Num ?? '';
|
|
19
|
+
const articleNumDisplay = fromEgovArticleNum(articleNum);
|
|
20
|
+
const caption = getArticleCaption(article);
|
|
21
|
+
// 見出し
|
|
22
|
+
let header;
|
|
23
|
+
if (item && paragraph) {
|
|
24
|
+
header = `# ${lawTitle} 第${articleNumDisplay}条第${paragraph.attr?.Num}項第${item.attr?.Num}号`;
|
|
25
|
+
}
|
|
26
|
+
else if (paragraph) {
|
|
27
|
+
header = `# ${lawTitle} 第${articleNumDisplay}条第${paragraph.attr?.Num}項`;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
header = `# ${lawTitle} 第${articleNumDisplay}条`;
|
|
31
|
+
}
|
|
32
|
+
// 本文
|
|
33
|
+
let body;
|
|
34
|
+
if (item) {
|
|
35
|
+
body = extractText(item).trim();
|
|
36
|
+
}
|
|
37
|
+
else if (paragraph) {
|
|
38
|
+
body = formatParagraph(paragraph);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
body = formatArticleBody(article);
|
|
42
|
+
}
|
|
43
|
+
const url = EGOV_API.publicLawUrl(lawId);
|
|
44
|
+
const lines = [header];
|
|
45
|
+
if (caption)
|
|
46
|
+
lines.push(caption);
|
|
47
|
+
lines.push('', body, '', '---', '出典:e-Gov法令検索(デジタル庁)', `URL: ${url}`);
|
|
48
|
+
if (at)
|
|
49
|
+
lines.push(`時点: ${at}`);
|
|
50
|
+
lines.push(`取得日時: ${retrievedAt}`);
|
|
51
|
+
return lines.join('\n');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Article 全体を Markdown に整形(全項・全号を含む)。
|
|
55
|
+
*/
|
|
56
|
+
function formatArticleBody(article) {
|
|
57
|
+
const paragraphs = findChildrenByTag(article, 'Paragraph');
|
|
58
|
+
return paragraphs.map(formatParagraph).join('\n\n');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Paragraph を整形。
|
|
62
|
+
* - 1項のみ → "(項本文)"
|
|
63
|
+
* - 号があれば箇条書きでぶら下げ
|
|
64
|
+
*/
|
|
65
|
+
function formatParagraph(paragraph) {
|
|
66
|
+
const paragraphNum = paragraph.attr?.Num ?? '';
|
|
67
|
+
const sentenceNode = findChildByTag(paragraph, 'ParagraphSentence');
|
|
68
|
+
const sentenceText = sentenceNode ? extractText(sentenceNode).trim() : '';
|
|
69
|
+
const items = findChildrenByTag(paragraph, 'Item');
|
|
70
|
+
const lines = [];
|
|
71
|
+
// 項番号は 1 のみのとき表示しない(条文単独の場合)
|
|
72
|
+
if (paragraphNum && paragraphNum !== '1') {
|
|
73
|
+
lines.push(`**第${paragraphNum}項**`);
|
|
74
|
+
}
|
|
75
|
+
if (sentenceText)
|
|
76
|
+
lines.push(sentenceText);
|
|
77
|
+
for (const item of items) {
|
|
78
|
+
const itemNum = item.attr?.Num ?? '';
|
|
79
|
+
const itemText = extractText(item).trim();
|
|
80
|
+
lines.push(`${itemNum} ${itemText.replace(/^[一二三四五六七八九十百\d]+\s*/, '')}`);
|
|
81
|
+
}
|
|
82
|
+
return lines.join('\n');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* TOC を Markdown に整形。
|
|
86
|
+
*/
|
|
87
|
+
export function formatTocMarkdown(opts) {
|
|
88
|
+
const { lawTitle, lawId, toc, retrievedAt, at } = opts;
|
|
89
|
+
const lines = [`# ${lawTitle} — 目次`, ''];
|
|
90
|
+
for (const node of toc) {
|
|
91
|
+
appendTocLines(lines, node, 0);
|
|
92
|
+
}
|
|
93
|
+
lines.push('', '---', '出典:e-Gov法令検索(デジタル庁)');
|
|
94
|
+
lines.push(`URL: ${EGOV_API.publicLawUrl(lawId)}`);
|
|
95
|
+
if (at)
|
|
96
|
+
lines.push(`時点: ${at}`);
|
|
97
|
+
lines.push(`取得日時: ${retrievedAt}`);
|
|
98
|
+
return lines.join('\n');
|
|
99
|
+
}
|
|
100
|
+
function appendTocLines(lines, node, depth) {
|
|
101
|
+
const indent = ' '.repeat(depth);
|
|
102
|
+
if (node.tag === 'Article') {
|
|
103
|
+
const numDisplay = node.num ? fromEgovArticleNum(node.num) : '';
|
|
104
|
+
const captionPart = node.caption ? ` ${node.caption}` : '';
|
|
105
|
+
lines.push(`${indent}- 第${numDisplay}条${captionPart}`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
lines.push(`${indent}- ${node.title}`);
|
|
109
|
+
for (const c of node.children) {
|
|
110
|
+
appendTocLines(lines, c, depth + 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* JP-Houki MCP Server
|
|
4
|
+
* Japanese laws and regulations MCP — thin e-Gov core with pluggable extensions
|
|
5
|
+
*/
|
|
6
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { tools } from './tools/definitions.js';
|
|
10
|
+
import { toolHandlers } from './tools/handlers.js';
|
|
11
|
+
import { PACKAGE_INFO } from './config.js';
|
|
12
|
+
import { logger } from './utils/logger.js';
|
|
13
|
+
// Server instance
|
|
14
|
+
const server = new Server({
|
|
15
|
+
name: PACKAGE_INFO.name,
|
|
16
|
+
version: PACKAGE_INFO.version,
|
|
17
|
+
}, {
|
|
18
|
+
capabilities: {
|
|
19
|
+
tools: {},
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
// List tools
|
|
23
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
24
|
+
return { tools };
|
|
25
|
+
});
|
|
26
|
+
// Execute tool
|
|
27
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
28
|
+
const { name, arguments: args } = request.params;
|
|
29
|
+
try {
|
|
30
|
+
const handler = toolHandlers[name];
|
|
31
|
+
if (!handler) {
|
|
32
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
33
|
+
}
|
|
34
|
+
const result = await handler(args);
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: 'text',
|
|
39
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: 'text', text: JSON.stringify({ error: message }, null, 2) }],
|
|
48
|
+
isError: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// Start server
|
|
53
|
+
async function main() {
|
|
54
|
+
const transport = new StdioServerTransport();
|
|
55
|
+
await server.connect(transport);
|
|
56
|
+
logger.info('server', `${PACKAGE_INFO.name} v${PACKAGE_INFO.version} started`);
|
|
57
|
+
}
|
|
58
|
+
main().catch((error) => {
|
|
59
|
+
logger.error('server', 'fatal error', error instanceof Error ? error : new Error(String(error)));
|
|
60
|
+
process.exit(1);
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,kBAAkB;AAClB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,YAAY,CAAC,IAAI;IACvB,OAAO,EAAE,YAAY,CAAC,OAAO;CAC9B,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,aAAa;AACb,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC5E;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;AACjF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|