@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,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Completion handler (completion/complete)
|
|
3
|
+
*
|
|
4
|
+
* Resource Template `corp://{corporate_number}` の引数補完では、
|
|
5
|
+
* normalizeCompanyName (T7) を裏で駆動して会社名ベースの候補を返す実装も可能だが、
|
|
6
|
+
* corporate_number は数字13桁なので、国税庁 API を叩かず「ローカルでのチェックデジット
|
|
7
|
+
* 検証済み候補」を補完対象とする。
|
|
8
|
+
*
|
|
9
|
+
* 根拠 / Source: MCP 公式仕様 server/utilities/completion
|
|
10
|
+
* values: max 100 items
|
|
11
|
+
* total: optional
|
|
12
|
+
* hasMore: boolean
|
|
13
|
+
*/
|
|
14
|
+
import { CompleteRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
15
|
+
import { normalizeCompanyName } from '../domain/normalizer.js';
|
|
16
|
+
export function registerCompletionHandler(server, deps) {
|
|
17
|
+
server.setRequestHandler(CompleteRequestSchema, async (req) => {
|
|
18
|
+
const { ref, argument } = req.params;
|
|
19
|
+
deps.logger.debug('completion.request', {
|
|
20
|
+
refType: ref.type,
|
|
21
|
+
argName: argument.name,
|
|
22
|
+
valueLength: argument.value.length,
|
|
23
|
+
});
|
|
24
|
+
// Prompt 引数補完 (v0.2.0 で prompt 実装時に動く)
|
|
25
|
+
if (ref.type === 'ref/prompt') {
|
|
26
|
+
return completePromptArgument(ref.name ?? '', argument.name, argument.value);
|
|
27
|
+
}
|
|
28
|
+
// Resource Template 引数補完
|
|
29
|
+
if (ref.type === 'ref/resource') {
|
|
30
|
+
const uri = 'uri' in ref ? ref.uri : '';
|
|
31
|
+
if (uri.startsWith('corp://')) {
|
|
32
|
+
return completeCorporateNumber(argument.value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
completion: {
|
|
37
|
+
values: [],
|
|
38
|
+
total: 0,
|
|
39
|
+
hasMore: false,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* corp://{corporate_number} の補完
|
|
46
|
+
* 入力が数字でない場合は T7 normalizer で会社名候補を返す (参考情報として)
|
|
47
|
+
*/
|
|
48
|
+
function completeCorporateNumber(value) {
|
|
49
|
+
const trimmed = value.trim();
|
|
50
|
+
if (/^\d+$/.test(trimmed)) {
|
|
51
|
+
// 途中までの数字が入力された場合、現時点では候補提示なし
|
|
52
|
+
// (国税庁 API に部分マッチ検索がないため、数字途中からの補完は仕様上不可)
|
|
53
|
+
return {
|
|
54
|
+
completion: {
|
|
55
|
+
values: [],
|
|
56
|
+
total: 0,
|
|
57
|
+
hasMore: false,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// 会社名が入力された場合、T7 で候補化して参考情報として返す
|
|
62
|
+
// 注: URI テンプレートの変数は13桁数字を期待するため、これらは「search_corporate_by_name で
|
|
63
|
+
// 使用できる候補」として提示される (MCP ホストが UI で補完候補を表示する際の参考)
|
|
64
|
+
if (trimmed.length > 0) {
|
|
65
|
+
const normalized = normalizeCompanyName(trimmed);
|
|
66
|
+
const values = normalized.normalized_candidates.slice(0, 20).map((c) => c.name);
|
|
67
|
+
return {
|
|
68
|
+
completion: {
|
|
69
|
+
values,
|
|
70
|
+
total: values.length,
|
|
71
|
+
hasMore: false,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
completion: {
|
|
77
|
+
values: [],
|
|
78
|
+
total: 0,
|
|
79
|
+
hasMore: false,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Prompt 引数の補完
|
|
85
|
+
*
|
|
86
|
+
* - business-card-to-database: target_database_format (enum)
|
|
87
|
+
* - sales-list-enrichment: output_format (enum)
|
|
88
|
+
* - customer-master-dedup: dedup_criteria (enum)
|
|
89
|
+
*/
|
|
90
|
+
function completePromptArgument(promptName, argName, value) {
|
|
91
|
+
const enumMap = {
|
|
92
|
+
'business-card-to-database': {
|
|
93
|
+
target_database_format: ['crm_json', 'salesforce_csv', 'hubspot_properties', 'plain_summary'],
|
|
94
|
+
},
|
|
95
|
+
'sales-list-enrichment': {
|
|
96
|
+
output_format: ['markdown_table', 'csv', 'jsonl'],
|
|
97
|
+
},
|
|
98
|
+
'customer-master-dedup': {
|
|
99
|
+
dedup_criteria: ['strict_corporate_number', 'fuzzy_name_address', 'conservative_flag_only'],
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
const enumValues = enumMap[promptName]?.[argName];
|
|
103
|
+
if (enumValues !== undefined) {
|
|
104
|
+
const filtered = enumValues.filter((v) => v.startsWith(value));
|
|
105
|
+
return {
|
|
106
|
+
completion: {
|
|
107
|
+
values: filtered,
|
|
108
|
+
total: filtered.length,
|
|
109
|
+
hasMore: false,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (argName === 'company_name' || argName === 'name' || argName === 'raw_input') {
|
|
114
|
+
const trimmed = value.trim();
|
|
115
|
+
if (trimmed.length === 0) {
|
|
116
|
+
return { completion: { values: [], total: 0, hasMore: false } };
|
|
117
|
+
}
|
|
118
|
+
const normalized = normalizeCompanyName(trimmed);
|
|
119
|
+
const values = normalized.normalized_candidates.slice(0, 20).map((c) => c.name);
|
|
120
|
+
return {
|
|
121
|
+
completion: {
|
|
122
|
+
values,
|
|
123
|
+
total: values.length,
|
|
124
|
+
hasMore: false,
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
completion: {
|
|
130
|
+
values: [],
|
|
131
|
+
total: 0,
|
|
132
|
+
hasMore: false,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/completion/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 法人番号のチェックデジット計算
|
|
3
|
+
* Corporate number check digit computation
|
|
4
|
+
* Komputasi check digit nomor perusahaan
|
|
5
|
+
*
|
|
6
|
+
* 根拠 / Source / Sumber:
|
|
7
|
+
* 国税庁「法人番号システム Web-API 機能仕様書 第二編 1.2版」
|
|
8
|
+
* 第二編 §2「法人番号を指定して情報を取得する機能」
|
|
9
|
+
* 法人番号 = 13桁 = チェックデジット (1桁) + 基礎番号 (12桁)
|
|
10
|
+
*
|
|
11
|
+
* 計算式:
|
|
12
|
+
* c = 9 - ( Σ_{n=1}^{12} (P_n × Q_n) mod 9 )
|
|
13
|
+
* ただし c が 0 のとき c = 9 として扱う
|
|
14
|
+
*
|
|
15
|
+
* P_n: 12 桁の基礎番号の各桁 (右から 1 桁目を P_1)
|
|
16
|
+
* Q_n: n が偶数なら 1, 奇数なら 2
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* 12 桁の基礎番号からチェックデジット (1桁) を計算
|
|
20
|
+
* Compute check digit from 12-digit basis number
|
|
21
|
+
* Menghitung check digit dari 12 digit basis
|
|
22
|
+
*
|
|
23
|
+
* 実検証により、P_n は左から n 桁目 (1-indexed) として扱う必要がある。
|
|
24
|
+
* 奇数位置 (n=1,3,5,...) は Q_n=2、偶数位置 (n=2,4,6,...) は Q_n=1。
|
|
25
|
+
* 国税庁公表の check_digit.pdf の計算例 5111101000006 等で検証済み。
|
|
26
|
+
*/
|
|
27
|
+
export declare function computeCheckDigit(twelveDigits: string): number;
|
|
28
|
+
/**
|
|
29
|
+
* 13 桁文字列がチェックデジットとして妥当かを検証
|
|
30
|
+
* Verify 13-digit string has a valid check digit
|
|
31
|
+
* Memverifikasi bahwa string 13-digit memiliki check digit valid
|
|
32
|
+
*/
|
|
33
|
+
export declare function isValidCheckDigit(thirteenDigits: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* 文字列の正規化 + チェックデジット検証を一括実施
|
|
36
|
+
* Normalize (full-width, hyphens, spaces) + validate check digit
|
|
37
|
+
* Normalisasi lalu verifikasi check digit
|
|
38
|
+
*/
|
|
39
|
+
export declare function normalizeAndValidateCorporateNumber(raw: string): {
|
|
40
|
+
isValid: true;
|
|
41
|
+
normalized: string;
|
|
42
|
+
} | {
|
|
43
|
+
isValid: false;
|
|
44
|
+
reason: ValidationReason;
|
|
45
|
+
};
|
|
46
|
+
export type ValidationReason = 'not_13_digits' | 'check_digit_mismatch' | 'invalid_characters' | 'first_digit_zero';
|
|
47
|
+
//# sourceMappingURL=check-digit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-digit.d.ts","sourceRoot":"","sources":["../../src/domain/check-digit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAiB9D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAWjE;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,GACV;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAuBtF;AAED,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,sBAAsB,GACtB,oBAAoB,GACpB,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 法人番号のチェックデジット計算
|
|
3
|
+
* Corporate number check digit computation
|
|
4
|
+
* Komputasi check digit nomor perusahaan
|
|
5
|
+
*
|
|
6
|
+
* 根拠 / Source / Sumber:
|
|
7
|
+
* 国税庁「法人番号システム Web-API 機能仕様書 第二編 1.2版」
|
|
8
|
+
* 第二編 §2「法人番号を指定して情報を取得する機能」
|
|
9
|
+
* 法人番号 = 13桁 = チェックデジット (1桁) + 基礎番号 (12桁)
|
|
10
|
+
*
|
|
11
|
+
* 計算式:
|
|
12
|
+
* c = 9 - ( Σ_{n=1}^{12} (P_n × Q_n) mod 9 )
|
|
13
|
+
* ただし c が 0 のとき c = 9 として扱う
|
|
14
|
+
*
|
|
15
|
+
* P_n: 12 桁の基礎番号の各桁 (右から 1 桁目を P_1)
|
|
16
|
+
* Q_n: n が偶数なら 1, 奇数なら 2
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* 12 桁の基礎番号からチェックデジット (1桁) を計算
|
|
20
|
+
* Compute check digit from 12-digit basis number
|
|
21
|
+
* Menghitung check digit dari 12 digit basis
|
|
22
|
+
*
|
|
23
|
+
* 実検証により、P_n は左から n 桁目 (1-indexed) として扱う必要がある。
|
|
24
|
+
* 奇数位置 (n=1,3,5,...) は Q_n=2、偶数位置 (n=2,4,6,...) は Q_n=1。
|
|
25
|
+
* 国税庁公表の check_digit.pdf の計算例 5111101000006 等で検証済み。
|
|
26
|
+
*/
|
|
27
|
+
export function computeCheckDigit(twelveDigits) {
|
|
28
|
+
if (!/^\d{12}$/.test(twelveDigits)) {
|
|
29
|
+
throw new Error('twelveDigits must be exactly 12 digit characters');
|
|
30
|
+
}
|
|
31
|
+
let sum = 0;
|
|
32
|
+
for (let n = 1; n <= 12; n++) {
|
|
33
|
+
const digitChar = twelveDigits[n - 1];
|
|
34
|
+
if (digitChar === undefined) {
|
|
35
|
+
throw new Error('Unexpected index out of range');
|
|
36
|
+
}
|
|
37
|
+
const digit = Number(digitChar);
|
|
38
|
+
const q = n % 2 === 0 ? 1 : 2;
|
|
39
|
+
sum += digit * q;
|
|
40
|
+
}
|
|
41
|
+
const mod = sum % 9;
|
|
42
|
+
const c = 9 - mod;
|
|
43
|
+
return c === 0 ? 9 : c;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 13 桁文字列がチェックデジットとして妥当かを検証
|
|
47
|
+
* Verify 13-digit string has a valid check digit
|
|
48
|
+
* Memverifikasi bahwa string 13-digit memiliki check digit valid
|
|
49
|
+
*/
|
|
50
|
+
export function isValidCheckDigit(thirteenDigits) {
|
|
51
|
+
if (!/^\d{13}$/.test(thirteenDigits))
|
|
52
|
+
return false;
|
|
53
|
+
const firstChar = thirteenDigits[0];
|
|
54
|
+
if (firstChar === undefined)
|
|
55
|
+
return false;
|
|
56
|
+
const checkDigit = Number(firstChar);
|
|
57
|
+
if (checkDigit === 0) {
|
|
58
|
+
// 先頭が 0 の場合、チェックデジットとして無効 (1-9)
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const basis = thirteenDigits.slice(1);
|
|
62
|
+
return computeCheckDigit(basis) === checkDigit;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 文字列の正規化 + チェックデジット検証を一括実施
|
|
66
|
+
* Normalize (full-width, hyphens, spaces) + validate check digit
|
|
67
|
+
* Normalisasi lalu verifikasi check digit
|
|
68
|
+
*/
|
|
69
|
+
export function normalizeAndValidateCorporateNumber(raw) {
|
|
70
|
+
if (raw.length === 0) {
|
|
71
|
+
return { isValid: false, reason: 'not_13_digits' };
|
|
72
|
+
}
|
|
73
|
+
// 全角数字を半角に、ハイフン/空白を除去
|
|
74
|
+
const normalized = raw
|
|
75
|
+
.replace(/[\uFF10-\uFF19]/g, (ch) => String.fromCharCode(ch.charCodeAt(0) - 0xfee0))
|
|
76
|
+
.replace(/[\s\-\u2010-\u2015\u30FC]/g, '');
|
|
77
|
+
if (!/^\d+$/.test(normalized)) {
|
|
78
|
+
return { isValid: false, reason: 'invalid_characters' };
|
|
79
|
+
}
|
|
80
|
+
if (normalized.length !== 13) {
|
|
81
|
+
return { isValid: false, reason: 'not_13_digits' };
|
|
82
|
+
}
|
|
83
|
+
if (normalized[0] === '0') {
|
|
84
|
+
return { isValid: false, reason: 'first_digit_zero' };
|
|
85
|
+
}
|
|
86
|
+
if (!isValidCheckDigit(normalized)) {
|
|
87
|
+
return { isValid: false, reason: 'check_digit_mismatch' };
|
|
88
|
+
}
|
|
89
|
+
return { isValid: true, normalized };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=check-digit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-digit.js","sourceRoot":"","sources":["../../src/domain/check-digit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 登記記録の閉鎖等の事由コード辞書
|
|
3
|
+
* Registry closure cause code dictionary
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source: 国税庁仕様書 第二編 別紙1 項番26 登記記録の閉鎖等の事由
|
|
6
|
+
*/
|
|
7
|
+
export declare const CLOSE_CAUSE_CODES: {
|
|
8
|
+
readonly '01': {
|
|
9
|
+
readonly ja: "清算の結了等";
|
|
10
|
+
readonly en: "Liquidation completed";
|
|
11
|
+
};
|
|
12
|
+
readonly '11': {
|
|
13
|
+
readonly ja: "合併による解散等";
|
|
14
|
+
readonly en: "Dissolved via merger";
|
|
15
|
+
};
|
|
16
|
+
readonly '21': {
|
|
17
|
+
readonly ja: "登記官による閉鎖";
|
|
18
|
+
readonly en: "Closed by registrar (Article 81)";
|
|
19
|
+
};
|
|
20
|
+
readonly '31': {
|
|
21
|
+
readonly ja: "その他の清算の結了等";
|
|
22
|
+
readonly en: "Other liquidation (non-registered juridical persons)";
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export type CloseCauseCode = keyof typeof CLOSE_CAUSE_CODES;
|
|
26
|
+
export declare function isCloseCauseCode(value: string): value is CloseCauseCode;
|
|
27
|
+
export declare function closeCauseLabel(code: string, lang?: 'ja' | 'en'): string;
|
|
28
|
+
//# sourceMappingURL=close-cause-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-cause-codes.d.ts","sourceRoot":"","sources":["../../src/domain/close-cause-codes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAQpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAE5D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAM9E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 登記記録の閉鎖等の事由コード辞書
|
|
3
|
+
* Registry closure cause code dictionary
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source: 国税庁仕様書 第二編 別紙1 項番26 登記記録の閉鎖等の事由
|
|
6
|
+
*/
|
|
7
|
+
export const CLOSE_CAUSE_CODES = {
|
|
8
|
+
'01': { ja: '清算の結了等', en: 'Liquidation completed' },
|
|
9
|
+
'11': { ja: '合併による解散等', en: 'Dissolved via merger' },
|
|
10
|
+
'21': { ja: '登記官による閉鎖', en: 'Closed by registrar (Article 81)' },
|
|
11
|
+
'31': {
|
|
12
|
+
ja: 'その他の清算の結了等',
|
|
13
|
+
en: 'Other liquidation (non-registered juridical persons)',
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export function isCloseCauseCode(value) {
|
|
17
|
+
return Object.prototype.hasOwnProperty.call(CLOSE_CAUSE_CODES, value);
|
|
18
|
+
}
|
|
19
|
+
export function closeCauseLabel(code, lang = 'ja') {
|
|
20
|
+
if (code === '' || code === undefined)
|
|
21
|
+
return '';
|
|
22
|
+
if (isCloseCauseCode(code)) {
|
|
23
|
+
return CLOSE_CAUSE_CODES[code][lang];
|
|
24
|
+
}
|
|
25
|
+
return `unknown(${code})`;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=close-cause-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-cause-codes.js","sourceRoot":"","sources":["../../src/domain/close-cause-codes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,uBAAuB,EAAE;IACnD,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,sBAAsB,EAAE;IACpD,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,kCAAkC,EAAE;IAChE,IAAI,EAAE;QACJ,EAAE,EAAE,YAAY;QAChB,EAAE,EAAE,sDAAsD;KAC3D;CACO,CAAC;AAIX,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAoB,IAAI;IACpE,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACjD,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,WAAW,IAAI,GAAG,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 法人番号の Branded Type + Zod スキーマ
|
|
3
|
+
* Corporate number Branded Type + Zod schema
|
|
4
|
+
* Tipe branded + skema Zod untuk nomor perusahaan
|
|
5
|
+
*
|
|
6
|
+
* 根拠 / Source: 国税庁仕様書 第二編 §2.1.3 (13桁半角数字、チェックデジット付き)
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
/**
|
|
10
|
+
* 13 桁・チェックデジット検証済の法人番号を表す Branded Type
|
|
11
|
+
* Branded type representing a validated 13-digit corporate number
|
|
12
|
+
*/
|
|
13
|
+
export declare const CorporateNumberSchema: z.core.$ZodBranded<z.ZodString, "CorporateNumber", "out">;
|
|
14
|
+
export type CorporateNumber = z.infer<typeof CorporateNumberSchema>;
|
|
15
|
+
/**
|
|
16
|
+
* 政府標準利用規約 + Web-API 利用規約 別添1 第6条 遵守のための出典情報
|
|
17
|
+
* Attribution field required by NTA Web-API Terms Article 6 and 公共データ利用規約 第1.0版
|
|
18
|
+
*
|
|
19
|
+
* 根拠: 国税庁仕様書 第一編 別添1 第6条・別添3 公共データ利用規約 第1.0版
|
|
20
|
+
*/
|
|
21
|
+
export declare const AttributionSchema: z.ZodObject<{
|
|
22
|
+
data_source: z.ZodString;
|
|
23
|
+
service_disclaimer: z.ZodString;
|
|
24
|
+
license: z.ZodLiteral<"公共データ利用規約 第1.0版">;
|
|
25
|
+
api_version: z.ZodLiteral<"Ver.4.0">;
|
|
26
|
+
accessed_at: z.ZodString;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export type Attribution = z.infer<typeof AttributionSchema>;
|
|
29
|
+
/**
|
|
30
|
+
* 標準出典文を生成
|
|
31
|
+
* Generate standard attribution record
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildAttribution(): Attribution;
|
|
34
|
+
/**
|
|
35
|
+
* 国税庁レスポンスから MCP 出力形式の法人情報へ変換
|
|
36
|
+
* Canonical internal shape for corporate info
|
|
37
|
+
* 参考: 第二編 別紙1 リソース定義書 (36 項目)
|
|
38
|
+
*/
|
|
39
|
+
export declare const CorporationSchema: z.ZodObject<{
|
|
40
|
+
corporate_number: z.ZodString;
|
|
41
|
+
sequence_number: z.ZodNumber;
|
|
42
|
+
process: z.ZodString;
|
|
43
|
+
correct: z.ZodEnum<{
|
|
44
|
+
0: "0";
|
|
45
|
+
1: "1";
|
|
46
|
+
}>;
|
|
47
|
+
update_date: z.ZodString;
|
|
48
|
+
change_date: z.ZodString;
|
|
49
|
+
name: z.ZodString;
|
|
50
|
+
name_image_id: z.ZodString;
|
|
51
|
+
kind: z.ZodString;
|
|
52
|
+
prefecture_name: z.ZodString;
|
|
53
|
+
city_name: z.ZodString;
|
|
54
|
+
street_number: z.ZodString;
|
|
55
|
+
address_image_id: z.ZodString;
|
|
56
|
+
prefecture_code: z.ZodString;
|
|
57
|
+
city_code: z.ZodString;
|
|
58
|
+
post_code: z.ZodString;
|
|
59
|
+
address_outside: z.ZodString;
|
|
60
|
+
address_outside_image_id: z.ZodString;
|
|
61
|
+
close_date: z.ZodString;
|
|
62
|
+
close_cause: z.ZodString;
|
|
63
|
+
successor_corporate_number: z.ZodString;
|
|
64
|
+
change_cause: z.ZodString;
|
|
65
|
+
assignment_date: z.ZodString;
|
|
66
|
+
latest: z.ZodEnum<{
|
|
67
|
+
0: "0";
|
|
68
|
+
1: "1";
|
|
69
|
+
}>;
|
|
70
|
+
en_name: z.ZodString;
|
|
71
|
+
en_prefecture_name: z.ZodString;
|
|
72
|
+
en_city_name: z.ZodString;
|
|
73
|
+
en_address_outside: z.ZodString;
|
|
74
|
+
furigana: z.ZodString;
|
|
75
|
+
hihyoji: z.ZodEnum<{
|
|
76
|
+
0: "0";
|
|
77
|
+
1: "1";
|
|
78
|
+
}>;
|
|
79
|
+
}, z.core.$strip>;
|
|
80
|
+
export type Corporation = z.infer<typeof CorporationSchema>;
|
|
81
|
+
//# sourceMappingURL=corporate-number.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corporate-number.d.ts","sourceRoot":"","sources":["../../src/domain/corporate-number.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,eAAO,MAAM,qBAAqB,2DAML,CAAC;AAE9B,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;;iBAY5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAS9C;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+B5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 法人番号の Branded Type + Zod スキーマ
|
|
3
|
+
* Corporate number Branded Type + Zod schema
|
|
4
|
+
* Tipe branded + skema Zod untuk nomor perusahaan
|
|
5
|
+
*
|
|
6
|
+
* 根拠 / Source: 国税庁仕様書 第二編 §2.1.3 (13桁半角数字、チェックデジット付き)
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { isValidCheckDigit } from './check-digit.js';
|
|
10
|
+
/**
|
|
11
|
+
* 13 桁・チェックデジット検証済の法人番号を表す Branded Type
|
|
12
|
+
* Branded type representing a validated 13-digit corporate number
|
|
13
|
+
*/
|
|
14
|
+
export const CorporateNumberSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^\d{13}$/, '法人番号は半角数字 13 桁です / Must be 13 half-width digits')
|
|
17
|
+
.refine(isValidCheckDigit, {
|
|
18
|
+
message: 'チェックデジットが一致しません / Check digit mismatch',
|
|
19
|
+
})
|
|
20
|
+
.brand();
|
|
21
|
+
/**
|
|
22
|
+
* 政府標準利用規約 + Web-API 利用規約 別添1 第6条 遵守のための出典情報
|
|
23
|
+
* Attribution field required by NTA Web-API Terms Article 6 and 公共データ利用規約 第1.0版
|
|
24
|
+
*
|
|
25
|
+
* 根拠: 国税庁仕様書 第一編 別添1 第6条・別添3 公共データ利用規約 第1.0版
|
|
26
|
+
*/
|
|
27
|
+
export const AttributionSchema = z.object({
|
|
28
|
+
data_source: z
|
|
29
|
+
.string()
|
|
30
|
+
.describe('データ出典 / Data source / Sumber data (公共データ利用規約 第1.0版 に基づく)'),
|
|
31
|
+
service_disclaimer: z
|
|
32
|
+
.string()
|
|
33
|
+
.describe('利用規約別添1 第6条で求められる指定文言 / Required disclaimer per Article 6 of NTA Web-API ToS'),
|
|
34
|
+
license: z.literal('公共データ利用規約 第1.0版').describe('ライセンス / License'),
|
|
35
|
+
api_version: z.literal('Ver.4.0').describe('国税庁 Web-API バージョン'),
|
|
36
|
+
accessed_at: z.string().describe('アクセス日時 / Accessed at (ISO 8601)'),
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* 標準出典文を生成
|
|
40
|
+
* Generate standard attribution record
|
|
41
|
+
*/
|
|
42
|
+
export function buildAttribution() {
|
|
43
|
+
return {
|
|
44
|
+
data_source: '国税庁法人番号公表サイト(国税庁)https://www.houjin-bangou.nta.go.jp/',
|
|
45
|
+
service_disclaimer: 'このサービスは、国税庁法人番号システム Web-API 機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない。',
|
|
46
|
+
license: '公共データ利用規約 第1.0版',
|
|
47
|
+
api_version: 'Ver.4.0',
|
|
48
|
+
accessed_at: new Date().toISOString(),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 国税庁レスポンスから MCP 出力形式の法人情報へ変換
|
|
53
|
+
* Canonical internal shape for corporate info
|
|
54
|
+
* 参考: 第二編 別紙1 リソース定義書 (36 項目)
|
|
55
|
+
*/
|
|
56
|
+
export const CorporationSchema = z.object({
|
|
57
|
+
corporate_number: z.string().describe('法人番号 (13桁)'),
|
|
58
|
+
sequence_number: z.number().int().describe('一連番号 (第二編 項番7)'),
|
|
59
|
+
process: z.string().describe('処理区分 (01=新規 / 11=商号変更 / 12=所在地変更 ...)'),
|
|
60
|
+
correct: z.enum(['0', '1']).describe('訂正区分 (0=訂正以外 / 1=訂正)'),
|
|
61
|
+
update_date: z.string().describe('更新年月日 YYYY-MM-DD'),
|
|
62
|
+
change_date: z.string().describe('変更年月日 YYYY-MM-DD'),
|
|
63
|
+
name: z.string().describe('商号又は名称'),
|
|
64
|
+
name_image_id: z.string().describe('商号イメージID (JIS 第1/2水準外 or 150字超)'),
|
|
65
|
+
kind: z.string().describe('法人種別コード (101/201/301/302/303/304/305/399/401/499)'),
|
|
66
|
+
prefecture_name: z.string().describe('国内所在地 都道府県'),
|
|
67
|
+
city_name: z.string().describe('国内所在地 市区町村'),
|
|
68
|
+
street_number: z.string().describe('国内所在地 丁目番地等'),
|
|
69
|
+
address_image_id: z.string().describe('国内所在地イメージID'),
|
|
70
|
+
prefecture_code: z.string().describe('都道府県コード (JIS X 0401)'),
|
|
71
|
+
city_code: z.string().describe('市区町村コード (JIS X 0402)'),
|
|
72
|
+
post_code: z.string().describe('郵便番号 (7桁)'),
|
|
73
|
+
address_outside: z.string().describe('国外所在地'),
|
|
74
|
+
address_outside_image_id: z.string().describe('国外所在地イメージID'),
|
|
75
|
+
close_date: z.string().describe('登記記録の閉鎖等年月日'),
|
|
76
|
+
close_cause: z.string().describe('登記記録の閉鎖等の事由 (01/11/21/31)'),
|
|
77
|
+
successor_corporate_number: z.string().describe('承継先法人番号'),
|
|
78
|
+
change_cause: z.string().describe('変更事由の詳細'),
|
|
79
|
+
assignment_date: z.string().describe('法人番号指定年月日'),
|
|
80
|
+
latest: z.enum(['0', '1']).describe('最新履歴 (0=過去 / 1=最新)'),
|
|
81
|
+
en_name: z.string().describe('商号又は名称 (英語表記)'),
|
|
82
|
+
en_prefecture_name: z.string().describe('国内所在地 都道府県 (英語表記)'),
|
|
83
|
+
en_city_name: z.string().describe('国内所在地 市区町村丁目番地等 (英語表記)'),
|
|
84
|
+
en_address_outside: z.string().describe('国外所在地 (英語表記)'),
|
|
85
|
+
furigana: z.string().describe('フリガナ (全角カタカナ・長音のみ)'),
|
|
86
|
+
hihyoji: z.enum(['0', '1']).describe('検索対象除外 (0=対象 / 1=除外、Ver.4.0 追加)'),
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=corporate-number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corporate-number.js","sourceRoot":"","sources":["../../src/domain/corporate-number.ts"],"names":[],"mappings":"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"}
|