@sugukuru/mcp-houjin-bangou 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.
Files changed (151) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/LICENSE +21 -0
  3. package/README.ja.md +196 -0
  4. package/README.md +198 -0
  5. package/dist/api/csv-parser.d.ts +37 -0
  6. package/dist/api/csv-parser.d.ts.map +1 -0
  7. package/dist/api/csv-parser.js +189 -0
  8. package/dist/api/csv-parser.js.map +1 -0
  9. package/dist/api/nta-client.d.ts +71 -0
  10. package/dist/api/nta-client.d.ts.map +1 -0
  11. package/dist/api/nta-client.js +117 -0
  12. package/dist/api/nta-client.js.map +1 -0
  13. package/dist/api/rate-limiter.d.ts +39 -0
  14. package/dist/api/rate-limiter.d.ts.map +1 -0
  15. package/dist/api/rate-limiter.js +74 -0
  16. package/dist/api/rate-limiter.js.map +1 -0
  17. package/dist/completion/handler.d.ts +19 -0
  18. package/dist/completion/handler.d.ts.map +1 -0
  19. package/dist/completion/handler.js +136 -0
  20. package/dist/completion/handler.js.map +1 -0
  21. package/dist/domain/check-digit.d.ts +47 -0
  22. package/dist/domain/check-digit.d.ts.map +1 -0
  23. package/dist/domain/check-digit.js +91 -0
  24. package/dist/domain/check-digit.js.map +1 -0
  25. package/dist/domain/close-cause-codes.d.ts +28 -0
  26. package/dist/domain/close-cause-codes.d.ts.map +1 -0
  27. package/dist/domain/close-cause-codes.js +27 -0
  28. package/dist/domain/close-cause-codes.js.map +1 -0
  29. package/dist/domain/corporate-number.d.ts +81 -0
  30. package/dist/domain/corporate-number.d.ts.map +1 -0
  31. package/dist/domain/corporate-number.js +88 -0
  32. package/dist/domain/corporate-number.js.map +1 -0
  33. package/dist/domain/invoice-codes.d.ts +142 -0
  34. package/dist/domain/invoice-codes.d.ts.map +1 -0
  35. package/dist/domain/invoice-codes.js +106 -0
  36. package/dist/domain/invoice-codes.js.map +1 -0
  37. package/dist/domain/invoice-number.d.ts +47 -0
  38. package/dist/domain/invoice-number.d.ts.map +1 -0
  39. package/dist/domain/invoice-number.js +71 -0
  40. package/dist/domain/invoice-number.js.map +1 -0
  41. package/dist/domain/kind-codes.d.ts +62 -0
  42. package/dist/domain/kind-codes.d.ts.map +1 -0
  43. package/dist/domain/kind-codes.js +68 -0
  44. package/dist/domain/kind-codes.js.map +1 -0
  45. package/dist/domain/normalizer.d.ts +50 -0
  46. package/dist/domain/normalizer.d.ts.map +1 -0
  47. package/dist/domain/normalizer.js +280 -0
  48. package/dist/domain/normalizer.js.map +1 -0
  49. package/dist/domain/prefecture-codes.d.ts +61 -0
  50. package/dist/domain/prefecture-codes.d.ts.map +1 -0
  51. package/dist/domain/prefecture-codes.js +67 -0
  52. package/dist/domain/prefecture-codes.js.map +1 -0
  53. package/dist/domain/process-codes.d.ts +52 -0
  54. package/dist/domain/process-codes.d.ts.map +1 -0
  55. package/dist/domain/process-codes.js +28 -0
  56. package/dist/domain/process-codes.js.map +1 -0
  57. package/dist/lib/env.d.ts +35 -0
  58. package/dist/lib/env.d.ts.map +1 -0
  59. package/dist/lib/env.js +40 -0
  60. package/dist/lib/env.js.map +1 -0
  61. package/dist/lib/errors.d.ts +47 -0
  62. package/dist/lib/errors.d.ts.map +1 -0
  63. package/dist/lib/errors.js +92 -0
  64. package/dist/lib/errors.js.map +1 -0
  65. package/dist/lib/mcp-logger.d.ts +29 -0
  66. package/dist/lib/mcp-logger.d.ts.map +1 -0
  67. package/dist/lib/mcp-logger.js +98 -0
  68. package/dist/lib/mcp-logger.js.map +1 -0
  69. package/dist/lib/pagination.d.ts +28 -0
  70. package/dist/lib/pagination.d.ts.map +1 -0
  71. package/dist/lib/pagination.js +48 -0
  72. package/dist/lib/pagination.js.map +1 -0
  73. package/dist/lib/result.d.ts +29 -0
  74. package/dist/lib/result.d.ts.map +1 -0
  75. package/dist/lib/result.js +36 -0
  76. package/dist/lib/result.js.map +1 -0
  77. package/dist/lib/trace-context.d.ts +36 -0
  78. package/dist/lib/trace-context.d.ts.map +1 -0
  79. package/dist/lib/trace-context.js +77 -0
  80. package/dist/lib/trace-context.js.map +1 -0
  81. package/dist/mcp.d.ts +9 -0
  82. package/dist/mcp.d.ts.map +1 -0
  83. package/dist/mcp.js +54 -0
  84. package/dist/mcp.js.map +1 -0
  85. package/dist/prompts/business-card-to-database.d.ts +12 -0
  86. package/dist/prompts/business-card-to-database.d.ts.map +1 -0
  87. package/dist/prompts/business-card-to-database.js +80 -0
  88. package/dist/prompts/business-card-to-database.js.map +1 -0
  89. package/dist/prompts/customer-master-dedup.d.ts +9 -0
  90. package/dist/prompts/customer-master-dedup.d.ts.map +1 -0
  91. package/dist/prompts/customer-master-dedup.js +77 -0
  92. package/dist/prompts/customer-master-dedup.js.map +1 -0
  93. package/dist/prompts/index.d.ts +3 -0
  94. package/dist/prompts/index.d.ts.map +1 -0
  95. package/dist/prompts/index.js +9 -0
  96. package/dist/prompts/index.js.map +1 -0
  97. package/dist/prompts/sales-list-enrichment.d.ts +9 -0
  98. package/dist/prompts/sales-list-enrichment.d.ts.map +1 -0
  99. package/dist/prompts/sales-list-enrichment.js +84 -0
  100. package/dist/prompts/sales-list-enrichment.js.map +1 -0
  101. package/dist/resources/attribution.d.ts +9 -0
  102. package/dist/resources/attribution.d.ts.map +1 -0
  103. package/dist/resources/attribution.js +27 -0
  104. package/dist/resources/attribution.js.map +1 -0
  105. package/dist/resources/corporate-template.d.ts +14 -0
  106. package/dist/resources/corporate-template.d.ts.map +1 -0
  107. package/dist/resources/corporate-template.js +87 -0
  108. package/dist/resources/corporate-template.js.map +1 -0
  109. package/dist/resources/index.d.ts +8 -0
  110. package/dist/resources/index.d.ts.map +1 -0
  111. package/dist/resources/index.js +9 -0
  112. package/dist/resources/index.js.map +1 -0
  113. package/dist/resources/ui-resources.d.ts +9 -0
  114. package/dist/resources/ui-resources.d.ts.map +1 -0
  115. package/dist/resources/ui-resources.js +59 -0
  116. package/dist/resources/ui-resources.js.map +1 -0
  117. package/dist/server.d.ts +13 -0
  118. package/dist/server.d.ts.map +1 -0
  119. package/dist/server.js +217 -0
  120. package/dist/server.js.map +1 -0
  121. package/dist/tools/get-attribution.d.ts +25 -0
  122. package/dist/tools/get-attribution.d.ts.map +1 -0
  123. package/dist/tools/get-attribution.js +120 -0
  124. package/dist/tools/get-attribution.js.map +1 -0
  125. package/dist/tools/index.d.ts +12 -0
  126. package/dist/tools/index.d.ts.map +1 -0
  127. package/dist/tools/index.js +16 -0
  128. package/dist/tools/index.js.map +1 -0
  129. package/dist/tools/lookup-by-number.d.ts +82 -0
  130. package/dist/tools/lookup-by-number.d.ts.map +1 -0
  131. package/dist/tools/lookup-by-number.js +157 -0
  132. package/dist/tools/lookup-by-number.js.map +1 -0
  133. package/dist/tools/normalize-company-name.d.ts +60 -0
  134. package/dist/tools/normalize-company-name.d.ts.map +1 -0
  135. package/dist/tools/normalize-company-name.js +130 -0
  136. package/dist/tools/normalize-company-name.js.map +1 -0
  137. package/dist/tools/search-by-name.d.ts +96 -0
  138. package/dist/tools/search-by-name.d.ts.map +1 -0
  139. package/dist/tools/search-by-name.js +176 -0
  140. package/dist/tools/search-by-name.js.map +1 -0
  141. package/dist/tools/validate-check-digit.d.ts +35 -0
  142. package/dist/tools/validate-check-digit.d.ts.map +1 -0
  143. package/dist/tools/validate-check-digit.js +105 -0
  144. package/dist/tools/validate-check-digit.js.map +1 -0
  145. package/dist/ui/corporate-card/mcp-app.html +157 -0
  146. package/dist/ui/search-results/mcp-app.html +158 -0
  147. package/dist/version.d.ts +6 -0
  148. package/dist/version.d.ts.map +1 -0
  149. package/dist/version.js +6 -0
  150. package/dist/version.js.map +1 -0
  151. package/package.json +96 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,86 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ 本プロジェクトの変更履歴。`Keep a Changelog` 形式、`Semantic Versioning` 準拠。
