@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup-by-number.js","sourceRoot":"","sources":["../../src/tools/lookup-by-number.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * T7: normalize_company_name
3
+ * 国税庁 `target=1` が吸収しきれない 7 パターンの表記揺れを補完
4
+ *
5
+ * 根拠 / Source:
6
+ * 国税庁仕様書 第二編 §4.6.2 (target=1 の内蔵あいまい検索の挙動)
7
+ * 本 MCP の核となる差別化軸
8
+ */
9
+ import { z } from 'zod';
10
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
11
+ declare const OutputSchema: z.ZodObject<{
12
+ original: z.ZodString;
13
+ extracted_core_name: z.ZodString;
14
+ normalized_candidates: z.ZodArray<z.ZodObject<{
15
+ name: z.ZodString;
16
+ kind_hint: z.ZodEnum<{
17
+ unknown: "unknown";
18
+ state_agency: "state_agency";
19
+ local_government: "local_government";
20
+ kabushiki_kaisha: "kabushiki_kaisha";
21
+ yugen_kaisha: "yugen_kaisha";
22
+ gomei_kaisha: "gomei_kaisha";
23
+ goshi_kaisha: "goshi_kaisha";
24
+ godo_kaisha: "godo_kaisha";
25
+ ippan_shadan_hojin: "ippan_shadan_hojin";
26
+ ippan_zaidan_hojin: "ippan_zaidan_hojin";
27
+ koueki_shadan_hojin: "koueki_shadan_hojin";
28
+ koueki_zaidan_hojin: "koueki_zaidan_hojin";
29
+ npo_hojin: "npo_hojin";
30
+ other_registered: "other_registered";
31
+ foreign_company: "foreign_company";
32
+ other: "other";
33
+ }>;
34
+ prefix_or_suffix: z.ZodEnum<{
35
+ mae_kabu: "mae_kabu";
36
+ ato_kabu: "ato_kabu";
37
+ none: "none";
38
+ }>;
39
+ suggested_target: z.ZodEnum<{
40
+ 1: "1";
41
+ 2: "2";
42
+ 3: "3";
43
+ }>;
44
+ confidence: z.ZodNumber;
45
+ applied_rules: z.ZodArray<z.ZodString>;
46
+ }, z.core.$strip>>;
47
+ fallback_note: z.ZodOptional<z.ZodString>;
48
+ recommendation: z.ZodString;
49
+ attribution: z.ZodObject<{
50
+ data_source: z.ZodString;
51
+ service_disclaimer: z.ZodString;
52
+ license: z.ZodLiteral<"公共データ利用規約 第1.0版">;
53
+ api_version: z.ZodLiteral<"Ver.4.0">;
54
+ accessed_at: z.ZodString;
55
+ }, z.core.$strip>;
56
+ }, z.core.$strict>;
57
+ export type NormalizeCompanyNameOutput = z.infer<typeof OutputSchema>;
58
+ export declare function registerNormalizeCompanyNameTool(server: McpServer): void;
59
+ export {};
60
+ //# sourceMappingURL=normalize-company-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-company-name.d.ts","sourceRoot":"","sources":["../../src/tools/normalize-company-name.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyCP,CAAC;AAEZ,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AA4BtE,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8CxE"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * T7: normalize_company_name
3
+ * 国税庁 `target=1` が吸収しきれない 7 パターンの表記揺れを補完
4
+ *
5
+ * 根拠 / Source:
6
+ * 国税庁仕様書 第二編 §4.6.2 (target=1 の内蔵あいまい検索の挙動)
7
+ * 本 MCP の核となる差別化軸
8
+ */
9
+ import { z } from 'zod';
10
+ import { AttributionSchema, buildAttribution } from '../domain/corporate-number.js';
11
+ import { normalizeCompanyName } from '../domain/normalizer.js';
12
+ const InputSchema = z
13
+ .object({
14
+ raw_input: z
15
+ .string()
16
+ .min(1)
17
+ .max(500)
18
+ .describe('正規化したい会社名の文字列。名刺OCR結果・手入力・営業リストのセル等、表記揺れを含んでよい。'),
19
+ })
20
+ .strict();
21
+ const OutputSchema = z
22
+ .object({
23
+ original: z.string(),
24
+ extracted_core_name: z.string().describe('法人種別を除いたコア社名'),
25
+ normalized_candidates: z
26
+ .array(z.object({
27
+ name: z.string().describe('国税庁 API に投げる候補文字列'),
28
+ kind_hint: z.enum([
29
+ 'state_agency',
30
+ 'local_government',
31
+ 'kabushiki_kaisha',
32
+ 'yugen_kaisha',
33
+ 'gomei_kaisha',
34
+ 'goshi_kaisha',
35
+ 'godo_kaisha',
36
+ 'ippan_shadan_hojin',
37
+ 'ippan_zaidan_hojin',
38
+ 'koueki_shadan_hojin',
39
+ 'koueki_zaidan_hojin',
40
+ 'npo_hojin',
41
+ 'other_registered',
42
+ 'foreign_company',
43
+ 'other',
44
+ 'unknown',
45
+ ]),
46
+ prefix_or_suffix: z.enum(['mae_kabu', 'ato_kabu', 'none']),
47
+ suggested_target: z
48
+ .enum(['1', '2', '3'])
49
+ .describe('推奨する国税庁 name API の target パラメータ (1=あいまい / 2=完全 / 3=英語)'),
50
+ confidence: z.number().min(0).max(1),
51
+ applied_rules: z.array(z.string()),
52
+ }))
53
+ .max(10),
54
+ fallback_note: z.string().optional(),
55
+ recommendation: z.string().describe('次に呼ぶべき tool とパラメータの推奨'),
56
+ attribution: AttributionSchema,
57
+ })
58
+ .strict();
59
+ const DESCRIPTION = `名刺OCR・手入力・営業リスト等の不完全な会社名から、国税庁 API で検索可能な正規化候補を最大10件生成します。国税庁 API の内蔵あいまい検索 (target=1) が吸収しきれない 7 パターンを補完します:
60
+
61
+ 1. (株)/㈱/株式会社/(株)の表記・位置揺れ (前株・後株・省略の3展開)
62
+ 2. 法人種別の正規化・分離 (株式/有限/合同/合名/合資/一般社団/特定非営利活動 等)
63
+ 3. 英語法人名 → 日本語候補 (K.K. / Kabushiki Kaisha / Co.,Ltd. / Inc. / LLC 検出)
64
+ 4. 半角/全角英数字の正規化 (Unicode NFKC)
65
+ 5. 旧字体 → 新字体 (髙→高・齋→斎・﨑→崎 等、JIS第一・第二水準縮退補助)
66
+ 6. 異体字セレクタ (IVS / VS) の除去
67
+ 7. 空白類の揃え (タブ・連続スペース・全角/半角)
68
+
69
+ USE THIS WHEN:
70
+ - 名刺から抽出した会社名が (株) 表記で、国税庁検索でヒットしない
71
+ - 営業リストの会社名に旧字体・異体字・英語表記が混在
72
+ - OCR 結果の "(株)スグクル" を "株式会社スグクル" と "スグクル株式会社" の両方で検索したい
73
+ - 英語名 "Sugukuru Inc." を日本語検索用と英語検索用 (target=3) の両方の候補にしたい
74
+
75
+ DO NOT USE WHEN:
76
+ - 会社名が既に綺麗に整形されている → search_corporate_by_name を直接使う
77
+ - 13桁の法人番号が分かっている → lookup_corporate_by_number
78
+ - 単に チェックデジット を検証したい → validate_corporate_number
79
+
80
+ この tool の出力 normalized_candidates[i].name を search_corporate_by_name.name に、
81
+ suggested_target を search_corporate_by_name.search_target に渡す想定です。
82
+
83
+ 注意: 国税庁 target=1 は 「ひらがな↔カタカナ」「英大小文字」「中点・全角空白削除」を自動吸収するため、これらの正規化は本 tool ではスキップされます (重複実装しない方針)。`;
84
+ export function registerNormalizeCompanyNameTool(server) {
85
+ server.registerTool('normalize_company_name', {
86
+ title: 'Normalize Japanese company name (complements NTA target=1 fuzzy search)',
87
+ description: DESCRIPTION,
88
+ inputSchema: InputSchema.shape,
89
+ outputSchema: OutputSchema.shape,
90
+ annotations: {
91
+ title: 'Normalize Japanese company name',
92
+ readOnlyHint: true,
93
+ destructiveHint: false,
94
+ idempotentHint: true,
95
+ openWorldHint: false,
96
+ },
97
+ }, async (args) => {
98
+ const input = InputSchema.parse(args);
99
+ const result = normalizeCompanyName(input.raw_input);
100
+ const topCandidate = result.normalized_candidates[0];
101
+ const recommendation = topCandidate !== undefined
102
+ ? `次に search_corporate_by_name を呼び、name="${topCandidate.name}" と search_target="${targetLabel(topCandidate.suggested_target)}" を指定してください。複数候補で試す場合は confidence 順に検索してください。`
103
+ : '正規化候補が生成されませんでした。入力を見直してください。';
104
+ const output = {
105
+ original: result.original,
106
+ extracted_core_name: result.extracted_core_name,
107
+ normalized_candidates: result.normalized_candidates,
108
+ ...(result.fallback_note !== undefined && { fallback_note: result.fallback_note }),
109
+ recommendation,
110
+ attribution: buildAttribution(),
111
+ };
112
+ return {
113
+ content: [
114
+ {
115
+ type: 'text',
116
+ text: JSON.stringify(output, null, 2),
117
+ },
118
+ ],
119
+ structuredContent: output,
120
+ };
121
+ });
122
+ }
123
+ function targetLabel(target) {
124
+ if (target === '1')
125
+ return 'fuzzy';
126
+ if (target === '2')
127
+ return 'exact';
128
+ return 'english';
129
+ }
130
+ //# sourceMappingURL=normalize-company-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-company-name.js","sourceRoot":"","sources":["../../src/tools/normalize-company-name.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CACP,iDAAiD,CAClD;CACJ,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IACxD,qBAAqB,EAAE,CAAC;SACrB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC9C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC;YAChB,cAAc;YACd,kBAAkB;YAClB,kBAAkB;YAClB,cAAc;YACd,cAAc;YACd,cAAc;YACd,aAAa;YACb,oBAAoB;YACpB,oBAAoB;YACpB,qBAAqB;YACrB,qBAAqB;YACrB,WAAW;YACX,kBAAkB;YAClB,iBAAiB;YACjB,OAAO;YACP,SAAS;SACV,CAAC;QACF,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1D,gBAAgB,EAAE,CAAC;aAChB,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aACrB,QAAQ,CACP,wDAAwD,CACzD;QACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACnC,CAAC,CACH;SACA,GAAG,CAAC,EAAE,CAAC;IACV,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC5D,WAAW,EAAE,iBAAiB;CAC/B,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;iGAwB6E,CAAC;AAElG,MAAM,UAAU,gCAAgC,CAAC,MAAiB;IAChE,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,yEAAyE;QAChF,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,WAAW,CAAC,KAAK;QAC9B,YAAY,EAAE,YAAY,CAAC,KAAK;QAChC,WAAW,EAAE;YACX,KAAK,EAAE,iCAAiC;YACxC,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAErD,MAAM,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,cAAc,GAClB,YAAY,KAAK,SAAS;YACxB,CAAC,CAAC,yCAAyC,YAAY,CAAC,IAAI,sBAAsB,WAAW,CAAC,YAAY,CAAC,gBAAgB,CAAC,+CAA+C;YAC3K,CAAC,CAAC,+BAA+B,CAAC;QAEtC,MAAM,MAAM,GAA+B;YACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;YACnD,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;YAClF,cAAc;YACd,WAAW,EAAE,gBAAgB,EAAE;SAChC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;YACD,iBAAiB,EAAE,MAAM;SAC1B,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAuB;IAC1C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IACnC,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * T2: search_corporate_by_name
3
+ * 法人名で国税庁公表サイトから法人情報を検索 (ページング対応)
4
+ *
5
+ * 根拠 / Source: 国税庁仕様書 第六編 §4, 第二編 §4
6
+ * エンドポイント: GET /4/name?id=...&name=<UTF-8 URLenc>&type=02&...
7
+ */
8
+ import { z } from 'zod';
9
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
10
+ import type { NtaClient } from '../api/nta-client.js';
11
+ import type { McpLogger } from '../lib/mcp-logger.js';
12
+ declare const InputSchema: z.ZodObject<{
13
+ name: z.ZodString;
14
+ match_mode: z.ZodDefault<z.ZodEnum<{
15
+ prefix: "prefix";
16
+ partial: "partial";
17
+ }>>;
18
+ search_target: z.ZodDefault<z.ZodEnum<{
19
+ exact: "exact";
20
+ fuzzy: "fuzzy";
21
+ english: "english";
22
+ }>>;
23
+ prefecture: z.ZodOptional<z.ZodString>;
24
+ kind: z.ZodOptional<z.ZodArray<z.ZodEnum<{
25
+ "02": "02";
26
+ "01": "01";
27
+ "03": "03";
28
+ "04": "04";
29
+ }>>>;
30
+ include_history: z.ZodDefault<z.ZodBoolean>;
31
+ include_closed: z.ZodDefault<z.ZodBoolean>;
32
+ cursor: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strict>;
34
+ declare const OutputSchema: z.ZodObject<{
35
+ total: z.ZodNumber;
36
+ page_number: z.ZodNumber;
37
+ page_size: z.ZodNumber;
38
+ corporations: z.ZodArray<z.ZodObject<{
39
+ corporate_number: z.ZodString;
40
+ sequence_number: z.ZodNumber;
41
+ process: z.ZodString;
42
+ correct: z.ZodEnum<{
43
+ 0: "0";
44
+ 1: "1";
45
+ }>;
46
+ update_date: z.ZodString;
47
+ change_date: z.ZodString;
48
+ name: z.ZodString;
49
+ name_image_id: z.ZodString;
50
+ kind: z.ZodString;
51
+ prefecture_name: z.ZodString;
52
+ city_name: z.ZodString;
53
+ street_number: z.ZodString;
54
+ address_image_id: z.ZodString;
55
+ prefecture_code: z.ZodString;
56
+ city_code: z.ZodString;
57
+ post_code: z.ZodString;
58
+ address_outside: z.ZodString;
59
+ address_outside_image_id: z.ZodString;
60
+ close_date: z.ZodString;
61
+ close_cause: z.ZodString;
62
+ successor_corporate_number: z.ZodString;
63
+ change_cause: z.ZodString;
64
+ assignment_date: z.ZodString;
65
+ latest: z.ZodEnum<{
66
+ 0: "0";
67
+ 1: "1";
68
+ }>;
69
+ en_name: z.ZodString;
70
+ en_prefecture_name: z.ZodString;
71
+ en_city_name: z.ZodString;
72
+ en_address_outside: z.ZodString;
73
+ furigana: z.ZodString;
74
+ hihyoji: z.ZodEnum<{
75
+ 0: "0";
76
+ 1: "1";
77
+ }>;
78
+ }, z.core.$strip>>;
79
+ next_cursor: z.ZodNullable<z.ZodString>;
80
+ last_update_date: z.ZodString;
81
+ attribution: z.ZodObject<{
82
+ data_source: z.ZodString;
83
+ service_disclaimer: z.ZodString;
84
+ license: z.ZodLiteral<"公共データ利用規約 第1.0版">;
85
+ api_version: z.ZodLiteral<"Ver.4.0">;
86
+ accessed_at: z.ZodString;
87
+ }, z.core.$strip>;
88
+ }, z.core.$strict>;
89
+ export type SearchByNameInput = z.infer<typeof InputSchema>;
90
+ export type SearchByNameOutput = z.infer<typeof OutputSchema>;
91
+ export declare function registerSearchByNameTool(server: McpServer, deps: {
92
+ ntaClient: NtaClient;
93
+ logger: McpLogger;
94
+ }): void;
95
+ export {};
96
+ //# sourceMappingURL=search-by-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-by-name.d.ts","sourceRoot":"","sources":["../../src/tools/search-by-name.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAStD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;kBA8CN,CAAC;AAEZ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAUP,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAkB9D,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAChD,IAAI,CAyHN"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * T2: search_corporate_by_name
3
+ * 法人名で国税庁公表サイトから法人情報を検索 (ページング対応)
4
+ *
5
+ * 根拠 / Source: 国税庁仕様書 第六編 §4, 第二編 §4
6
+ * エンドポイント: GET /4/name?id=...&name=<UTF-8 URLenc>&type=02&...
7
+ */
8
+ import { z } from 'zod';
9
+ import { AttributionSchema, CorporationSchema, buildAttribution, } from '../domain/corporate-number.js';
10
+ import { Result } from '../lib/result.js';
11
+ import { computeNextCursor, decodeCursor } from '../lib/pagination.js';
12
+ const InputSchema = z
13
+ .object({
14
+ name: z
15
+ .string()
16
+ .min(1)
17
+ .max(150)
18
+ .describe('商号又は名称 (日本語 150文字以内 / 英語 300文字以内)。UTF-8。'),
19
+ match_mode: z
20
+ .enum(['prefix', 'partial'])
21
+ .default('prefix')
22
+ .describe('検索方式。prefix=前方一致 (法人種別を除いた先頭から、mode=1)、partial=部分一致 (法人種別を含めて全体から、mode=2)。'),
23
+ search_target: z
24
+ .enum(['fuzzy', 'exact', 'english'])
25
+ .default('fuzzy')
26
+ .describe('検索対象。fuzzy=JIS第一・第二水準のあいまい検索 (target=1、ひらがな↔カタカナ・英大小文字・中点空白無視)、exact=JIS第一〜第四水準の完全一致 (target=2)、english=英語表記検索 (target=3)。'),
27
+ prefecture: z
28
+ .string()
29
+ .regex(/^(?:\d{2}|\d{5})$/)
30
+ .optional()
31
+ .describe('都道府県コード (2桁 JIS X 0401、01-47 or 99=国外) または 都道府県+市区町村 (5桁)。'),
32
+ kind: z
33
+ .array(z.enum(['01', '02', '03', '04']))
34
+ .max(4)
35
+ .optional()
36
+ .describe('法人種別フィルタ。01=国の機関, 02=地方公共団体, 03=設立登記法人, 04=外国会社等・その他。最大4件。'),
37
+ include_history: z
38
+ .boolean()
39
+ .default(false)
40
+ .describe('過去情報を検索対象に含めるか (change=1)。最新情報のみなら false。'),
41
+ include_closed: z
42
+ .boolean()
43
+ .default(true)
44
+ .describe('登記記録の閉鎖等があった法人も含めるか (close=1、デフォルト true)。'),
45
+ cursor: z
46
+ .string()
47
+ .optional()
48
+ .describe('ページング用の不透明カーソル (MCP 仕様準拠、opaque string)。'),
49
+ })
50
+ .strict();
51
+ const OutputSchema = z
52
+ .object({
53
+ total: z.number().int().nonnegative().describe('該当件数 (国税庁レスポンスヘッダ count)'),
54
+ page_number: z.number().int().positive(),
55
+ page_size: z.number().int().positive(),
56
+ corporations: z.array(CorporationSchema),
57
+ next_cursor: z.string().nullable().describe('次ページの cursor (最終ページなら null)'),
58
+ last_update_date: z.string().describe('国税庁公表DB の最終更新日 (YYYY-MM-DD)'),
59
+ attribution: AttributionSchema,
60
+ })
61
+ .strict();
62
+ const DESCRIPTION = `会社名で国税庁公表サイトから法人情報を検索します。国税庁 API 内蔵のあいまい検索 (target=1) が ひらがな↔カタカナ・英大小文字・中点削除 を自動で処理するので、多少の表記揺れは吸収できます。
63
+
64
+ USE THIS WHEN:
65
+ - 会社名 (日本語・英語) だけ分かっていて法人番号・住所を知りたい
66
+ - 「鹿児島県の○○商事」を全部探したい (prefecture で絞り込み)
67
+ - 営業リストを一括で enrich したい
68
+
69
+ DO NOT USE WHEN:
70
+ - 法人番号 (13桁) が分かっている → lookup_corporate_by_number を使う方が速くて確実
71
+ - (株)/K.K./Co.,Ltd. などの表記揺れが激しい → まず normalize_company_name で候補化
72
+ - 検索結果が多すぎる場合 (国税庁エラー 400-180): prefecture や kind で絞り込む
73
+
74
+ ページング: 2000件超過時は国税庁側で分割レスポンスになります。次ページは next_cursor で取得。
75
+
76
+ 根拠: 国税庁 法人番号 Web-API 仕様書 第六編 §4、第二編 §4.6.1・§4.6.2 (target=1 内蔵あいまい検索の挙動)`;
77
+ export function registerSearchByNameTool(server, deps) {
78
+ server.registerTool('search_corporate_by_name', {
79
+ title: 'Search Japanese corporations by name',
80
+ description: DESCRIPTION,
81
+ inputSchema: InputSchema.shape,
82
+ outputSchema: OutputSchema.shape,
83
+ _meta: {
84
+ ui: { resourceUri: 'ui://search-results/mcp-app.html' },
85
+ },
86
+ annotations: {
87
+ title: 'Search Japanese corporations by name',
88
+ readOnlyHint: true,
89
+ destructiveHint: false,
90
+ idempotentHint: true,
91
+ openWorldHint: true,
92
+ },
93
+ }, async (args) => {
94
+ const input = InputSchema.parse(args);
95
+ const cursorPayload = decodeCursor(input.cursor);
96
+ const divide = cursorPayload?.divide ?? 1;
97
+ const mode = input.match_mode === 'prefix' ? '1' : '2';
98
+ const target = input.search_target === 'fuzzy' ? '1' : input.search_target === 'exact' ? '2' : '3';
99
+ deps.logger.info('tool.search_corporate_by_name', {
100
+ name_length: input.name.length,
101
+ mode,
102
+ target,
103
+ prefecture: input.prefecture ?? 'any',
104
+ divide,
105
+ });
106
+ const apiResult = await deps.ntaClient.searchByName({
107
+ name: input.name,
108
+ mode,
109
+ target,
110
+ ...(input.prefecture !== undefined && { address: input.prefecture }),
111
+ ...(input.kind !== undefined && input.kind.length > 0 && { kind: input.kind.join(',') }),
112
+ change: input.include_history ? '1' : '0',
113
+ close: input.include_closed ? '1' : '0',
114
+ divide,
115
+ });
116
+ if (Result.isErr(apiResult)) {
117
+ const err = apiResult.error;
118
+ deps.logger.error('tool.search_corporate_by_name.api_error', {
119
+ code: err.code,
120
+ httpStatus: err.httpStatus,
121
+ ntaErrorCode: err.ntaErrorCode,
122
+ });
123
+ return {
124
+ isError: true,
125
+ content: [
126
+ {
127
+ type: 'text',
128
+ text: JSON.stringify({
129
+ error: {
130
+ code: err.code,
131
+ message: err.message,
132
+ httpStatus: err.httpStatus,
133
+ guidance: err.httpStatus === 400
134
+ ? '検索結果が多すぎる可能性があります。prefecture や kind で絞り込んでください。'
135
+ : err.httpStatus === 403
136
+ ? 'レート制限中。しばらく待ってから再試行してください。'
137
+ : undefined,
138
+ },
139
+ attribution: buildAttribution(),
140
+ }, null, 2),
141
+ },
142
+ ],
143
+ };
144
+ }
145
+ const parsed = apiResult.value;
146
+ const queryKey = JSON.stringify([
147
+ input.name,
148
+ mode,
149
+ target,
150
+ input.prefecture,
151
+ input.kind,
152
+ input.include_history,
153
+ input.include_closed,
154
+ ]);
155
+ const nextCursor = computeNextCursor(parsed.header.divideNumber, parsed.header.divideSize, queryKey);
156
+ const output = {
157
+ total: parsed.header.count,
158
+ page_number: parsed.header.divideNumber,
159
+ page_size: parsed.header.divideSize,
160
+ corporations: parsed.corporations,
161
+ next_cursor: nextCursor,
162
+ last_update_date: parsed.header.lastUpdateDate,
163
+ attribution: buildAttribution(),
164
+ };
165
+ return {
166
+ content: [
167
+ {
168
+ type: 'text',
169
+ text: JSON.stringify(output, null, 2),
170
+ },
171
+ ],
172
+ structuredContent: output,
173
+ };
174
+ });
175
+ }
176
+ //# sourceMappingURL=search-by-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-by-name.js","sourceRoot":"","sources":["../../src/tools/search-by-name.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * T3: validate_corporate_number
3
+ * 法人番号のチェックデジットをローカル検証 (API 呼出なし、レート制限消費なし)
4
+ *
5
+ * 根拠 / Source: 国税庁仕様書 第二編 §2.1.3 (13桁・半角数字・チェックデジット付き)
6
+ */
7
+ import { z } from 'zod';
8
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ declare const InputSchema: z.ZodObject<{
10
+ corporate_number: z.ZodString;
11
+ }, z.core.$strict>;
12
+ declare const OutputSchema: z.ZodObject<{
13
+ is_valid: z.ZodBoolean;
14
+ normalized: z.ZodNullable<z.ZodString>;
15
+ reason: z.ZodEnum<{
16
+ not_13_digits: "not_13_digits";
17
+ check_digit_mismatch: "check_digit_mismatch";
18
+ invalid_characters: "invalid_characters";
19
+ first_digit_zero: "first_digit_zero";
20
+ ok: "ok";
21
+ }>;
22
+ guidance: z.ZodString;
23
+ attribution: z.ZodObject<{
24
+ data_source: z.ZodString;
25
+ service_disclaimer: z.ZodString;
26
+ license: z.ZodLiteral<"公共データ利用規約 第1.0版">;
27
+ api_version: z.ZodLiteral<"Ver.4.0">;
28
+ accessed_at: z.ZodString;
29
+ }, z.core.$strip>;
30
+ }, z.core.$strict>;
31
+ export type ValidateCheckDigitInput = z.infer<typeof InputSchema>;
32
+ export type ValidateCheckDigitOutput = z.infer<typeof OutputSchema>;
33
+ export declare function registerValidateCheckDigitTool(server: McpServer): void;
34
+ export {};
35
+ //# sourceMappingURL=validate-check-digit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-check-digit.d.ts","sourceRoot":"","sources":["../../src/tools/validate-check-digit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,QAAA,MAAM,WAAW;;kBASN,CAAC;AAEZ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;kBAkBP,CAAC;AAEZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAClE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAmBpE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4DtE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * T3: validate_corporate_number
3
+ * 法人番号のチェックデジットをローカル検証 (API 呼出なし、レート制限消費なし)
4
+ *
5
+ * 根拠 / Source: 国税庁仕様書 第二編 §2.1.3 (13桁・半角数字・チェックデジット付き)
6
+ */
7
+ import { z } from 'zod';
8
+ import { AttributionSchema, buildAttribution } from '../domain/corporate-number.js';
9
+ import { normalizeAndValidateCorporateNumber } from '../domain/check-digit.js';
10
+ const InputSchema = z
11
+ .object({
12
+ corporate_number: z
13
+ .string()
14
+ .min(1)
15
+ .describe('検証する文字列。ハイフン・全角数字・前後の空白は自動正規化されます。例: "1340-00102-3456" や "1340001023456" も受け付けます。'),
16
+ })
17
+ .strict();
18
+ const OutputSchema = z
19
+ .object({
20
+ is_valid: z.boolean(),
21
+ normalized: z
22
+ .string()
23
+ .regex(/^\d{13}$/)
24
+ .nullable()
25
+ .describe('半角13桁に正規化した法人番号。is_valid=false の場合 null。'),
26
+ reason: z.enum([
27
+ 'ok',
28
+ 'not_13_digits',
29
+ 'check_digit_mismatch',
30
+ 'invalid_characters',
31
+ 'first_digit_zero',
32
+ ]),
33
+ guidance: z.string().describe('エラー時の修正ガイダンス'),
34
+ attribution: AttributionSchema,
35
+ })
36
+ .strict();
37
+ const DESCRIPTION = `法人番号 (13桁) のチェックデジットをローカルで検証します。国税庁 API を叩かないため、レート制限を消費しません。高速・無料・オフライン動作。
38
+
39
+ USE THIS WHEN:
40
+ - 名刺や書類に記載された法人番号が 13桁として妥当かだけ確認したい
41
+ - API 呼出なしで事前バリデーションを実施したい (一括処理・フォーム入力検証)
42
+ - ハイフン・全角数字・空白を含む文字列を正規化したい
43
+
44
+ DO NOT USE WHEN:
45
+ - 番号から社名・住所を知りたい → lookup_corporate_by_number を使う
46
+ - 表記揺れのある会社名から検索したい → search_corporate_by_name
47
+
48
+ チェックデジット計算式 (国税庁仕様書 第二編 §2.1.3):
49
+ c = 9 - ( Σ_{n=1}^{12} (P_n × Q_n) mod 9 )
50
+ ただし c が 0 のとき c = 9
51
+ P_n: 12桁基礎番号の右から n 桁目
52
+ Q_n: n が偶数なら 1、奇数なら 2`;
53
+ export function registerValidateCheckDigitTool(server) {
54
+ server.registerTool('validate_corporate_number', {
55
+ title: 'Validate Japanese corporate number check digit (local, no API call)',
56
+ description: DESCRIPTION,
57
+ inputSchema: InputSchema.shape,
58
+ outputSchema: OutputSchema.shape,
59
+ annotations: {
60
+ title: 'Validate Japanese corporate number check digit',
61
+ readOnlyHint: true,
62
+ destructiveHint: false,
63
+ idempotentHint: true,
64
+ openWorldHint: false,
65
+ },
66
+ }, async (args) => {
67
+ const input = InputSchema.parse(args);
68
+ const result = normalizeAndValidateCorporateNumber(input.corporate_number);
69
+ let output;
70
+ if (result.isValid) {
71
+ output = {
72
+ is_valid: true,
73
+ normalized: result.normalized,
74
+ reason: 'ok',
75
+ guidance: '有効な法人番号です / Valid corporate number.',
76
+ attribution: buildAttribution(),
77
+ };
78
+ }
79
+ else {
80
+ const guidance = {
81
+ not_13_digits: '法人番号は 13桁の半角数字です。ハイフン・空白は除去されます。入力長を確認してください。',
82
+ check_digit_mismatch: 'チェックデジットが一致しません。番号の写し間違いの可能性が高いです。原本をご確認ください。',
83
+ invalid_characters: '数字以外の文字が含まれています。数字・ハイフン・空白以外を除いてください。',
84
+ first_digit_zero: '先頭桁 (チェックデジット) が 0 の法人番号は存在しません。入力をご確認ください。',
85
+ };
86
+ output = {
87
+ is_valid: false,
88
+ normalized: null,
89
+ reason: result.reason,
90
+ guidance: guidance[result.reason],
91
+ attribution: buildAttribution(),
92
+ };
93
+ }
94
+ return {
95
+ content: [
96
+ {
97
+ type: 'text',
98
+ text: JSON.stringify(output, null, 2),
99
+ },
100
+ ],
101
+ structuredContent: output,
102
+ };
103
+ });
104
+ }
105
+ //# sourceMappingURL=validate-check-digit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-check-digit.js","sourceRoot":"","sources":["../../src/tools/validate-check-digit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,mCAAmC,EAAE,MAAM,0BAA0B,CAAC;AAE/E,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,mFAAmF,CACpF;CACJ,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,KAAK,CAAC,UAAU,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,0CAA0C,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QACb,IAAI;QACJ,eAAe;QACf,sBAAsB;QACtB,oBAAoB;QACpB,kBAAkB;KACnB,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IAC7C,WAAW,EAAE,iBAAiB;CAC/B,CAAC;KACD,MAAM,EAAE,CAAC;AAKZ,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;wBAeI,CAAC;AAEzB,MAAM,UAAU,8BAA8B,CAAC,MAAiB;IAC9D,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,KAAK,EAAE,qEAAqE;QAC5E,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,WAAW,CAAC,KAAK;QAC9B,YAAY,EAAE,YAAY,CAAC,KAAK;QAChC,WAAW,EAAE;YACX,KAAK,EAAE,gDAAgD;YACvD,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,mCAAmC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAE3E,IAAI,MAAgC,CAAC;QACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,GAAG;gBACP,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,qCAAqC;gBAC/C,WAAW,EAAE,gBAAgB,EAAE;aAChC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAyC;gBACrD,aAAa,EACX,+CAA+C;gBACjD,oBAAoB,EAClB,+CAA+C;gBACjD,kBAAkB,EAChB,uCAAuC;gBACzC,gBAAgB,EACd,6CAA6C;aAChD,CAAC;YACF,MAAM,GAAG;gBACP,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBACjC,WAAW,EAAE,gBAAgB,EAAE;aAChC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;YACD,iBAAiB,EAAE,MAAM;SAC1B,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}