@shuji-bonji/houki-nta-mcp 0.0.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/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,132 @@
1
+ # Houki NTA MCP Server
2
+
3
+ [![CI](https://github.com/shuji-bonji/houki-nta-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/shuji-bonji/houki-nta-mcp/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
+ [![Node](https://img.shields.io/badge/Node-%3E%3D20-brightgreen)](https://nodejs.org/)
6
+
7
+ 国税庁(NTA)の **通達・質疑応答事例・タックスアンサー**を取得する MCP サーバ。
8
+
9
+ 法律本文は houki-hub family の別 MCP([`@shuji-bonji/houki-egov-mcp`](https://github.com/shuji-bonji/houki-egov-mcp))が担当します。
10
+
11
+ ## 状態: Phase 0(スケルトンのみ)
12
+
13
+ このリポジトリは現在 **Phase 0**(プロジェクト骨格・ツール定義スタブ・設計ドキュメント)の段階です。実際のスクレイピング実装(Phase 1)は未着手で、`nta_*` ツールは「未実装」レスポンスを返します。
14
+
15
+ 実装ロードマップは [`docs/DESIGN.md`](docs/DESIGN.md) を参照。
16
+
17
+ ## 提供予定のツール
18
+
19
+ | Tool | 用途 | Phase |
20
+ |---|---|---|
21
+ | `nta_search_tsutatsu` | 通達をキーワード検索 | Phase 1 |
22
+ | `nta_get_tsutatsu` | 通達本文を取得(章-項-号 単位指定可)| Phase 1 |
23
+ | `nta_search_qa` | 質疑応答事例をキーワード検索 | Phase 1 |
24
+ | `nta_get_qa` | 質疑応答事例の本文を取得 | Phase 1 |
25
+ | `nta_search_tax_answer` | タックスアンサーをキーワード検索 | Phase 1 |
26
+ | `nta_get_tax_answer` | タックスアンサー本文を取得(番号指定)| Phase 1 |
27
+ | `resolve_abbreviation` | 略称→エントリ解決(houki-abbreviations 経由)| ✅ Phase 0 |
28
+
29
+ ## 通達の法的位置付け(重要)
30
+
31
+ 通達は **行政内部文書**であり、国民・裁判所には直接的な法的拘束力を持ちません(最高裁 昭和43.12.24 墓地埋葬法事件)。ただし税務署員は職務命令として守る義務があり、**実務上は事実上の規範**として機能します。
32
+
33
+ ```
34
+ ┌──────────────────────────────────────────────────┐
35
+ │ 法律 (国会制定) → 全員に拘束力 │
36
+ │ 政令・省令・告示 → 同上 │
37
+ │ ─── ここまでが houki-egov-mcp ─── │
38
+ │ 通達 (行政内部) → 税務署員のみ拘束 │
39
+ │ 質疑応答事例 → 参考情報 │
40
+ │ タックスアンサー → 一般向け解説 │
41
+ │ ─── ここが houki-nta-mcp ─── │
42
+ └──────────────────────────────────────────────────┘
43
+ ```
44
+
45
+ ## なぜ通達まで取得するのか
46
+
47
+ 法律本文だけでは判断できないケースが多数あります。例えば消費税の軽減税率:
48
+
49
+ - **法律**(消費税法 4条)「飲食料品の譲渡には軽減税率を適用」
50
+ - **政令**: 飲食料品の定義
51
+ - **基本通達 5-1-9**: 「社内会議で出した飲食料品」「会議室への提供」「テイクアウト」の区分
52
+ - **質疑応答事例**: 個別事例(「テレワーク手当に含まれる飲料水」等)
53
+
54
+ 会計・経理・税務系プロダクトを開発する場合、**通達レベルまで参照しないと正しい判定ができない**ことが多く、houki-nta-mcp はその領域をカバーします。
55
+
56
+ 詳細は [`docs/DESIGN.md`](docs/DESIGN.md) を参照。
57
+
58
+ ## houki-hub MCP family
59
+
60
+ | パッケージ | 役割 | 状態 |
61
+ |---|---|---|
62
+ | [`@shuji-bonji/houki-abbreviations`](https://github.com/shuji-bonji/houki-abbreviations) | 略称辞書(共有ライブラリ) | ✅ v0.1.0 |
63
+ | [`@shuji-bonji/houki-egov-mcp`](https://github.com/shuji-bonji/houki-egov-mcp) | e-Gov 法令API クライアント | ✅ v0.2.0 |
64
+ | **`@shuji-bonji/houki-nta-mcp`** | **国税庁通達・Q&A・タックスアンサー(このリポジトリ)** | 🚧 Phase 0 |
65
+ | `@shuji-bonji/houki-mhlw-mcp` | 厚労省通達・通知 | 計画中 |
66
+ | `@shuji-bonji/houki-court-mcp` | 判例(裁判所サイト) | 構想中 |
67
+ | `@shuji-bonji/houki-saiketsu-mcp` | 国税不服審判所裁決 | 構想中 |
68
+ | `@shuji-bonji/houki-hub` | meta-package(一括 install) | 計画中 |
69
+
70
+ ## インストール(Phase 1 リリース後)
71
+
72
+ ```json
73
+ // claude_desktop_config.json
74
+ {
75
+ "mcpServers": {
76
+ "houki-egov": {
77
+ "command": "npx",
78
+ "args": ["-y", "@shuji-bonji/houki-egov-mcp"]
79
+ },
80
+ "houki-nta": {
81
+ "command": "npx",
82
+ "args": ["-y", "@shuji-bonji/houki-nta-mcp"]
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ 法律本文と通達の両方を引けるよう、両方を併用することを推奨します。
89
+
90
+ ## ローカル開発
91
+
92
+ ```bash
93
+ git clone git@github.com:shuji-bonji/houki-nta-mcp.git
94
+ cd houki-nta-mcp
95
+ npm install
96
+ npm run build
97
+ npm test
98
+ ```
99
+
100
+ ```json
101
+ // 開発中の動作確認 (.mcp.json)
102
+ {
103
+ "mcpServers": {
104
+ "houki-nta-local": {
105
+ "command": "node",
106
+ "args": ["/absolute/path/to/houki-nta-mcp/dist/index.js"]
107
+ }
108
+ }
109
+ }
110
+ ```
111
+
112
+ ## ドキュメント
113
+
114
+ - [`docs/DESIGN.md`](docs/DESIGN.md) — 設計原則・houki-hub family 内の位置付け・ツール設計
115
+ - [`docs/DATA-SOURCES.md`](docs/DATA-SOURCES.md) — 国税庁公開コンテンツの URL 構造・スクレイピング方針・ライセンス
116
+ - [`DISCLAIMER.md`](DISCLAIMER.md) — 通達の法的位置付け・利用範囲
117
+ - [`CONTRIBUTING.md`](CONTRIBUTING.md) — 貢献方法
118
+ - [`CHANGELOG.md`](CHANGELOG.md) — リリースノート
119
+
120
+ ## 業法との関係
121
+
122
+ 本MCP は **一次情報の取得・提示のみ** を担います。分析は LLM、判断は利用者(または有資格者)の責任です。
123
+
124
+ **業としての税務代理・税務書類作成・税務相談(税理士法52条)への利用は想定外**です。詳細は [DISCLAIMER.md](DISCLAIMER.md) 参照。
125
+
126
+ ## ライセンス
127
+
128
+ MIT — 個人利用・学習用途のフォーク・改変・再配布を自由に許可します。
129
+
130
+ 国税庁コンテンツの著作権は **国(国税庁)**にあり、再配布・改変は[政府標準利用規約(第2.0版)](https://cio.go.jp/policy-opendata)の範囲内で可能です。本MCP は出典 URL を必ず付与する設計とし、利用者は元情報を確認できます。
131
+
132
+ ただし、**業としての使用(税理士法52条が定める独占業務)** については想定外であり、作者は一切の責任を負いません。[DISCLAIMER.md](DISCLAIMER.md) を必ずご確認ください。
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Configuration
3
+ *
4
+ * package.json から動的に version を取得する(hardcode 禁止)。
5
+ */
6
+ export declare const PACKAGE_INFO: {
7
+ readonly name: string;
8
+ readonly version: string;
9
+ readonly description: string;
10
+ };
11
+ /** スクレイピング時のタイムアウト・リトライ設定(Phase 1 で本実装) */
12
+ export declare const FETCH_CONFIG: {
13
+ /** リクエストタイムアウト (ms) */
14
+ readonly timeoutMs: 30000;
15
+ /** 最大リトライ回数 */
16
+ readonly maxRetries: 3;
17
+ /** リトライ間隔の基準値 (ms)。指数バックオフ */
18
+ readonly retryBaseMs: 1000;
19
+ /** User-Agent — 国税庁サイトを叩くときに付ける */
20
+ readonly userAgent: `${string}/${string} (+https://github.com/shuji-bonji/houki-nta-mcp)`;
21
+ };
22
+ /** キャッシュ設定(Phase 1 で本実装) */
23
+ export declare const CACHE_CONFIG: {
24
+ /** メモリキャッシュ最大件数 */
25
+ readonly maxSize: 100;
26
+ /** 有効期限 (ms)。デフォルト 24時間 */
27
+ readonly ttlMs: number;
28
+ };
29
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX,2CAA2C;AAC3C,eAAO,MAAM,YAAY;IACvB,uBAAuB;;IAEvB,eAAe;;IAEf,8BAA8B;;IAE9B,mCAAmC;;CAE3B,CAAC;AAEX,4BAA4B;AAC5B,eAAO,MAAM,YAAY;IACvB,mBAAmB;;IAEnB,2BAA2B;;CAEnB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Configuration
3
+ *
4
+ * package.json から動的に version を取得する(hardcode 禁止)。
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { dirname, resolve } from 'node:path';
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ function loadPackageJson() {
11
+ // dist/config.js から見て ../package.json
12
+ // src/config.ts から見て ../package.json
13
+ const candidates = [
14
+ resolve(__dirname, '..', 'package.json'),
15
+ resolve(__dirname, '..', '..', 'package.json'),
16
+ ];
17
+ for (const path of candidates) {
18
+ try {
19
+ const content = readFileSync(path, 'utf8');
20
+ return JSON.parse(content);
21
+ }
22
+ catch {
23
+ // 次の候補へ
24
+ }
25
+ }
26
+ // 万が一見つからない場合のフォールバック
27
+ return {
28
+ name: '@shuji-bonji/houki-nta-mcp',
29
+ version: '0.0.0',
30
+ };
31
+ }
32
+ const pkg = loadPackageJson();
33
+ export const PACKAGE_INFO = {
34
+ name: pkg.name,
35
+ version: pkg.version,
36
+ description: pkg.description ?? '',
37
+ };
38
+ /** スクレイピング時のタイムアウト・リトライ設定(Phase 1 で本実装) */
39
+ export const FETCH_CONFIG = {
40
+ /** リクエストタイムアウト (ms) */
41
+ timeoutMs: 30_000,
42
+ /** 最大リトライ回数 */
43
+ maxRetries: 3,
44
+ /** リトライ間隔の基準値 (ms)。指数バックオフ */
45
+ retryBaseMs: 1_000,
46
+ /** User-Agent — 国税庁サイトを叩くときに付ける */
47
+ userAgent: `${PACKAGE_INFO.name}/${PACKAGE_INFO.version} (+https://github.com/shuji-bonji/houki-nta-mcp)`,
48
+ };
49
+ /** キャッシュ設定(Phase 1 で本実装) */
50
+ export const CACHE_CONFIG = {
51
+ /** メモリキャッシュ最大件数 */
52
+ maxSize: 100,
53
+ /** 有効期限 (ms)。デフォルト 24時間 */
54
+ ttlMs: 24 * 60 * 60 * 1000,
55
+ };
56
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAQ1D,SAAS,eAAe;IACtB,sCAAsC;IACtC,qCAAqC;IACrC,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC;QACxC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;KAC/C,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ;QACV,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO;QACL,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;AAE9B,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;IACd,OAAO,EAAE,GAAG,CAAC,OAAO;IACpB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;CAC1B,CAAC;AAEX,2CAA2C;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,uBAAuB;IACvB,SAAS,EAAE,MAAM;IACjB,eAAe;IACf,UAAU,EAAE,CAAC;IACb,8BAA8B;IAC9B,WAAW,EAAE,KAAK;IAClB,mCAAmC;IACnC,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,OAAO,kDAAkD;CACjG,CAAC;AAEX,4BAA4B;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,mBAAmB;IACnB,OAAO,EAAE,GAAG;IACZ,2BAA2B;IAC3B,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;CAClB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared Constants — houki-nta-mcp 固有
3
+ *
4
+ * 略称辞書系の定数(DOMAINS / Domain)は @shuji-bonji/houki-abbreviations
5
+ * から re-export している。Single Source of Truth はそちら。
6
+ */
7
+ export { DOMAINS, CATEGORIES, SOURCE_MCP_HINTS } from '@shuji-bonji/houki-abbreviations';
8
+ export type { Domain, Category, SourceMcpHint } from '@shuji-bonji/houki-abbreviations';
9
+ /** このMCPが管轄する source_mcp_hint */
10
+ export declare const NTA_HINT: "houki-nta";
11
+ /** 国税庁サイトの基底 URL */
12
+ export declare const NTA_BASE_URLS: {
13
+ readonly root: "https://www.nta.go.jp";
14
+ /** 通達索引 */
15
+ readonly tsutatsu: "https://www.nta.go.jp/law/tsutatsu/menu.htm";
16
+ /** 質疑応答事例索引 */
17
+ readonly qaJirei: "https://www.nta.go.jp/law/shitsugi/01.htm";
18
+ /** タックスアンサー索引 */
19
+ readonly taxAnswer: "https://www.nta.go.jp/taxes/shiraberu/taxanswer/index2.htm";
20
+ /** 文書回答事例 */
21
+ readonly bunshoKaitou: "https://www.nta.go.jp/about/organization/ntc/bunsyokaito/index.htm";
22
+ };
23
+ /** このMCPが扱う category(houki-abbreviations の Category 型のサブセット) */
24
+ export declare const NTA_CATEGORIES: readonly ["kihon-tsutatsu", "kobetsu-tsutatsu", "qa-jirei", "tax-answer"];
25
+ export type NtaCategory = (typeof NTA_CATEGORIES)[number];
26
+ /** 検索結果・取得件数の上限 */
27
+ export declare const LIMITS: {
28
+ readonly searchDefault: 10;
29
+ readonly searchMax: 50;
30
+ };
31
+ /** 出力フォーマットの列挙 */
32
+ export declare const OUTPUT_FORMATS: readonly ["markdown", "json"];
33
+ export type OutputFormat = (typeof OUTPUT_FORMATS)[number];
34
+ //# 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,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzF,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAExF,iCAAiC;AACjC,eAAO,MAAM,QAAQ,EAAG,WAAoB,CAAC;AAE7C,oBAAoB;AACpB,eAAO,MAAM,aAAa;;IAExB,WAAW;;IAEX,eAAe;;IAEf,iBAAiB;;IAEjB,aAAa;;CAEL,CAAC;AAEX,gEAAgE;AAChE,eAAO,MAAM,cAAc,2EAKjB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,mBAAmB;AACnB,eAAO,MAAM,MAAM;;;CAGT,CAAC;AAEX,kBAAkB;AAClB,eAAO,MAAM,cAAc,+BAAgC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared Constants — houki-nta-mcp 固有
3
+ *
4
+ * 略称辞書系の定数(DOMAINS / Domain)は @shuji-bonji/houki-abbreviations
5
+ * から re-export している。Single Source of Truth はそちら。
6
+ */
7
+ // houki-abbreviations から共有定数を re-export
8
+ export { DOMAINS, CATEGORIES, SOURCE_MCP_HINTS } from '@shuji-bonji/houki-abbreviations';
9
+ /** このMCPが管轄する source_mcp_hint */
10
+ export const NTA_HINT = 'houki-nta';
11
+ /** 国税庁サイトの基底 URL */
12
+ export const NTA_BASE_URLS = {
13
+ root: 'https://www.nta.go.jp',
14
+ /** 通達索引 */
15
+ tsutatsu: 'https://www.nta.go.jp/law/tsutatsu/menu.htm',
16
+ /** 質疑応答事例索引 */
17
+ qaJirei: 'https://www.nta.go.jp/law/shitsugi/01.htm',
18
+ /** タックスアンサー索引 */
19
+ taxAnswer: 'https://www.nta.go.jp/taxes/shiraberu/taxanswer/index2.htm',
20
+ /** 文書回答事例 */
21
+ bunshoKaitou: 'https://www.nta.go.jp/about/organization/ntc/bunsyokaito/index.htm',
22
+ };
23
+ /** このMCPが扱う category(houki-abbreviations の Category 型のサブセット) */
24
+ export const NTA_CATEGORIES = [
25
+ 'kihon-tsutatsu',
26
+ 'kobetsu-tsutatsu',
27
+ 'qa-jirei',
28
+ 'tax-answer',
29
+ ];
30
+ /** 検索結果・取得件数の上限 */
31
+ export const LIMITS = {
32
+ searchDefault: 10,
33
+ searchMax: 50,
34
+ };
35
+ /** 出力フォーマットの列挙 */
36
+ export const OUTPUT_FORMATS = ['markdown', 'json'];
37
+ //# 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,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGzF,iCAAiC;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAoB,CAAC;AAE7C,oBAAoB;AACpB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,uBAAuB;IAC7B,WAAW;IACX,QAAQ,EAAE,6CAA6C;IACvD,eAAe;IACf,OAAO,EAAE,2CAA2C;IACpD,iBAAiB;IACjB,SAAS,EAAE,4DAA4D;IACvE,aAAa;IACb,YAAY,EAAE,oEAAoE;CAC1E,CAAC;AAEX,gEAAgE;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,gBAAgB;IAChB,kBAAkB;IAClB,UAAU;IACV,YAAY;CACJ,CAAC;AAGX,mBAAmB;AACnB,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,aAAa,EAAE,EAAE;IACjB,SAAS,EAAE,EAAE;CACL,CAAC;AAEX,kBAAkB;AAClB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,MAAM,CAAU,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * houki-nta-mcp Server
4
+ *
5
+ * 国税庁の通達・質疑応答事例・タックスアンサーへのアクセスを提供する MCP サーバ。
6
+ * Phase 0 ではツール定義のみ。Phase 1 で実装。
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * houki-nta-mcp Server
4
+ *
5
+ * 国税庁の通達・質疑応答事例・タックスアンサーへのアクセスを提供する MCP サーバ。
6
+ * Phase 0 ではツール定義のみ。Phase 1 で実装。
7
+ */
8
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
11
+ import { tools } from './tools/definitions.js';
12
+ import { toolHandlers } from './tools/handlers.js';
13
+ import { PACKAGE_INFO } from './config.js';
14
+ import { logger } from './utils/logger.js';
15
+ // Server instance
16
+ const server = new Server({
17
+ name: PACKAGE_INFO.name,
18
+ version: PACKAGE_INFO.version,
19
+ }, {
20
+ capabilities: {
21
+ tools: {},
22
+ },
23
+ });
24
+ // List tools
25
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
26
+ return { tools };
27
+ });
28
+ // Execute tool
29
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
30
+ const { name, arguments: args } = request.params;
31
+ try {
32
+ const handler = toolHandlers[name];
33
+ if (!handler) {
34
+ throw new Error(`Unknown tool: ${name}`);
35
+ }
36
+ const result = await handler(args);
37
+ return {
38
+ content: [
39
+ {
40
+ type: 'text',
41
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ catch (error) {
47
+ const message = error instanceof Error ? error.message : String(error);
48
+ return {
49
+ content: [{ type: 'text', text: JSON.stringify({ error: message }, null, 2) }],
50
+ isError: true,
51
+ };
52
+ }
53
+ });
54
+ // Start server
55
+ async function main() {
56
+ const transport = new StdioServerTransport();
57
+ await server.connect(transport);
58
+ logger.info('server', `${PACKAGE_INFO.name} v${PACKAGE_INFO.version} started (Phase 0 — stubs only)`);
59
+ }
60
+ main().catch((error) => {
61
+ logger.error('server', 'fatal error', error instanceof Error ? error : new Error(String(error)));
62
+ process.exit(1);
63
+ });
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;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,CACT,QAAQ,EACR,GAAG,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,iCAAiC,CAC/E,CAAC;AACJ,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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Tool Definitions — houki-nta-mcp Phase 0 (スタブ)
3
+ *
4
+ * Phase 1 で本実装。現状はツール定義のみ存在し、ハンドラは
5
+ * 「未実装」エラーを返すスタブ実装になっている。
6
+ */
7
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
8
+ export declare const tools: Tool[];
9
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG/D,eAAO,MAAM,KAAK,EAAE,IAAI,EA2JvB,CAAC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * MCP Tool Definitions — houki-nta-mcp Phase 0 (スタブ)
3
+ *
4
+ * Phase 1 で本実装。現状はツール定義のみ存在し、ハンドラは
5
+ * 「未実装」エラーを返すスタブ実装になっている。
6
+ */
7
+ import { DOMAINS, LIMITS, OUTPUT_FORMATS } from '../constants.js';
8
+ export const tools = [
9
+ {
10
+ name: 'nta_search_tsutatsu',
11
+ description: '国税庁の通達(法令解釈通達・個別通達)をキーワード検索する。Phase 0 ではスタブ。',
12
+ inputSchema: {
13
+ type: 'object',
14
+ properties: {
15
+ keyword: {
16
+ type: 'string',
17
+ description: '検索キーワード。例: "軽減税率", "電子帳簿", "棚卸資産"。略称も可(例: "電帳法")',
18
+ },
19
+ type: {
20
+ type: 'string',
21
+ enum: ['kihon-tsutatsu', 'kobetsu-tsutatsu'],
22
+ description: '通達種別で絞り込み。kihon-tsutatsu=法令解釈通達, kobetsu-tsutatsu=個別通達',
23
+ },
24
+ domain: {
25
+ type: 'string',
26
+ enum: [...DOMAINS],
27
+ description: '分野タグで絞り込み(略称辞書ベース)',
28
+ },
29
+ limit: {
30
+ type: 'number',
31
+ description: `取得件数(デフォルト: ${LIMITS.searchDefault}、最大: ${LIMITS.searchMax})`,
32
+ default: LIMITS.searchDefault,
33
+ },
34
+ },
35
+ required: ['keyword'],
36
+ },
37
+ },
38
+ {
39
+ name: 'nta_get_tsutatsu',
40
+ description: '通達本文を取得する。略称(消基通・所基通・法基通 等)対応。条項指定可能。Phase 0 ではスタブ。',
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ name: {
45
+ type: 'string',
46
+ description: '通達名または略称。例: "消費税法基本通達", "消基通", "所得税基本通達", "所基通"',
47
+ },
48
+ clause: {
49
+ type: 'string',
50
+ description: '通達番号。例: "5-1-9", "11-2-10"(章-項-号 形式)',
51
+ },
52
+ format: {
53
+ type: 'string',
54
+ enum: [...OUTPUT_FORMATS],
55
+ description: '出力形式',
56
+ default: 'markdown',
57
+ },
58
+ },
59
+ required: ['name'],
60
+ },
61
+ },
62
+ {
63
+ name: 'nta_search_qa',
64
+ description: '国税庁の質疑応答事例をキーワード検索する。Phase 0 ではスタブ。',
65
+ inputSchema: {
66
+ type: 'object',
67
+ properties: {
68
+ keyword: {
69
+ type: 'string',
70
+ description: '検索キーワード。例: "社内会議 軽減税率", "テレワーク 必要経費"',
71
+ },
72
+ domain: {
73
+ type: 'string',
74
+ enum: [...DOMAINS],
75
+ description: '税目で絞り込み',
76
+ },
77
+ limit: {
78
+ type: 'number',
79
+ description: `取得件数(デフォルト: ${LIMITS.searchDefault}、最大: ${LIMITS.searchMax})`,
80
+ default: LIMITS.searchDefault,
81
+ },
82
+ },
83
+ required: ['keyword'],
84
+ },
85
+ },
86
+ {
87
+ name: 'nta_get_qa',
88
+ description: '質疑応答事例の本文を取得する。Phase 0 ではスタブ。',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ identifier: {
93
+ type: 'string',
94
+ description: '事例タイトル or ID',
95
+ },
96
+ format: {
97
+ type: 'string',
98
+ enum: [...OUTPUT_FORMATS],
99
+ description: '出力形式',
100
+ default: 'markdown',
101
+ },
102
+ },
103
+ required: ['identifier'],
104
+ },
105
+ },
106
+ {
107
+ name: 'nta_search_tax_answer',
108
+ description: 'タックスアンサー(一般納税者向け解説)をキーワード検索する。Phase 0 ではスタブ。',
109
+ inputSchema: {
110
+ type: 'object',
111
+ properties: {
112
+ keyword: {
113
+ type: 'string',
114
+ description: '検索キーワード。例: "ふるさと納税", "医療費控除"',
115
+ },
116
+ limit: {
117
+ type: 'number',
118
+ description: `取得件数(デフォルト: ${LIMITS.searchDefault}、最大: ${LIMITS.searchMax})`,
119
+ default: LIMITS.searchDefault,
120
+ },
121
+ },
122
+ required: ['keyword'],
123
+ },
124
+ },
125
+ {
126
+ name: 'nta_get_tax_answer',
127
+ description: 'タックスアンサー本文を取得する。Phase 0 ではスタブ。',
128
+ inputSchema: {
129
+ type: 'object',
130
+ properties: {
131
+ no: {
132
+ type: 'string',
133
+ description: 'タックスアンサー番号。例: "6101", "1100"',
134
+ },
135
+ format: {
136
+ type: 'string',
137
+ enum: [...OUTPUT_FORMATS],
138
+ description: '出力形式',
139
+ default: 'markdown',
140
+ },
141
+ },
142
+ required: ['no'],
143
+ },
144
+ },
145
+ {
146
+ name: 'resolve_abbreviation',
147
+ description: '略称・通称から houki-abbreviations 経由でエントリを解決する。houki-nta-mcp 管轄外(法令系等)の場合は「他 MCP に誘導」のヒントを返す。',
148
+ inputSchema: {
149
+ type: 'object',
150
+ properties: {
151
+ abbr: {
152
+ type: 'string',
153
+ description: '略称。例: "消基通", "所基通", "電帳法"',
154
+ },
155
+ },
156
+ required: ['abbr'],
157
+ },
158
+ },
159
+ ];
160
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * MCP Tool Handlers — houki-nta-mcp Phase 0 (スタブ)
3
+ *
4
+ * Phase 1 で本実装。現状は `resolve_abbreviation` のみ houki-abbreviations 経由で
5
+ * 動作する。それ以外のツールは「未実装」レスポンスを返す。
6
+ */
7
+ import type { SearchTsutatsuArgs, GetTsutatsuArgs, SearchQaArgs, GetQaArgs, SearchTaxAnswerArgs, GetTaxAnswerArgs } from '../types/index.js';
8
+ /**
9
+ * nta_search_tsutatsu — 通達検索(Phase 0 スタブ)
10
+ */
11
+ export declare function handleNtaSearchTsutatsu(_args: SearchTsutatsuArgs): Promise<{
12
+ tool: string;
13
+ error: string;
14
+ status: string;
15
+ see_also: string;
16
+ }>;
17
+ /**
18
+ * nta_get_tsutatsu — 通達取得(Phase 0 スタブ)
19
+ */
20
+ export declare function handleNtaGetTsutatsu(_args: GetTsutatsuArgs): Promise<{
21
+ tool: string;
22
+ error: string;
23
+ status: string;
24
+ see_also: string;
25
+ }>;
26
+ /**
27
+ * nta_search_qa — 質疑応答事例検索(Phase 0 スタブ)
28
+ */
29
+ export declare function handleNtaSearchQa(_args: SearchQaArgs): Promise<{
30
+ tool: string;
31
+ error: string;
32
+ status: string;
33
+ see_also: string;
34
+ }>;
35
+ /**
36
+ * nta_get_qa — 質疑応答事例取得(Phase 0 スタブ)
37
+ */
38
+ export declare function handleNtaGetQa(_args: GetQaArgs): Promise<{
39
+ tool: string;
40
+ error: string;
41
+ status: string;
42
+ see_also: string;
43
+ }>;
44
+ /**
45
+ * nta_search_tax_answer — タックスアンサー検索(Phase 0 スタブ)
46
+ */
47
+ export declare function handleNtaSearchTaxAnswer(_args: SearchTaxAnswerArgs): Promise<{
48
+ tool: string;
49
+ error: string;
50
+ status: string;
51
+ see_also: string;
52
+ }>;
53
+ /**
54
+ * nta_get_tax_answer — タックスアンサー取得(Phase 0 スタブ)
55
+ */
56
+ export declare function handleNtaGetTaxAnswer(_args: GetTaxAnswerArgs): Promise<{
57
+ tool: string;
58
+ error: string;
59
+ status: string;
60
+ see_also: string;
61
+ }>;
62
+ /**
63
+ * resolve_abbreviation — 略称解決(houki-abbreviations 経由)
64
+ *
65
+ * 自分の管轄(source_mcp_hint === 'houki-nta')以外のエントリは、
66
+ * 「正しい MCP に誘導するヒント」と共に返す。
67
+ */
68
+ export declare function handleResolveAbbreviation(args: {
69
+ abbr: string;
70
+ }): Promise<{
71
+ abbr: string;
72
+ resolved: null;
73
+ note: string;
74
+ } | {
75
+ hint?: string | undefined;
76
+ abbr: string;
77
+ resolved: import("@shuji-bonji/houki-abbreviations").AbbreviationEntry;
78
+ in_scope: boolean;
79
+ note?: undefined;
80
+ }>;
81
+ /**
82
+ * Tool handlers map
83
+ */
84
+ export declare const toolHandlers: Record<string, (args: any) => Promise<unknown>>;
85
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAQ3B;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB;;;;;GAEtE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,eAAe;;;;;GAEhE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY;;;;;GAE1D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS;;;;;GAEpD;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB;;;;;GAExE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB;;;;;GAElE;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;GAuBrE;AAED;;GAEG;AAEH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAQxE,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * MCP Tool Handlers — houki-nta-mcp Phase 0 (スタブ)
3
+ *
4
+ * Phase 1 で本実装。現状は `resolve_abbreviation` のみ houki-abbreviations 経由で
5
+ * 動作する。それ以外のツールは「未実装」レスポンスを返す。
6
+ */
7
+ import { resolveAbbreviation } from '@shuji-bonji/houki-abbreviations';
8
+ import { NTA_HINT } from '../constants.js';
9
+ const NOT_IMPLEMENTED = {
10
+ error: 'Phase 0 では未実装。Phase 1 で本実装予定。',
11
+ status: 'not_implemented',
12
+ see_also: 'https://github.com/shuji-bonji/houki-nta-mcp',
13
+ };
14
+ /**
15
+ * nta_search_tsutatsu — 通達検索(Phase 0 スタブ)
16
+ */
17
+ export async function handleNtaSearchTsutatsu(_args) {
18
+ return { ...NOT_IMPLEMENTED, tool: 'nta_search_tsutatsu' };
19
+ }
20
+ /**
21
+ * nta_get_tsutatsu — 通達取得(Phase 0 スタブ)
22
+ */
23
+ export async function handleNtaGetTsutatsu(_args) {
24
+ return { ...NOT_IMPLEMENTED, tool: 'nta_get_tsutatsu' };
25
+ }
26
+ /**
27
+ * nta_search_qa — 質疑応答事例検索(Phase 0 スタブ)
28
+ */
29
+ export async function handleNtaSearchQa(_args) {
30
+ return { ...NOT_IMPLEMENTED, tool: 'nta_search_qa' };
31
+ }
32
+ /**
33
+ * nta_get_qa — 質疑応答事例取得(Phase 0 スタブ)
34
+ */
35
+ export async function handleNtaGetQa(_args) {
36
+ return { ...NOT_IMPLEMENTED, tool: 'nta_get_qa' };
37
+ }
38
+ /**
39
+ * nta_search_tax_answer — タックスアンサー検索(Phase 0 スタブ)
40
+ */
41
+ export async function handleNtaSearchTaxAnswer(_args) {
42
+ return { ...NOT_IMPLEMENTED, tool: 'nta_search_tax_answer' };
43
+ }
44
+ /**
45
+ * nta_get_tax_answer — タックスアンサー取得(Phase 0 スタブ)
46
+ */
47
+ export async function handleNtaGetTaxAnswer(_args) {
48
+ return { ...NOT_IMPLEMENTED, tool: 'nta_get_tax_answer' };
49
+ }
50
+ /**
51
+ * resolve_abbreviation — 略称解決(houki-abbreviations 経由)
52
+ *
53
+ * 自分の管轄(source_mcp_hint === 'houki-nta')以外のエントリは、
54
+ * 「正しい MCP に誘導するヒント」と共に返す。
55
+ */
56
+ export async function handleResolveAbbreviation(args) {
57
+ const result = resolveAbbreviation(args.abbr);
58
+ if (!result) {
59
+ return {
60
+ abbr: args.abbr,
61
+ resolved: null,
62
+ note: '辞書に該当なし。フル法令名でお試しください',
63
+ };
64
+ }
65
+ // 自分の管轄か判定
66
+ const isInScope = result.source_mcp_hint === NTA_HINT;
67
+ return {
68
+ abbr: args.abbr,
69
+ resolved: result,
70
+ in_scope: isInScope,
71
+ ...(isInScope
72
+ ? {}
73
+ : {
74
+ hint: `このエントリは ${result.source_mcp_hint} の管轄です。${result.source_mcp_hint}-mcp で取得してください。`,
75
+ }),
76
+ };
77
+ }
78
+ /**
79
+ * Tool handlers map
80
+ */
81
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
+ export const toolHandlers = {
83
+ nta_search_tsutatsu: handleNtaSearchTsutatsu,
84
+ nta_get_tsutatsu: handleNtaGetTsutatsu,
85
+ nta_search_qa: handleNtaSearchQa,
86
+ nta_get_qa: handleNtaGetQa,
87
+ nta_search_tax_answer: handleNtaSearchTaxAnswer,
88
+ nta_get_tax_answer: handleNtaGetTaxAnswer,
89
+ resolve_abbreviation: handleResolveAbbreviation,
90
+ };
91
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAU3C,MAAM,eAAe,GAAG;IACtB,KAAK,EAAE,+BAA+B;IACtC,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,8CAA8C;CACzD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAyB;IACrE,OAAO,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAsB;IAC/D,OAAO,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAmB;IACzD,OAAO,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAgB;IACnD,OAAO,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAA0B;IACvE,OAAO,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAuB;IACjE,OAAO,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAsB;IACpE,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,uBAAuB;SAC9B,CAAC;IACJ,CAAC;IAED,WAAW;IACX,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,KAAK,QAAQ,CAAC;IACtD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,SAAS;QACnB,GAAG,CAAC,SAAS;YACX,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,IAAI,EAAE,WAAW,MAAM,CAAC,eAAe,UAAU,MAAM,CAAC,eAAe,iBAAiB;aACzF,CAAC;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAoD;IAC3E,mBAAmB,EAAE,uBAAuB;IAC5C,gBAAgB,EAAE,oBAAoB;IACtC,aAAa,EAAE,iBAAiB;IAChC,UAAU,EAAE,cAAc;IAC1B,qBAAqB,EAAE,wBAAwB;IAC/C,kBAAkB,EAAE,qBAAqB;IACzC,oBAAoB,EAAE,yBAAyB;CAChD,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared Types — houki-nta-mcp
3
+ *
4
+ * AbbreviationEntry は @shuji-bonji/houki-abbreviations から re-export。
5
+ */
6
+ import type { Domain, OutputFormat, NtaCategory } from '../constants.js';
7
+ export type { AbbreviationEntry } from '@shuji-bonji/houki-abbreviations';
8
+ /** 通達検索引数 */
9
+ export interface SearchTsutatsuArgs {
10
+ /** 検索キーワード */
11
+ keyword: string;
12
+ /** 通達種別で絞り込み */
13
+ type?: Extract<NtaCategory, 'kihon-tsutatsu' | 'kobetsu-tsutatsu'>;
14
+ /** 分野タグで絞り込み */
15
+ domain?: Domain;
16
+ /** 取得件数 */
17
+ limit?: number;
18
+ }
19
+ /** 通達取得引数 */
20
+ export interface GetTsutatsuArgs {
21
+ /** 通達名または略称。例: "消基通", "所基通" */
22
+ name: string;
23
+ /** 通達番号。例: "5-1-9", "11-2-10"(章-項-号 形式) */
24
+ clause?: string;
25
+ /** 出力形式 */
26
+ format?: OutputFormat;
27
+ }
28
+ /** 質疑応答事例検索引数 */
29
+ export interface SearchQaArgs {
30
+ /** 検索キーワード */
31
+ keyword: string;
32
+ /** 税目で絞り込み */
33
+ domain?: Domain;
34
+ /** 取得件数 */
35
+ limit?: number;
36
+ }
37
+ /** 質疑応答事例取得引数 */
38
+ export interface GetQaArgs {
39
+ /** タイトル or ID */
40
+ identifier: string;
41
+ /** 出力形式 */
42
+ format?: OutputFormat;
43
+ }
44
+ /** タックスアンサー取得引数 */
45
+ export interface GetTaxAnswerArgs {
46
+ /** タックスアンサー番号。例: "6101" */
47
+ no: string;
48
+ /** 出力形式 */
49
+ format?: OutputFormat;
50
+ }
51
+ /** タックスアンサー検索引数 */
52
+ export interface SearchTaxAnswerArgs {
53
+ /** 検索キーワード */
54
+ keyword: string;
55
+ /** 取得件数 */
56
+ limit?: number;
57
+ }
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGzE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,aAAa;AACb,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;IACnE,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,aAAa;AACb,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,iBAAiB;AACjB,MAAM,WAAW,YAAY;IAC3B,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,iBAAiB;AACjB,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,mBAAmB;AACnB,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,mBAAmB;AACnB,MAAM,WAAW,mBAAmB;IAClC,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared Types — houki-nta-mcp
3
+ *
4
+ * AbbreviationEntry は @shuji-bonji/houki-abbreviations から re-export。
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Logger
3
+ *
4
+ * MCP は stdio プロトコルなので `console.log` 禁止。
5
+ * `console.error` または `process.stderr` 経由でしかログを出せない。
6
+ *
7
+ * 構造化ログ(JSON)を stderr に流す形にしておくと、CI / 監視で扱いやすい。
8
+ */
9
+ export declare const logger: {
10
+ readonly debug: (scope: string, msg: string, meta?: Record<string, any>) => void;
11
+ readonly info: (scope: string, msg: string, meta?: Record<string, any>) => void;
12
+ readonly warn: (scope: string, msg: string, meta?: Record<string, any>) => void;
13
+ readonly error: (scope: string, msg: string, err?: Error) => void;
14
+ };
15
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA+BH,eAAO,MAAM,MAAM;4BAXF,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;2BAA/C,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;2BAA/C,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;4BAe/C,MAAM,OAAO,MAAM,QAAQ,KAAK;CAevC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Logger
3
+ *
4
+ * MCP は stdio プロトコルなので `console.log` 禁止。
5
+ * `console.error` または `process.stderr` 経由でしかログを出せない。
6
+ *
7
+ * 構造化ログ(JSON)を stderr に流す形にしておくと、CI / 監視で扱いやすい。
8
+ */
9
+ function emit(payload) {
10
+ // stderr に書く(stdio MCP プロトコルを汚染しない)
11
+ process.stderr.write(JSON.stringify(payload) + '\n');
12
+ }
13
+ function makeLogger(level) {
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ return (scope, msg, meta) => {
16
+ emit({
17
+ ts: new Date().toISOString(),
18
+ level,
19
+ scope,
20
+ msg,
21
+ ...(meta ? { meta } : {}),
22
+ });
23
+ };
24
+ }
25
+ export const logger = {
26
+ debug: makeLogger('debug'),
27
+ info: makeLogger('info'),
28
+ warn: makeLogger('warn'),
29
+ error: (scope, msg, err) => {
30
+ emit({
31
+ ts: new Date().toISOString(),
32
+ level: 'error',
33
+ scope,
34
+ msg,
35
+ ...(err
36
+ ? {
37
+ meta: {
38
+ error: { name: err.name, message: err.message, stack: err.stack },
39
+ },
40
+ }
41
+ : {}),
42
+ });
43
+ },
44
+ };
45
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,SAAS,IAAI,CAAC,OAAmB;IAC/B,oCAAoC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,8DAA8D;IAC9D,OAAO,CAAC,KAAa,EAAE,GAAW,EAAE,IAA0B,EAAE,EAAE;QAChE,IAAI,CAAC;YACH,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,KAAK;YACL,KAAK;YACL,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;IAC1B,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;IACxB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;IACxB,KAAK,EAAE,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,KAAK,EAAE,OAAO;YACd,KAAK;YACL,GAAG;YACH,GAAG,CAAC,GAAG;gBACL,CAAC,CAAC;oBACE,IAAI,EAAE;wBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;qBAClE;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;IACL,CAAC;CACO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@shuji-bonji/houki-nta-mcp",
3
+ "version": "0.0.1",
4
+ "description": "MCP server for Japanese National Tax Agency (NTA) tsutatsu, Q&A, and tax answer. Part of the houki-hub MCP family.",
5
+ "keywords": [
6
+ "mcp",
7
+ "japan",
8
+ "nta",
9
+ "houki",
10
+ "tax",
11
+ "tsutatsu",
12
+ "qa-jirei",
13
+ "tax-answer"
14
+ ],
15
+ "author": "shuji-bonji",
16
+ "license": "MIT",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/shuji-bonji/houki-nta-mcp.git"
20
+ },
21
+ "type": "module",
22
+ "main": "dist/index.js",
23
+ "types": "dist/index.d.ts",
24
+ "bin": {
25
+ "houki-nta-mcp": "dist/index.js"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "dev": "tsc --watch",
36
+ "start": "node dist/index.js",
37
+ "test": "vitest --run",
38
+ "test:watch": "vitest",
39
+ "test:coverage": "vitest --run --coverage",
40
+ "lint": "eslint src",
41
+ "format": "prettier --write src",
42
+ "format:check": "prettier --check src",
43
+ "prepublishOnly": "npm run build"
44
+ },
45
+ "dependencies": {
46
+ "@modelcontextprotocol/sdk": "^1.29.0",
47
+ "@shuji-bonji/houki-abbreviations": "^0.2.0"
48
+ },
49
+ "devDependencies": {
50
+ "@eslint/js": "^9.39.2",
51
+ "@types/node": "^22.0.0",
52
+ "@vitest/coverage-v8": "^2.1.9",
53
+ "eslint": "^9.0.0",
54
+ "eslint-config-prettier": "^10.1.8",
55
+ "prettier": "^3.8.0",
56
+ "typescript": "^5.7.0",
57
+ "typescript-eslint": "^8.53.0",
58
+ "vitest": "^2.1.0"
59
+ },
60
+ "engines": {
61
+ "node": ">=20.0.0"
62
+ }
63
+ }