5
+
6
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
+
9
+ ## [Unreleased]
10
+
11
+ ## [0.2.0] - 2026-05-10
12
+
13
+ ### Added (v0.1.1 quality hardening)
14
+
15
+ - `fast-check` property-based tests
16
+ - `tests/unit/check-digit.property.test.ts`: 5 properties, 4000 generated cases
17
+ - `tests/unit/invoice-number.property.test.ts`: 4 properties, 2500 generated cases
18
+ - `tests/unit/normalizer.property.test.ts`: 5 properties, 5000 generated cases
19
+ - `tinybench` benchmark suite (`pnpm bench`)
20
+ - check digit validation
21
+ - invoice number normalization
22
+ - company name normalization
23
+ - NTA CSV parser
24
+ - v0.2.0 UI Resources preparation
25
+ - `src/ui/corporate-card/`
26
+ - `src/ui/search-results/`
27
+ - Vite single-file build (`pnpm build:ui`)
28
+ - CSP hash injection (`pnpm build:csp`)
29
+ - `ui://corporate-card/mcp-app.html` and `ui://search-results/mcp-app.html` registered as resources
30
+ - `lookup_corporate_by_number` and `search_corporate_by_name` expose `_meta.ui.resourceUri`
31
+ - Release readiness audit fixes
32
+ - Server Card and runtime `initialize` capability alignment (`listChanged=true`)
33
+ - npm Trusted Publishing / GitHub OIDC (removed `NPM_TOKEN` dependency)
34
+ - CycloneDX SBOM workflow
35
+
36
+ ### Verified
37
+
38
+ - 2026-05-10: NTA live smoke passed with approved application ID
39
+ - local validation: `7000012050002` OK
40
+ - `/4/num`: count=1, first=`7000012050002 国税庁`
41
+ - `/4/name`: count=2, divide=1/1
42
+ - result: `NTA live smoke: OK`
43
+
44
+ ### Added (v0.3.0 準備層)
45
+
46
+ - `src/domain/invoice-number.ts`: T番号 (T+13桁) Branded type + 正規化検証 (全角/半角/ハイフン/小文字T 対応)
47
+ - `src/domain/invoice-codes.ts`: 事業者処理区分 (01/02/03/04/99) + 人格区分 (1/2) + 国内外区分 (1/2/3) + 応答形式 (01/11/21) の辞書
48
+ - `tests/unit/invoice-number.test.ts`: 18 ケース
49
+ - `docs/adr/0012-invoice-api-integration.md`: 適格請求書発行事業者 Web-API 統合計画 (Ver.1.0 仕様差異マトリクス含む)
50
+ - `docs/deployment/nta-application-response.md`: 国税庁 アプリケーションID 発行申請の返信ガイド (Option A/B)
51
+ - `docs/deployment/excel-application-fields.md`: Excel 申請書の完全な埋め込み案
52
+ - `docs/deployment/email-template-option-a.md`: メール返信テンプレート (Option A)
53
+
54
+ ## [0.1.0] - 2026-05-22
55
+
56
+ ### Added
57
+
58
+ - **MCP 公式 7 機能すべて活性化** (Tools / Prompts / Resources / Resource Templates / Completion / Logging / Pagination)
59
+ - 5 MCP Tools
60
+ - `lookup_corporate_by_number` (T1): 13桁の法人番号で検索 (国税庁 `/4/num` API、最大10件)
61
+ - `search_corporate_by_name` (T2): 法人名で検索 (国税庁 `/4/name` API、ページング対応)
62
+ - `validate_corporate_number` (T3): チェックデジット検証 (ローカル計算、API 不要)
63
+ - `get_attribution` (T6): 政府標準出典文(公共データ利用規約 第1.0版 + Web-API 機能利用規約 別添1 第6条)
64
+ - `normalize_company_name` (T7): 国税庁 `target=1` 未対応の7パターン表記揺れ補完
65
+ - 3 MCP Prompts (v0.2.0 予定から前倒し、ADR-0011)
66
+ - `business-card-to-database`: 名刺OCR → 正規化 → NTA照会 → CRM レコード
67
+ - `sales-list-enrichment`: 営業リスト一括 enrichment
68
+ - `customer-master-dedup`: 顧客マスタ重複検知・名寄せ
69
+ - MCP Resources + Resource Templates (`corp://{corporate_number}`, `attribution://houjin-bangou`)
70
+ - MCP Completion (`completion/complete` で会社名の auto-complete、T7 駆動 + Prompt 引数の enum 補完)
71
+ - MCP Logging (`notifications/message`、RFC 5424 severity、機密情報自動 redact)
72
+ - MCP Pagination (opaque cursor、国税庁 `divide`/`divideSize` との変換)
73
+ - Server Card at `/.well-known/mcp.json` (SEP-2127 Draft 先行実装)
74
+ - Streamable HTTP transport (stateless mode)
75
+ - Zod strict schema + `attribution` 必須化 + "When NOT to use" description
76
+ - プロンプトインジェクション防御層 (Rug Pull / Tool Shadowing / Tool Poisoning、6 層)
77
+ - OpenTelemetry W3C TraceContext 対応 (SEP-414 準備層)
78
+ - Application ID redaction + rate limiter (1 RPS + exponential backoff 30s→1m→5m→30m)
79
+ - GitHub Actions: ci / release / codeql / dependency-review / api-health-check (週次 keepalive)
80
+ - 旧字体→新字体 辞書 45+ パターン (髙/齋/﨑/邉/澤/國/團/寳/應/靑/權/氣/專/單/學/樂/...)
81
+ - 3 Prompts 用の動作テストと Completion 補完テスト
82
+
83
+ ### Attribution / 出典
84
+
85
+ - 国税庁 法人番号 Web-API 機能 Ver.4.0 (政府標準利用規約 = 公共データ利用規約 第1.0版)
86
+ - 国税庁法人番号公表サイト (https://www.houjin-bangou.nta.go.jp/)
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sugukuru K.K. (スグクル株式会社)
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.ja.md ADDED
@@ -0,0 +1,196 @@
1
+ # @sugukuru/mcp-houjin-bangou
2
+
3
+ > **国税庁 法人番号 Web-API を MCP (Model Context Protocol) 経由で使える公式推奨準拠・セキュアなサーバー。**
4
+ > MCP 公式 7 機能すべて活性化 + 名刺OCR等の実務データで使える表記揺れ正規化。
5
+
6
+ [![npm version](https://img.shields.io/npm/v/@sugukuru/mcp-houjin-bangou.svg)](https://www.npmjs.com/package/@sugukuru/mcp-houjin-bangou)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
8
+
9
+ 🌐 English README: [README.md](README.md)
10
+
11
+ ## これは何か
12
+
13
+ Claude Desktop / Cursor / VS Code Copilot 等の MCP ホストから、以下が可能になります:
14
+
15
+ 1. **法人番号 (13桁) で検索** — 最大10件カンマ区切り対応
16
+ 2. **法人名で検索** — 国税庁内蔵の `target=1` あいまい検索 (ひらがな↔カタカナ・英大小・中点削除) を自動活用
17
+ 3. **表記揺れを正規化** — 国税庁の `target=1` が拾えない 7 パターンを補完
18
+ 4. **チェックデジット検証** — ローカル計算、API 呼出なし
19
+ 5. **出典文取得** — 国税庁 Web-API 利用規約別添1 第6条 + 公共データ利用規約 第1.0版 準拠
20
+
21
+ 5 つの Tool すべてが **Resources / Resource Templates / Completion / Logging / Pagination / Server Card** と統合されています。薄い API ラッパーではなく、MCP 公式 primitive に沿った実装として組んでいます。
22
+
23
+ ## クイックスタート
24
+
25
+ ### 1. 国税庁アプリケーション ID を取得
26
+
27
+ https://www.invoice-kohyo.nta.go.jp/web-api/pre-reg/ から無料で発行されます (メール経由)。
28
+
29
+ **重要**: 同じ ID で **適格請求書発行事業者公表システム Web-API** も利用可能です (v0.3.0 でサポート予定)。
30
+
31
+ ### 2. Claude Desktop に追加
32
+
33
+ `~/Library/Application Support/Claude/claude_desktop_config.json`:
34
+
35
+ ```json
36
+ {
37
+ "mcpServers": {
38
+ "houjin-bangou": {
39
+ "command": "npx",
40
+ "args": ["-y", "@sugukuru/mcp-houjin-bangou"],
41
+ "env": {
42
+ "NTA_APPLICATION_ID": "あなたのID"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ ### 3. Claude Desktop を再起動して試す
50
+
51
+ 本番 ID が届いたら、まずローカルで live smoke を実行してください。
52
+
53
+ ```bash
54
+ NTA_APPLICATION_ID=あなたのID pnpm smoke:live
55
+ ```
56
+
57
+ ID はログに出力されません。`/4/num` と `/4/name` の両方を確認します。
58
+ live smoke では、仕様書サンプル番号ではなく、本番 API で実在する法人番号 `7000012050002` を使います。
59
+
60
+ > 株式会社スグクルの法人番号 5111101000006 の本店所在地と登記日を教えて
61
+
62
+ > 「(株)高橋商事」の表記揺れを正規化して、国税庁で全候補を検索して
63
+
64
+ ## Tools 一覧
65
+
66
+ | Tool | 用途 | API | メモ |
67
+ |---|---|---|---|
68
+ | `lookup_corporate_by_number` | 法人番号で検索 | NTA `/4/num` | 最大10件カンマ区切り (仕様準拠) |
69
+ | `search_corporate_by_name` | 法人名で検索 | NTA `/4/name` | ページング・都道府県・法人種別フィルタ |
70
+ | `validate_corporate_number` | チェックデジット検証 | — | ローカル計算、API 呼出なし |
71
+ | `normalize_company_name` | 表記揺れ正規化 | — | 国税庁 `target=1` が拾えない 7 パターン補完 |
72
+ | `get_attribution` | 出典文取得 | — | 利用規約 別添1 第6条 + 公共データ利用規約 第1.0版 |
73
+
74
+ ## 設計姿勢
75
+
76
+ ### MCP 公式 7 機能すべてを活性化
77
+
78
+ 本プロジェクトは MCP 公式 7 機能を使います:
79
+
80
+ - **Tools** × 5
81
+ - **Prompts** × 3 (`business-card-to-database` / `sales-list-enrichment` / `customer-master-dedup`) — 名刺OCRから CRM 登録、営業リスト一括 enrichment、顧客マスタ重複検知の実務ワークフローをテンプレート化
82
+ - **Resources** (`attribution://houjin-bangou`)
83
+ - **UI Resources** (`ui://corporate-card/mcp-app.html`, `ui://search-results/mcp-app.html`) — v0.2.0 の表示層準備
84
+ - **Resource Templates** (`corp://{corporate_number}` — 法人番号を URI として法人情報取得)
85
+ - **Completion** — `株式会社スグク…` まで打った瞬間に T7 normalizer が候補を返す IDE 補完UX、Prompt 引数の enum 補完も対応
86
+ - **Logging** — RFC 5424 severity の構造化ログを `notifications/message` で配信
87
+ - **Pagination** — 2000件超過時の opaque cursor (国税庁 `divide`/`divideSize` と変換)
88
+ - **Server Card** — `/.well-known/mcp.json` で発見可能性 (SEP-2127 Draft + Transport WG Dec 2025)
89
+
90
+ ### 国税庁 `target=1` あいまい検索を尊重
91
+
92
+ 以下の揺れは、**国税庁 API が既に内蔵**している (第二編 §4.6.2):
93
+
94
+ - ひらがな → カタカナ
95
+ - 英小文字 → 英大文字
96
+ - 中点 (・) と全角スペースの削除
97
+
98
+ これらは重複実装しません。代わりに T7 は国税庁が**拾えない** 7 パターンに特化:
99
+
100
+ 1. **(株)/㈱/株式会社/(株)の位置揺れ** — 前株 ↔ 後株 ↔ 省略 の 3 パターン展開
101
+ 2. **法人種別の正規化・分離** — 株式・有限・合同・合名・合資・一般社団・特定非営利活動 等
102
+ 3. **英語法人名 → 日本語候補** — K.K. / Kabushiki Kaisha / Co.,Ltd. / Inc. / LLC 検出
103
+ 4. **半角/全角英数字の正規化** (Unicode NFKC)
104
+ 5. **旧字体 → 新字体** (髙→高・齋→斎・﨑→崎 等)
105
+ 6. **異体字セレクタ (IVS) 除去**
106
+ 7. **空白類の揃え** (タブ・連続スペース・全角/半角)
107
+
108
+ ### セキュリティ First
109
+
110
+ - **Read-only のみ** — `destructiveHint: false` 全ツール明示
111
+ - **アプリケーション ID は環境変数のみ** — ツール引数経由で受け取らない (プロンプトインジェクション防御)
112
+ - **ログ redaction** — `id=***`, bearer, PII を自動マスク
113
+ - **Rate limit 1 RPS + 指数バックオフ** — 別添1 第9条第1項三号 (短時間大量アクセス禁止) 遵守
114
+ - **プロンプトインジェクション防御 6 層** — 詳細は [`docs/security/prompt-injection-defense.md`](docs/security/prompt-injection-defense.md)
115
+ - **Supply chain**: `pnpm-lock.yaml` コミット / Dependabot weekly / CodeQL / `pnpm publish --provenance`
116
+
117
+ ### 仕様書に準拠、引用可能
118
+
119
+ - すべての設計決定に国税庁仕様書 (第一編・第二編・第六編) の節番号で根拠を明示
120
+ - MCP 公式仕様 (2025-11-25) + SEP を引用
121
+ - `docs/adr/0001-0010.md` が Michael Nygard 形式で主要決定を記録
122
+
123
+ ## ロードマップ
124
+
125
+ | バージョン | 予定 | 目玉 |
126
+ |---|---|---|
127
+ | **v0.2.0** | 2026-05 | 5 Tool + MCP 7 機能 + Server Card |
128
+ | v0.2.0 | 2026-06 | MCP **Prompts** (名刺→DB / 営業リストenrichment / 顧客マスタ重複) + UI Resources |
129
+ | v0.3.0 | 2026-07 | **適格請求書発行事業者 API 統合** (T番号対応、`/num` `/diff` `/valid` 3エンドポイント、CSV/XML/**JSON** 対応) — 同じ ID で利用可、v0.2.0 で T番号 Branded type + 正規化は準備済 (ADR-0012) |
130
+ | v0.5.0 | 2026-09 | Hosted 版 + **Enterprise-Managed Authorization** (SEP-990) + **OAuth Client Credentials** + **Tasks** primitive (SEP-1699) |
131
+ | v1.0.0 | 2026-10 | 6-host verification + Anthropic Directory submission + Skills 移行検討 |
132
+
133
+ ## ユースケース: 名刺OCR → CRM 自動登録 (v0.2.0 目玉)
134
+
135
+ ```
136
+ ステップ 1: ユーザーが名刺 OCR テキストを Claude に貼り付け
137
+ ステップ 2: Prompt `business-card-to-database` が以下を実行:
138
+ normalize_company_name(raw_text)
139
+ → search_corporate_by_name(candidates[0])
140
+ → 正確な法人番号・本店住所・法人種別を取得
141
+ ステップ 3: LLM が出典付きで CRM レコードを生成
142
+ ステップ 4: ユーザーがレビュー & DB 投入 (Human-in-the-Loop)
143
+ ```
144
+
145
+ エンタープライズ向けの Document AI 連携・セキュア DB 書込フロー構築は OSS のスコープ外で、スグクル株式会社のプロフェッショナルサービスで対応します。詳細: https://sugukuru.co.jp
146
+
147
+ ## ドキュメント
148
+
149
+ - [ADR (設計決定記録)](docs/adr/)
150
+ - [プロンプトインジェクション防御](docs/security/prompt-injection-defense.md)
151
+ - [プライバシーポリシー](docs/policy/privacy-policy.md)
152
+ - [利用規約](docs/policy/terms-of-service.md)
153
+ - [セキュリティ](SECURITY.md)
154
+ - [コントリビュートガイド](CONTRIBUTING.md)
155
+ - [行動規範](CODE_OF_CONDUCT.md)
156
+
157
+ ## 検証
158
+
159
+ 本プロジェクトでは、テストとベンチマークも公開インターフェースの一部として扱います。
160
+
161
+ ```bash
162
+ pnpm typecheck
163
+ pnpm test
164
+ pnpm bench
165
+ pnpm publish --dry-run --no-git-checks --access public
166
+ ```
167
+
168
+ 現在のローカル検証スナップショット:
169
+
170
+ | Check | Result |
171
+ |---|---:|
172
+ | Unit + integration tests | 154 passing |
173
+ | Property-based generated cases | 11,500+ |
174
+ | `computeCheckDigit` | 約 18.8M ops/sec |
175
+ | `isValidCheckDigit` | 約 10.1M ops/sec |
176
+ | `normalizeCompanyName` | 約 344k ops/sec |
177
+ | `parseNtaCsv` | 約 389k ops/sec |
178
+ | npm dry-run tarball | 250.6 kB / 151 files |
179
+
180
+ ## 出典
181
+
182
+ 本プロジェクトは **国税庁法人番号システム Web-API 機能** を利用しています。
183
+
184
+ > **このサービスは、国税庁法人番号システム Web-API 機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない。**
185
+
186
+ 出典: **国税庁法人番号公表サイト** (https://www.houjin-bangou.nta.go.jp/)
187
+ ライセンス: **公共データ利用規約 第1.0版**
188
+ API バージョン: **Ver.4.0**
189
+
190
+ ## ライセンス
191
+
192
+ MIT © 2026 スグクル株式会社 (鹿児島)
193
+
194
+ ## About スグクル
195
+
196
+ スグクル株式会社は鹿児島のインドネシア人材特定技能 1 号派遣会社です。人事労務・ビザ申請・農業コンプライアンスの AI 化を進めています。本プロジェクトは **Sugukuru OSS Lab** シリーズの 1 本目です。今後 `mcp-jp-subsidy-hub` (補助金統合 MCP)、`mcp-immigration-ja` (入管手続 MCP) 等をリリース予定。
package/README.md ADDED
@@ -0,0 +1,198 @@
1
+ # @sugukuru/mcp-houjin-bangou
2
+
3
+ > **Model Context Protocol server for Japan's National Corporate Number (法人番号) Web-API by the National Tax Agency.**
4
+ > Full activation of all 7 MCP primitives + deterministic company-name normalization for real-world fuzzy data.
5
+
6
+ [![npm version](https://img.shields.io/npm/v/@sugukuru/mcp-houjin-bangou.svg)](https://www.npmjs.com/package/@sugukuru/mcp-houjin-bangou)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
8
+ [![CI](https://github.com/sugukurukabe/mcp-houjin-bangou/actions/workflows/ci.yml/badge.svg)](https://github.com/sugukurukabe/mcp-houjin-bangou/actions/workflows/ci.yml)
9
+ [![MCP Spec 2025-11-25](https://img.shields.io/badge/MCP-2025--11--25-blue)](https://modelcontextprotocol.io/specification/2025-11-25)
10
+
11
+ 🇯🇵 日本語版 README: [README.ja.md](README.ja.md)
12
+
13
+ ## What this is
14
+
15
+ An MCP server that lets Claude Desktop, Cursor, VS Code Copilot, and any MCP-compatible client:
16
+
17
+ 1. **Look up** a Japanese corporation by its 13-digit National Corporate Number (up to 10 at once)
18
+ 2. **Search** by name with NTA's built-in fuzzy matching (hiragana↔katakana, case, dot deletion auto-handled)
19
+ 3. **Normalize** fuzzy company names for the 7 patterns NTA's `target=1` fuzzy search *doesn't* cover
20
+ 4. **Validate** check digits locally without consuming API quota
21
+ 5. **Attribute** — returns the mandatory citation text per NTA ToS Article 6
22
+
23
+ All 5 tools come with **MCP Resources**, **Resource Templates** (`corp://{corporate_number}`), **Completion**, **Logging**, **Pagination**, and a **Server Card** at `/.well-known/mcp.json`. The implementation follows the official MCP primitives rather than treating this as a thin API wrapper.
24
+
25
+ ## Quick start
26
+
27
+ ### Claude Desktop
28
+
29
+ 1. Get a free NTA application ID from https://www.invoice-kohyo.nta.go.jp/web-api/pre-reg/ (same ID works for the 適格請求書発行事業者 API too).
30
+
31
+ 2. Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
32
+
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "houjin-bangou": {
37
+ "command": "npx",
38
+ "args": ["-y", "@sugukuru/mcp-houjin-bangou"],
39
+ "env": {
40
+ "NTA_APPLICATION_ID": "YOUR_ID_HERE"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ 3. Restart Claude Desktop. Try:
48
+
49
+ After receiving the NTA application ID, first run the live smoke check locally:
50
+
51
+ ```bash
52
+ NTA_APPLICATION_ID=your-id pnpm smoke:live
53
+ ```
54
+
55
+ The ID is never printed. The command verifies both `/4/num` and `/4/name`.
56
+ The live smoke uses a known real NTA corporate number (`7000012050002`), not the fictional numbers shown in NTA sample documents.
57
+
58
+ > "株式会社スグクルの法人番号と本店所在地を教えて"
59
+
60
+ ### Cursor / VS Code
61
+
62
+ See [`examples/`](examples/) for host-specific configs.
63
+
64
+ ## Tools
65
+
66
+ | Tool | Purpose | API | Notes |
67
+ |---|---|---|---|
68
+ | `lookup_corporate_by_number` | Look up by 13-digit number | NTA `/4/num` | Up to 10 numbers at once (spec-enforced) |
69
+ | `search_corporate_by_name` | Search by company name | NTA `/4/name` | Pagination, prefecture/kind filters, fuzzy/exact/english modes |
70
+ | `validate_corporate_number` | Check digit validation | — | Local, no API call, no quota cost |
71
+ | `normalize_company_name` | Fuzzy name normalization | — | 7 patterns beyond NTA's `target=1` built-in fuzzy |
72
+ | `get_attribution` | Required citation text | — | Per NTA ToS Article 6 + 公共データ利用規約 v1.0 |
73
+
74
+ ## Design stance
75
+
76
+ ### 1. All 7 MCP primitives activated (not just Tools)
77
+
78
+ The server activates:
79
+
80
+ - **Tools** × 5 (above)
81
+ - **Prompts** × 3 (`business-card-to-database`, `sales-list-enrichment`, `customer-master-dedup`) — pre-built workflow templates for real-world B2B use cases
82
+ - **Resources** (`attribution://houjin-bangou`)
83
+ - **UI Resources** (`ui://corporate-card/mcp-app.html`, `ui://search-results/mcp-app.html`) — v0.2.0 display layer preparation
84
+ - **Resource Templates** (`corp://{corporate_number}` — fetch a corporation as a resource)
85
+ - **Completion** — type `株式会社スグク…` and get suggestions from T7 normalizer in real-time; prompt argument enum completion also supported
86
+ - **Logging** — structured RFC 5424 severity logs via `notifications/message`
87
+ - **Pagination** — opaque cursors for the 2000+ result case (NTA spec mandates `divide`/`divideSize`)
88
+ - **Server Card** — `/.well-known/mcp.json` per SEP-2127 Draft + Transport WG (Dec 2025) direction
89
+
90
+ ### 2. NTA fuzzy search awareness
91
+
92
+ We **read the NTA spec §4.6.2** and found that `target=1` already handles:
93
+
94
+ - hiragana ↔ katakana
95
+ - upper / lower case
96
+ - middle dot (·) / full-width space deletion
97
+
98
+ …so we skip these. Instead, `normalize_company_name` covers the 7 patterns NTA **doesn't**:
99
+
100
+ 1. `(株)` / `㈱` / `株式会社` / `(株)` position swap (前株 ↔ 後株 ↔ 省略)
101
+ 2. Corporate kind classification (株式 / 有限 / 合同 / 合名 / 合資 / 一般社団 / 特定非営利活動)
102
+ 3. English → Japanese corp-name mapping (K.K. / Kabushiki Kaisha / Co.,Ltd. / Inc. / LLC)
103
+ 4. NFKC normalization (half/full-width alphanumeric)
104
+ 5. Old-character → new-character (髙→高, 齋→斎, 﨑→崎, …)
105
+ 6. IVS (Ideographic Variation Selectors) removal
106
+ 7. Whitespace canonicalization
107
+
108
+ ### 3. Security by design
109
+
110
+ - **Read-only** — no write/delete/exec tools, `destructiveHint: false` everywhere
111
+ - **Application ID** from env only (never as a tool argument)
112
+ - **Log redaction** of `id=***`, bearer tokens, PII
113
+ - **Rate limit** 1 RPS + exponential backoff (avoids NTA 403 per ToS Article 9.1.3)
114
+ - **Prompt injection defense** layered across 6 levels — see [`docs/security/prompt-injection-defense.md`](docs/security/prompt-injection-defense.md)
115
+ - **Supply chain**: pnpm-lock committed, Dependabot weekly, CodeQL, `pnpm publish --provenance`
116
+
117
+ ### 4. Spec-compliant at every level
118
+
119
+ - Every design decision cites NTA spec section (第一編・第二編・第六編)
120
+ - Every MCP feature cites its 2025-11-25 spec or SEP
121
+ - `docs/adr/0001-0010.md` records every major decision in Michael Nygard format
122
+
123
+ ## Roadmap
124
+
125
+ | Version | ETA | Highlights |
126
+ |---|---|---|
127
+ | **v0.2.0** | 2026-05 | 5 tools + 7 primitives + Server Card |
128
+ | v0.2.0 | 2026-06 | MCP **Prompts** (business-card → DB / sales-list enrichment / customer-master dedup) + UI Resources |
129
+ | v0.3.0 | 2026-07 | Integration with **Qualified Invoice Issuer** (T番号) API — same application ID, doubles B2B KYC value |
130
+ | v0.5.0 | 2026-09 | Hosted edition + **Enterprise-Managed Authorization** (SEP-990) + **OAuth Client Credentials** + **Tasks** primitive (SEP-1699) for diff ingestion |
131
+ | v1.0.0 | 2026-10 | 6-host verification + Anthropic Directory submission + Skills (SEP-2076/2640) evaluation |
132
+
133
+ ## Use case: business card OCR → CRM
134
+
135
+ Planned for v0.2.0 as the flagship MCP Prompt:
136
+
137
+ ```
138
+ Step 1. User pastes business card OCR text into Claude
139
+ Step 2. Prompt `business-card-to-database` invokes:
140
+ normalize_company_name(raw_text)
141
+ → search_corporate_by_name(candidates[0])
142
+ → Returns verified corporate number + address + kind
143
+ Step 3. LLM synthesizes a CRM record with attribution
144
+ Step 4. User reviews & inserts into their DB (HITL)
145
+ ```
146
+
147
+ Enterprise integration (Document AI + secure DB write) is out of scope for the OSS and handled by Sugukuru's professional services — see [Sugukuru Inc.](https://sugukuru.co.jp).
148
+
149
+ ## Documentation
150
+
151
+ - [Architecture Decision Records](docs/adr/)
152
+ - [Prompt Injection Defense](docs/security/prompt-injection-defense.md)
153
+ - [Privacy Policy](docs/policy/privacy-policy.md)
154
+ - [Terms of Service](docs/policy/terms-of-service.md)
155
+ - [SECURITY](SECURITY.md)
156
+ - [CONTRIBUTING](CONTRIBUTING.md)
157
+ - [CODE OF CONDUCT](CODE_OF_CONDUCT.md)
158
+
159
+ ## Verification
160
+
161
+ This project treats tests and benchmarks as part of the public interface.
162
+
163
+ ```bash
164
+ pnpm typecheck
165
+ pnpm test
166
+ pnpm bench
167
+ pnpm publish --dry-run --no-git-checks --access public
168
+ ```
169
+
170
+ Current local verification snapshot:
171
+
172
+ | Check | Result |
173
+ |---|---:|
174
+ | Unit + integration tests | 154 passing |
175
+ | Property-based generated cases | 11,500+ |
176
+ | `computeCheckDigit` | ~18.8M ops/sec |
177
+ | `isValidCheckDigit` | ~10.1M ops/sec |
178
+ | `normalizeCompanyName` | ~344k ops/sec |
179
+ | `parseNtaCsv` | ~389k ops/sec |
180
+ | npm dry-run tarball | 250.6 kB / 151 files |
181
+
182
+ ## Attribution
183
+
184
+ This project uses the **National Corporate Number System Web-API** provided by the National Tax Agency of Japan.
185
+
186
+ > **このサービスは、国税庁法人番号システム Web-API 機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない。**
187
+
188
+ Source: **国税庁法人番号公表サイト** (https://www.houjin-bangou.nta.go.jp/)
189
+ License: **公共データ利用規約 第1.0版** (Japanese Public Data License v1.0)
190
+ API Version: **Ver.4.0**
191
+
192
+ ## License
193
+
194
+ MIT © 2026 Sugukuru K.K. (鹿児島 / Kagoshima, Japan)
195
+
196
+ ## About Sugukuru
197
+
198
+ Sugukuru Inc. is an Indonesian-specialist human-resource dispatch company in Kagoshima, Japan, sending Specified Skilled Worker (特定技能) staff to farms nationwide. We build AI-enabled backoffice tools for immigration, agriculture, and small-business compliance. This is the first OSS in our **Sugukuru OSS Lab** series. Stay tuned for `mcp-jp-subsidy-hub`, `mcp-immigration-ja`, and more.
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 国税庁 Web-API Ver.4.0 の CSV レスポンスを JSON 化
3
+ * Parse NTA Web-API Ver.4.0 CSV responses into JSON
4
+ *
5
+ * 根拠 / Source:
6
+ * 国税庁仕様書 第二編 別紙1 リソース定義書 (36 項目、CSV 順序は同表に準拠)
7
+ * レスポンス形式: type=02 (CSV/UTF-8/JIS 第一〜第四水準)
8
+ *
9
+ * 1行目: ヘッダー (lastUpdateDate, count, divideNumber, divideSize)
10
+ * 2行目以降: 法人データ (30列 = 項番7〜36)
11
+ *
12
+ * CSVエスケープ:
13
+ * - フィールド値はダブルクォーテーション(")で囲まれる
14
+ * - 値内の " は "" にエスケープ
15
+ */
16
+ import type { Corporation } from '../domain/corporate-number.js';
17
+ export interface NtaResponseHeader {
18
+ lastUpdateDate: string;
19
+ count: number;
20
+ divideNumber: number;
21
+ divideSize: number;
22
+ }
23
+ export interface ParsedNtaResponse {
24
+ header: NtaResponseHeader;
25
+ corporations: Corporation[];
26
+ }
27
+ /**
28
+ * NTA CSV をパースして構造化
29
+ *
30
+ * @param csvText UTF-8 でデコード済みの CSV 本体
31
+ */
32
+ export declare function parseNtaCsv(csvText: string): ParsedNtaResponse;
33
+ /**
34
+ * CSV 1行をフィールド配列に分解 (RFC 4180、ダブルクォート + "" エスケープ対応)
35
+ */
36
+ export declare function parseCsvLine(line: string): string[];
37
+ //# sourceMappingURL=csv-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-parser.d.ts","sourceRoot":"","sources":["../../src/api/csv-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAmC9D;AAQD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAsCnD"}