@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.
- package/CHANGELOG.md +86 -0
- package/LICENSE +21 -0
- package/README.ja.md +196 -0
- package/README.md +198 -0
- package/dist/api/csv-parser.d.ts +37 -0
- package/dist/api/csv-parser.d.ts.map +1 -0
- package/dist/api/csv-parser.js +189 -0
- package/dist/api/csv-parser.js.map +1 -0
- package/dist/api/nta-client.d.ts +71 -0
- package/dist/api/nta-client.d.ts.map +1 -0
- package/dist/api/nta-client.js +117 -0
- package/dist/api/nta-client.js.map +1 -0
- package/dist/api/rate-limiter.d.ts +39 -0
- package/dist/api/rate-limiter.d.ts.map +1 -0
- package/dist/api/rate-limiter.js +74 -0
- package/dist/api/rate-limiter.js.map +1 -0
- package/dist/completion/handler.d.ts +19 -0
- package/dist/completion/handler.d.ts.map +1 -0
- package/dist/completion/handler.js +136 -0
- package/dist/completion/handler.js.map +1 -0
- package/dist/domain/check-digit.d.ts +47 -0
- package/dist/domain/check-digit.d.ts.map +1 -0
- package/dist/domain/check-digit.js +91 -0
- package/dist/domain/check-digit.js.map +1 -0
- package/dist/domain/close-cause-codes.d.ts +28 -0
- package/dist/domain/close-cause-codes.d.ts.map +1 -0
- package/dist/domain/close-cause-codes.js +27 -0
- package/dist/domain/close-cause-codes.js.map +1 -0
- package/dist/domain/corporate-number.d.ts +81 -0
- package/dist/domain/corporate-number.d.ts.map +1 -0
- package/dist/domain/corporate-number.js +88 -0
- package/dist/domain/corporate-number.js.map +1 -0
- package/dist/domain/invoice-codes.d.ts +142 -0
- package/dist/domain/invoice-codes.d.ts.map +1 -0
- package/dist/domain/invoice-codes.js +106 -0
- package/dist/domain/invoice-codes.js.map +1 -0
- package/dist/domain/invoice-number.d.ts +47 -0
- package/dist/domain/invoice-number.d.ts.map +1 -0
- package/dist/domain/invoice-number.js +71 -0
- package/dist/domain/invoice-number.js.map +1 -0
- package/dist/domain/kind-codes.d.ts +62 -0
- package/dist/domain/kind-codes.d.ts.map +1 -0
- package/dist/domain/kind-codes.js +68 -0
- package/dist/domain/kind-codes.js.map +1 -0
- package/dist/domain/normalizer.d.ts +50 -0
- package/dist/domain/normalizer.d.ts.map +1 -0
- package/dist/domain/normalizer.js +280 -0
- package/dist/domain/normalizer.js.map +1 -0
- package/dist/domain/prefecture-codes.d.ts +61 -0
- package/dist/domain/prefecture-codes.d.ts.map +1 -0
- package/dist/domain/prefecture-codes.js +67 -0
- package/dist/domain/prefecture-codes.js.map +1 -0
- package/dist/domain/process-codes.d.ts +52 -0
- package/dist/domain/process-codes.d.ts.map +1 -0
- package/dist/domain/process-codes.js +28 -0
- package/dist/domain/process-codes.js.map +1 -0
- package/dist/lib/env.d.ts +35 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +40 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/errors.d.ts +47 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +92 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/mcp-logger.d.ts +29 -0
- package/dist/lib/mcp-logger.d.ts.map +1 -0
- package/dist/lib/mcp-logger.js +98 -0
- package/dist/lib/mcp-logger.js.map +1 -0
- package/dist/lib/pagination.d.ts +28 -0
- package/dist/lib/pagination.d.ts.map +1 -0
- package/dist/lib/pagination.js +48 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/lib/result.d.ts +29 -0
- package/dist/lib/result.d.ts.map +1 -0
- package/dist/lib/result.js +36 -0
- package/dist/lib/result.js.map +1 -0
- package/dist/lib/trace-context.d.ts +36 -0
- package/dist/lib/trace-context.d.ts.map +1 -0
- package/dist/lib/trace-context.js +77 -0
- package/dist/lib/trace-context.js.map +1 -0
- package/dist/mcp.d.ts +9 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +54 -0
- package/dist/mcp.js.map +1 -0
- package/dist/prompts/business-card-to-database.d.ts +12 -0
- package/dist/prompts/business-card-to-database.d.ts.map +1 -0
- package/dist/prompts/business-card-to-database.js +80 -0
- package/dist/prompts/business-card-to-database.js.map +1 -0
- package/dist/prompts/customer-master-dedup.d.ts +9 -0
- package/dist/prompts/customer-master-dedup.d.ts.map +1 -0
- package/dist/prompts/customer-master-dedup.js +77 -0
- package/dist/prompts/customer-master-dedup.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +9 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/sales-list-enrichment.d.ts +9 -0
- package/dist/prompts/sales-list-enrichment.d.ts.map +1 -0
- package/dist/prompts/sales-list-enrichment.js +84 -0
- package/dist/prompts/sales-list-enrichment.js.map +1 -0
- package/dist/resources/attribution.d.ts +9 -0
- package/dist/resources/attribution.d.ts.map +1 -0
- package/dist/resources/attribution.js +27 -0
- package/dist/resources/attribution.js.map +1 -0
- package/dist/resources/corporate-template.d.ts +14 -0
- package/dist/resources/corporate-template.d.ts.map +1 -0
- package/dist/resources/corporate-template.js +87 -0
- package/dist/resources/corporate-template.js.map +1 -0
- package/dist/resources/index.d.ts +8 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +9 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/ui-resources.d.ts +9 -0
- package/dist/resources/ui-resources.d.ts.map +1 -0
- package/dist/resources/ui-resources.js +59 -0
- package/dist/resources/ui-resources.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +217 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/get-attribution.d.ts +25 -0
- package/dist/tools/get-attribution.d.ts.map +1 -0
- package/dist/tools/get-attribution.js +120 -0
- package/dist/tools/get-attribution.js.map +1 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lookup-by-number.d.ts +82 -0
- package/dist/tools/lookup-by-number.d.ts.map +1 -0
- package/dist/tools/lookup-by-number.js +157 -0
- package/dist/tools/lookup-by-number.js.map +1 -0
- package/dist/tools/normalize-company-name.d.ts +60 -0
- package/dist/tools/normalize-company-name.d.ts.map +1 -0
- package/dist/tools/normalize-company-name.js +130 -0
- package/dist/tools/normalize-company-name.js.map +1 -0
- package/dist/tools/search-by-name.d.ts +96 -0
- package/dist/tools/search-by-name.d.ts.map +1 -0
- package/dist/tools/search-by-name.js +176 -0
- package/dist/tools/search-by-name.js.map +1 -0
- package/dist/tools/validate-check-digit.d.ts +35 -0
- package/dist/tools/validate-check-digit.d.ts.map +1 -0
- package/dist/tools/validate-check-digit.js +105 -0
- package/dist/tools/validate-check-digit.js.map +1 -0
- package/dist/ui/corporate-card/mcp-app.html +157 -0
- package/dist/ui/search-results/mcp-app.html +158 -0
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|