@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,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt: business-card-to-database
|
|
3
|
+
*
|
|
4
|
+
* 名刺 OCR テキストから国税庁公表データを参照して正確な法人情報を引き出し、
|
|
5
|
+
* 構造化レコードとして新規取引先登録に使える形にするワークフロー。
|
|
6
|
+
*
|
|
7
|
+
* 根拠 / Source: MCP 公式仕様 (Prompts primitive)
|
|
8
|
+
* user-controlled、LLM 側で「ツールを順番に呼び出す」ガイダンスを提供
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
const argsSchema = z.object({
|
|
12
|
+
raw_business_card_text: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.max(5000)
|
|
16
|
+
.describe('名刺の OCR 結果、または手入力テキスト。会社名・住所・氏名・役職等を含む'),
|
|
17
|
+
target_database_format: z
|
|
18
|
+
.enum(['crm_json', 'salesforce_csv', 'hubspot_properties', 'plain_summary'])
|
|
19
|
+
.default('plain_summary')
|
|
20
|
+
.describe('最終出力フォーマット'),
|
|
21
|
+
});
|
|
22
|
+
export function registerBusinessCardToDatabasePrompt(server) {
|
|
23
|
+
server.registerPrompt('business-card-to-database', {
|
|
24
|
+
title: 'Business card OCR → Normalized → NTA lookup → CRM record',
|
|
25
|
+
description: '名刺 OCR テキストから会社名を抽出し、表記揺れを正規化、国税庁公表サイトで法人番号と本店所在地を確認、最後に CRM 登録用レコードに変換するワークフロー。',
|
|
26
|
+
argsSchema: argsSchema.shape,
|
|
27
|
+
}, (args) => {
|
|
28
|
+
const parsed = argsSchema.parse(args);
|
|
29
|
+
return {
|
|
30
|
+
messages: [
|
|
31
|
+
{
|
|
32
|
+
role: 'user',
|
|
33
|
+
content: {
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: `次の名刺テキストから会社名を抽出し、国税庁公表サイトで確認して ${parsed.target_database_format} フォーマットで出力してください。
|
|
36
|
+
|
|
37
|
+
【名刺テキスト】
|
|
38
|
+
"""
|
|
39
|
+
${parsed.raw_business_card_text}
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
【実行手順】
|
|
43
|
+
|
|
44
|
+
1. 名刺テキストから会社名部分を抽出
|
|
45
|
+
2. normalize_company_name tool を呼び出し、raw_input に抽出した会社名を渡して正規化候補を取得
|
|
46
|
+
3. 正規化候補を confidence 降順で順に search_corporate_by_name tool を呼ぶ (name に候補, search_target に候補の suggested_target)
|
|
47
|
+
4. 住所情報 (都道府県名) が名刺に含まれていれば prefecture フィルタを追加
|
|
48
|
+
5. 最初にヒットした法人について lookup_corporate_by_number tool で詳細を確認
|
|
49
|
+
6. 以下を含むレコードを ${parsed.target_database_format} フォーマットで提示:
|
|
50
|
+
- 法人番号 (13桁)
|
|
51
|
+
- 商号又は名称 (国税庁の正式表記)
|
|
52
|
+
- 本店所在地 (都道府県 + 市区町村 + 丁目番地)
|
|
53
|
+
- 郵便番号
|
|
54
|
+
- 法人種別 (株式会社・有限会社等)
|
|
55
|
+
- フリガナ (ある場合)
|
|
56
|
+
- 英語表記 (ある場合)
|
|
57
|
+
- 登記年月日 (assignment_date)
|
|
58
|
+
- 名刺に書かれていた氏名・役職・メールアドレス・電話番号
|
|
59
|
+
7. 必ず出典 (attribution.data_source + service_disclaimer) を最後に記載
|
|
60
|
+
|
|
61
|
+
【注意】
|
|
62
|
+
- 複数候補がヒットした場合は、住所・業種情報から推定して最尤候補を選択、他候補もオプションとして提示
|
|
63
|
+
- 確信が持てない場合は「要確認」とマークして、ユーザーに選択肢を提示
|
|
64
|
+
- 検索対象除外 (hihyoji=1) の法人は、登記上存在しない住所の可能性があるため明示
|
|
65
|
+
- 登記記録閉鎖済み (close_date が空でない) の法人は注意喚起
|
|
66
|
+
|
|
67
|
+
【出典ルール】
|
|
68
|
+
取得したデータは以下の出典付きで返してください:
|
|
69
|
+
|
|
70
|
+
- data_source: 国税庁法人番号公表サイト (https://www.houjin-bangou.nta.go.jp/)
|
|
71
|
+
- service_disclaimer: このサービスは、国税庁法人番号システム Web-API 機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない。
|
|
72
|
+
- license: 公共データ利用規約 第1.0版
|
|
73
|
+
`,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=business-card-to-database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"business-card-to-database.js","sourceRoot":"","sources":["../../src/prompts/business-card-to-database.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,sBAAsB,EAAE,CAAC;SACtB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,CAAC,wCAAwC,CAAC;IACrD,sBAAsB,EAAE,CAAC;SACtB,IAAI,CAAC,CAAC,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,eAAe,CAAC,CAAC;SAC3E,OAAO,CAAC,eAAe,CAAC;SACxB,QAAQ,CAAC,YAAY,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,UAAU,oCAAoC,CAAC,MAAiB;IACpE,MAAM,CAAC,cAAc,CACnB,2BAA2B,EAC3B;QACE,KAAK,EAAE,0DAA0D;QACjE,WAAW,EACT,kFAAkF;QACpF,UAAU,EAAE,UAAU,CAAC,KAAK;KAC7B,EACD,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,mCAAmC,MAAM,CAAC,sBAAsB;;;;EAIlF,MAAM,CAAC,sBAAsB;;;;;;;;;;gBAUf,MAAM,CAAC,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;CAwB5C;qBACY;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt: customer-master-dedup
|
|
3
|
+
*
|
|
4
|
+
* 顧客マスタの重複検知と法人番号による名寄せワークフロー。
|
|
5
|
+
* 表記揺れのある会社名エントリが同一法人であるかを判定。
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerCustomerMasterDedupPrompt(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=customer-master-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customer-master-dedup.d.ts","sourceRoot":"","sources":["../../src/prompts/customer-master-dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgEzE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt: customer-master-dedup
|
|
3
|
+
*
|
|
4
|
+
* 顧客マスタの重複検知と法人番号による名寄せワークフロー。
|
|
5
|
+
* 表記揺れのある会社名エントリが同一法人であるかを判定。
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
const argsSchema = z.object({
|
|
9
|
+
records: z
|
|
10
|
+
.string()
|
|
11
|
+
.min(1)
|
|
12
|
+
.max(15000)
|
|
13
|
+
.describe('JSON Lines (JSONL) 形式の顧客レコード。各行: {"id":"...","name":"...","address":"..."}'),
|
|
14
|
+
dedup_criteria: z
|
|
15
|
+
.enum(['strict_corporate_number', 'fuzzy_name_address', 'conservative_flag_only'])
|
|
16
|
+
.default('strict_corporate_number')
|
|
17
|
+
.describe('strict_corporate_number=同じ法人番号のみ重複判定 / fuzzy_name_address=名寄せ+住所一致で重複判定 / conservative_flag_only=疑わしきは削除しない'),
|
|
18
|
+
});
|
|
19
|
+
export function registerCustomerMasterDedupPrompt(server) {
|
|
20
|
+
server.registerPrompt('customer-master-dedup', {
|
|
21
|
+
title: 'Customer master dedup via NTA corporate number',
|
|
22
|
+
description: '顧客マスタの重複検知: T7 で表記揺れを吸収し、国税庁法人番号で名寄せ。マージ推奨ペアを提示。',
|
|
23
|
+
argsSchema: argsSchema.shape,
|
|
24
|
+
}, (args) => {
|
|
25
|
+
const parsed = argsSchema.parse(args);
|
|
26
|
+
return {
|
|
27
|
+
messages: [
|
|
28
|
+
{
|
|
29
|
+
role: 'user',
|
|
30
|
+
content: {
|
|
31
|
+
type: 'text',
|
|
32
|
+
text: `以下の顧客レコード (JSONL) の重複を検知し、マージ推奨ペアを提示してください。
|
|
33
|
+
|
|
34
|
+
【顧客レコード】
|
|
35
|
+
"""
|
|
36
|
+
${parsed.records}
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
【重複判定基準】
|
|
40
|
+
${parsed.dedup_criteria}
|
|
41
|
+
|
|
42
|
+
【実行手順】
|
|
43
|
+
|
|
44
|
+
1. 各レコードから会社名 (name) を抽出
|
|
45
|
+
2. normalize_company_name で正規化候補を生成
|
|
46
|
+
3. search_corporate_by_name で上位候補を国税庁照会、法人番号 (corporate_number) を取得
|
|
47
|
+
4. ${parsed.dedup_criteria === 'strict_corporate_number'
|
|
48
|
+
? 'SAME corporate_number を持つレコード群を「確定重複」として扱う'
|
|
49
|
+
: parsed.dedup_criteria === 'fuzzy_name_address'
|
|
50
|
+
? '法人番号 一致 OR 正規化名 + 住所一致 を重複候補とする'
|
|
51
|
+
: '法人番号 一致のみ重複扱い、それ以外は "要確認" として残す'}
|
|
52
|
+
5. 以下を出力:
|
|
53
|
+
- 重複グループ一覧 (各グループ: レコード ID 配列 + 確定法人番号 + マージ推奨の主レコード)
|
|
54
|
+
- 特定できなかったレコード (国税庁に該当なし)
|
|
55
|
+
- 国税庁情報と乖離があるレコード (住所変更歴ありの可能性)
|
|
56
|
+
6. 必ず出典 (attribution.data_source + service_disclaimer) を末尾に明示
|
|
57
|
+
|
|
58
|
+
【マージ推奨ルール】
|
|
59
|
+
|
|
60
|
+
- 最も情報量の多いレコード (メール・電話・住所が揃っている) を主レコードに
|
|
61
|
+
- 国税庁の正式表記を正とする
|
|
62
|
+
- 旧登記住所があれば「履歴」として保持、現行は国税庁の最新で上書き
|
|
63
|
+
- LLM が判断に迷ったら "HUMAN_REVIEW_REQUIRED" フラグを立てる (勝手にマージしない)
|
|
64
|
+
|
|
65
|
+
【Human-in-the-Loop】
|
|
66
|
+
本システムは重複を提案するのみで、実際のマージはユーザーの承認を得てから実施してください。誤マージは顧客データの損失につながる可能性があります。
|
|
67
|
+
|
|
68
|
+
出典: 国税庁法人番号公表サイト(国税庁)https://www.houjin-bangou.nta.go.jp/
|
|
69
|
+
このサービスは、国税庁法人番号システム Web-API 機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない。
|
|
70
|
+
`,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=customer-master-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customer-master-dedup.js","sourceRoot":"","sources":["../../src/prompts/customer-master-dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,KAAK,CAAC;SACV,QAAQ,CACP,4EAA4E,CAC7E;IACH,cAAc,EAAE,CAAC;SACd,IAAI,CAAC,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,wBAAwB,CAAC,CAAC;SACjF,OAAO,CAAC,yBAAyB,CAAC;SAClC,QAAQ,CACP,6GAA6G,CAC9G;CACJ,CAAC,CAAC;AAEH,MAAM,UAAU,iCAAiC,CAAC,MAAiB;IACjE,MAAM,CAAC,cAAc,CACnB,uBAAuB,EACvB;QACE,KAAK,EAAE,gDAAgD;QACvD,WAAW,EACT,kDAAkD;QACpD,UAAU,EAAE,UAAU,CAAC,KAAK;KAC7B,EACD,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;;;;EAIlB,MAAM,CAAC,OAAO;;;;EAId,MAAM,CAAC,cAAc;;;;;;;KAQP,MAAM,CAAC,cAAc,KAAK,yBAAyB;4BACjD,CAAC,CAAC,4CAA4C;4BAC9C,CAAC,CAAC,MAAM,CAAC,cAAc,KAAK,oBAAoB;gCAC9C,CAAC,CAAC,iCAAiC;gCACnC,CAAC,CAAC,iCACR;;;;;;;;;;;;;;;;;;;CAmBb;qBACY;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAI1D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { registerBusinessCardToDatabasePrompt } from './business-card-to-database.js';
|
|
2
|
+
import { registerSalesListEnrichmentPrompt } from './sales-list-enrichment.js';
|
|
3
|
+
import { registerCustomerMasterDedupPrompt } from './customer-master-dedup.js';
|
|
4
|
+
export function registerAllPrompts(server) {
|
|
5
|
+
registerBusinessCardToDatabasePrompt(server);
|
|
6
|
+
registerSalesListEnrichmentPrompt(server);
|
|
7
|
+
registerCustomerMasterDedupPrompt(server);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oCAAoC,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAE/E,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,oCAAoC,CAAC,MAAM,CAAC,CAAC;IAC7C,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAC1C,iCAAiC,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt: sales-list-enrichment
|
|
3
|
+
*
|
|
4
|
+
* 不完全な営業リスト (CSV や Excel) の会社名欄を、
|
|
5
|
+
* 国税庁公表サイトで enrich して完全な法人情報にするワークフロー。
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerSalesListEnrichmentPrompt(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=sales-list-enrichment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sales-list-enrichment.d.ts","sourceRoot":"","sources":["../../src/prompts/sales-list-enrichment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBzE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkEzE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt: sales-list-enrichment
|
|
3
|
+
*
|
|
4
|
+
* 不完全な営業リスト (CSV や Excel) の会社名欄を、
|
|
5
|
+
* 国税庁公表サイトで enrich して完全な法人情報にするワークフロー。
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
const argsSchema = z.object({
|
|
9
|
+
company_names: z
|
|
10
|
+
.string()
|
|
11
|
+
.min(1)
|
|
12
|
+
.max(10000)
|
|
13
|
+
.describe('改行区切りの会社名リスト (最大50件推奨、多すぎるとレート制限に抵触)'),
|
|
14
|
+
prefecture_filter: z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^(?:\d{2}|\d{5})?$/)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('絞り込み用の都道府県コード (2桁 or 5桁 JIS)、不要なら省略'),
|
|
19
|
+
output_format: z
|
|
20
|
+
.enum(['markdown_table', 'csv', 'jsonl'])
|
|
21
|
+
.default('markdown_table')
|
|
22
|
+
.describe('出力形式'),
|
|
23
|
+
});
|
|
24
|
+
export function registerSalesListEnrichmentPrompt(server) {
|
|
25
|
+
server.registerPrompt('sales-list-enrichment', {
|
|
26
|
+
title: 'Bulk sales list → NTA enrichment with attribution',
|
|
27
|
+
description: '不完全な営業リストの会社名を、国税庁公表サイトで一括 enrich し、正確な法人番号・本店所在地を付加したリストを生成する。',
|
|
28
|
+
argsSchema: argsSchema.shape,
|
|
29
|
+
}, (args) => {
|
|
30
|
+
const parsed = argsSchema.parse(args);
|
|
31
|
+
return {
|
|
32
|
+
messages: [
|
|
33
|
+
{
|
|
34
|
+
role: 'user',
|
|
35
|
+
content: {
|
|
36
|
+
type: 'text',
|
|
37
|
+
text: `以下の会社名リストを、国税庁公表サイトの情報で enrich してください。
|
|
38
|
+
|
|
39
|
+
【会社名リスト】
|
|
40
|
+
"""
|
|
41
|
+
${parsed.company_names}
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
${parsed.prefecture_filter !== undefined && parsed.prefecture_filter !== ''
|
|
45
|
+
? `【都道府県フィルタ】\nJIS コード: ${parsed.prefecture_filter}\n`
|
|
46
|
+
: ''}
|
|
47
|
+
|
|
48
|
+
【実行手順】
|
|
49
|
+
|
|
50
|
+
1. リストを会社名ごとに分割
|
|
51
|
+
2. 各会社名について:
|
|
52
|
+
a. normalize_company_name で正規化候補を取得 (1 件あたり最大 3 秒)
|
|
53
|
+
b. 上位候補 1 つで search_corporate_by_name を叩く
|
|
54
|
+
c. ${parsed.prefecture_filter !== undefined && parsed.prefecture_filter !== '' ? `prefecture=${parsed.prefecture_filter} を適用` : '都道府県フィルタなし'}
|
|
55
|
+
d. 1 件ヒットしたら enrich 成功、複数ヒットは上位1件を採用し「要確認」マーク
|
|
56
|
+
e. 0 件なら第 2 候補で再試行
|
|
57
|
+
f. それでも 0 件なら「未特定」マーク
|
|
58
|
+
3. レート制限に配慮し、順次処理 (並列呼出し禁止)
|
|
59
|
+
4. ${parsed.output_format} 形式で出力:
|
|
60
|
+
- 入力会社名 / 法人番号 / 正式名称 / 本店所在地 / 法人種別 / ステータス (enrich 成功/要確認/未特定)
|
|
61
|
+
5. 末尾に出典情報 (attribution) を必ず記載
|
|
62
|
+
|
|
63
|
+
【ヒント】
|
|
64
|
+
- normalize_company_name の suggested_target を素直に使う
|
|
65
|
+
- 結果件数 0 の場合、match_mode を 'partial' にして再試行する価値あり
|
|
66
|
+
- include_closed=true (デフォルト) で登記閉鎖済み法人もヒットさせる
|
|
67
|
+
- 大量処理で 403 エラーが出たら、本 MCP は自動で 30s→1m→5m→30m の指数バックオフを適用する
|
|
68
|
+
|
|
69
|
+
【出力例 (markdown_table)】
|
|
70
|
+
| 入力 | 法人番号 | 正式名称 | 本店所在地 | 状態 |
|
|
71
|
+
|---|---|---|---|---|
|
|
72
|
+
| (株)高橋商事 | 1234567890123 | 株式会社高橋商事 | 鹿児島県鹿児島市... | ✅ |
|
|
73
|
+
| XYZ商事 | - | - | - | ❌ 未特定 |
|
|
74
|
+
|
|
75
|
+
出典: 国税庁法人番号公表サイト(国税庁)https://www.houjin-bangou.nta.go.jp/
|
|
76
|
+
このサービスは、国税庁法人番号システム Web-API 機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない。
|
|
77
|
+
`,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=sales-list-enrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sales-list-enrichment.js","sourceRoot":"","sources":["../../src/prompts/sales-list-enrichment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,KAAK,CAAC;SACV,QAAQ,CAAC,sCAAsC,CAAC;IACnD,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,KAAK,CAAC,oBAAoB,CAAC;SAC3B,QAAQ,EAAE;SACV,QAAQ,CAAC,qCAAqC,CAAC;IAClD,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,CAAC,gBAAgB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;SACxC,OAAO,CAAC,gBAAgB,CAAC;SACzB,QAAQ,CAAC,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,UAAU,iCAAiC,CAAC,MAAiB;IACjE,MAAM,CAAC,cAAc,CACnB,uBAAuB,EACvB;QACE,KAAK,EAAE,mDAAmD;QAC1D,WAAW,EACT,iEAAiE;QACnE,UAAU,EAAE,UAAU,CAAC,KAAK;KAC7B,EACD,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;;;;EAIlB,MAAM,CAAC,aAAa;;;EAIpB,MAAM,CAAC,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,iBAAiB,KAAK,EAAE;4BACvE,CAAC,CAAC,wBAAwB,MAAM,CAAC,iBAAiB,IAAI;4BACtD,CAAC,CAAC,EACN;;;;;;;;QAQQ,MAAM,CAAC,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC,YAAY;;;;;KAK1I,MAAM,CAAC,aAAa;;;;;;;;;;;;;;;;;;CAkBxB;qBACY;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 静的 Resource: `attribution://houjin-bangou`
|
|
3
|
+
* 公式出典文を独立したリソースとして公開
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source: MCP 公式仕様 (Resources)
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerAttributionResource(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=attribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/resources/attribution.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuBnE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 静的 Resource: `attribution://houjin-bangou`
|
|
3
|
+
* 公式出典文を独立したリソースとして公開
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source: MCP 公式仕様 (Resources)
|
|
6
|
+
*/
|
|
7
|
+
import { buildAttribution } from '../domain/corporate-number.js';
|
|
8
|
+
const URI = 'attribution://houjin-bangou';
|
|
9
|
+
export function registerAttributionResource(server) {
|
|
10
|
+
server.registerResource('attribution', URI, {
|
|
11
|
+
title: 'Attribution: NTA Corporate Number Publication Site',
|
|
12
|
+
description: '国税庁 Web-API 機能利用規約 別添1 第6条 + 公共データ利用規約 第1.0版 に基づく出典情報',
|
|
13
|
+
mimeType: 'application/json',
|
|
14
|
+
}, async () => {
|
|
15
|
+
const attribution = buildAttribution();
|
|
16
|
+
return {
|
|
17
|
+
contents: [
|
|
18
|
+
{
|
|
19
|
+
uri: URI,
|
|
20
|
+
mimeType: 'application/json',
|
|
21
|
+
text: JSON.stringify(attribution, null, 2),
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=attribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/resources/attribution.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,GAAG,GAAG,6BAA6B,CAAC;AAE1C,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,GAAG,EACH;QACE,KAAK,EAAE,oDAAoD;QAC3D,WAAW,EACT,uDAAuD;QACzD,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACvC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG;oBACR,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC3C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Template: `corp://{corporate_number}`
|
|
3
|
+
* 法人情報を URI テンプレート経由で参照可能なリソースとして公開
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source: MCP 公式仕様 (Resource Templates)
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import type { NtaClient } from '../api/nta-client.js';
|
|
9
|
+
import type { McpLogger } from '../lib/mcp-logger.js';
|
|
10
|
+
export declare function registerCorporateResourceTemplate(server: McpServer, deps: {
|
|
11
|
+
ntaClient: NtaClient;
|
|
12
|
+
logger: McpLogger;
|
|
13
|
+
}): void;
|
|
14
|
+
//# sourceMappingURL=corporate-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corporate-template.d.ts","sourceRoot":"","sources":["../../src/resources/corporate-template.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAOtD,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAChD,IAAI,CAkGN"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Template: `corp://{corporate_number}`
|
|
3
|
+
* 法人情報を URI テンプレート経由で参照可能なリソースとして公開
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source: MCP 公式仕様 (Resource Templates)
|
|
6
|
+
*/
|
|
7
|
+
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { normalizeAndValidateCorporateNumber } from '../domain/check-digit.js';
|
|
9
|
+
import { buildAttribution } from '../domain/corporate-number.js';
|
|
10
|
+
import { Result } from '../lib/result.js';
|
|
11
|
+
const URI_TEMPLATE = 'corp://{corporate_number}';
|
|
12
|
+
export function registerCorporateResourceTemplate(server, deps) {
|
|
13
|
+
server.registerResource('corporate', new ResourceTemplate(URI_TEMPLATE, {
|
|
14
|
+
list: undefined,
|
|
15
|
+
}), {
|
|
16
|
+
title: 'Japanese corporation by corporate number',
|
|
17
|
+
description: 'URI テンプレート: corp://{corporate_number} で 13桁の法人番号を指定し、法人情報を取得。',
|
|
18
|
+
mimeType: 'application/json',
|
|
19
|
+
}, async (uri, variables) => {
|
|
20
|
+
const rawNumber = Array.isArray(variables['corporate_number'])
|
|
21
|
+
? variables['corporate_number'][0]
|
|
22
|
+
: variables['corporate_number'];
|
|
23
|
+
if (typeof rawNumber !== 'string') {
|
|
24
|
+
throw new Error('Invalid URI: corporate_number variable is missing');
|
|
25
|
+
}
|
|
26
|
+
const validation = normalizeAndValidateCorporateNumber(rawNumber);
|
|
27
|
+
if (!validation.isValid) {
|
|
28
|
+
return {
|
|
29
|
+
contents: [
|
|
30
|
+
{
|
|
31
|
+
uri: uri.href,
|
|
32
|
+
mimeType: 'application/json',
|
|
33
|
+
text: JSON.stringify({
|
|
34
|
+
error: {
|
|
35
|
+
reason: validation.reason,
|
|
36
|
+
message: `Invalid corporate number: ${rawNumber}`,
|
|
37
|
+
},
|
|
38
|
+
attribution: buildAttribution(),
|
|
39
|
+
}, null, 2),
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
deps.logger.info('resource.corporate.read', {
|
|
45
|
+
corporate_number: validation.normalized,
|
|
46
|
+
});
|
|
47
|
+
const result = await deps.ntaClient.lookupByNumber({
|
|
48
|
+
numbers: [validation.normalized],
|
|
49
|
+
history: '0',
|
|
50
|
+
});
|
|
51
|
+
if (Result.isErr(result)) {
|
|
52
|
+
const err = result.error;
|
|
53
|
+
return {
|
|
54
|
+
contents: [
|
|
55
|
+
{
|
|
56
|
+
uri: uri.href,
|
|
57
|
+
mimeType: 'application/json',
|
|
58
|
+
text: JSON.stringify({
|
|
59
|
+
error: {
|
|
60
|
+
code: err.code,
|
|
61
|
+
message: err.message,
|
|
62
|
+
httpStatus: err.httpStatus,
|
|
63
|
+
},
|
|
64
|
+
attribution: buildAttribution(),
|
|
65
|
+
}, null, 2),
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const parsed = result.value;
|
|
71
|
+
const corporation = parsed.corporations[0] ?? null;
|
|
72
|
+
return {
|
|
73
|
+
contents: [
|
|
74
|
+
{
|
|
75
|
+
uri: uri.href,
|
|
76
|
+
mimeType: 'application/json',
|
|
77
|
+
text: JSON.stringify({
|
|
78
|
+
corporation,
|
|
79
|
+
last_update_date: parsed.header.lastUpdateDate,
|
|
80
|
+
attribution: buildAttribution(),
|
|
81
|
+
}, null, 2),
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=corporate-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corporate-template.js","sourceRoot":"","sources":["../../src/resources/corporate-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { NtaClient } from '../api/nta-client.js';
|
|
3
|
+
import type { McpLogger } from '../lib/mcp-logger.js';
|
|
4
|
+
export declare function registerAllResources(server: McpServer, deps: {
|
|
5
|
+
ntaClient: NtaClient;
|
|
6
|
+
logger: McpLogger;
|
|
7
|
+
}): void;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,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;AAKtD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAChD,IAAI,CAIN"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { registerAttributionResource } from './attribution.js';
|
|
2
|
+
import { registerCorporateResourceTemplate } from './corporate-template.js';
|
|
3
|
+
import { registerUiResources } from './ui-resources.js';
|
|
4
|
+
export function registerAllResources(server, deps) {
|
|
5
|
+
registerAttributionResource(server);
|
|
6
|
+
registerCorporateResourceTemplate(server, deps);
|
|
7
|
+
registerUiResources(server);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,IAAiD;IAEjD,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,iCAAiC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChD,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Resources for MCP Apps (v0.2.0 preparation).
|
|
3
|
+
*
|
|
4
|
+
* These resources are display-only shells. Tool metadata will be wired to these
|
|
5
|
+
* resources in v0.2.0 after host compatibility checks.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerUiResources(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=ui-resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-resources.d.ts","sourceRoot":"","sources":["../../src/resources/ui-resources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqC3D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Resources for MCP Apps (v0.2.0 preparation).
|
|
3
|
+
*
|
|
4
|
+
* These resources are display-only shells. Tool metadata will be wired to these
|
|
5
|
+
* resources in v0.2.0 after host compatibility checks.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { registerAppResource, RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
|
|
9
|
+
const UI_RESOURCES = [
|
|
10
|
+
{
|
|
11
|
+
name: 'Corporate Card UI',
|
|
12
|
+
uri: 'ui://corporate-card/mcp-app.html',
|
|
13
|
+
distPath: 'dist/ui/corporate-card/mcp-app.html',
|
|
14
|
+
description: '法人番号検索結果を単一カードとして表示する UI Resource',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'Search Results UI',
|
|
18
|
+
uri: 'ui://search-results/mcp-app.html',
|
|
19
|
+
distPath: 'dist/ui/search-results/mcp-app.html',
|
|
20
|
+
description: '法人名検索結果を一覧表として表示する UI Resource',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
export function registerUiResources(server) {
|
|
24
|
+
for (const resource of UI_RESOURCES) {
|
|
25
|
+
registerAppResource(server, resource.name, resource.uri, {
|
|
26
|
+
title: resource.name,
|
|
27
|
+
description: resource.description,
|
|
28
|
+
}, async () => {
|
|
29
|
+
let html;
|
|
30
|
+
try {
|
|
31
|
+
html = await readFile(resource.distPath, 'utf8');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
html = buildFallbackHtml(resource.name);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
contents: [
|
|
38
|
+
{
|
|
39
|
+
uri: resource.uri,
|
|
40
|
+
mimeType: RESOURCE_MIME_TYPE,
|
|
41
|
+
text: html,
|
|
42
|
+
_meta: {
|
|
43
|
+
ui: {
|
|
44
|
+
csp: {
|
|
45
|
+
resourceDomains: [],
|
|
46
|
+
connectDomains: [],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function buildFallbackHtml(title) {
|
|
57
|
+
return `<!doctype html><html lang="ja"><head><meta charset="UTF-8"><title>${title}</title></head><body><p>${title} is not built yet. Run <code>pnpm build:ui</code>.</p></body></html>`;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=ui-resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-resources.js","sourceRoot":"","sources":["../../src/resources/ui-resources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAGhG,MAAM,YAAY,GAAG;IACnB;QACE,IAAI,EAAE,mBAAmB;QACzB,GAAG,EAAE,kCAAkC;QACvC,QAAQ,EAAE,qCAAqC;QAC/C,WAAW,EAAE,mCAAmC;KACjD;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,GAAG,EAAE,kCAAkC;QACvC,QAAQ,EAAE,qCAAqC;QAC/C,WAAW,EAAE,gCAAgC;KAC9C;CACO,CAAC;AAEX,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,mBAAmB,CACjB,MAAM,EACN,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,GAAG,EACZ;YACE,KAAK,EAAE,QAAQ,CAAC,IAAI;YACpB,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,QAAQ,CAAC,GAAG;wBACjB,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE;4BACL,EAAE,EAAE;gCACF,GAAG,EAAE;oCACH,eAAe,EAAE,EAAE;oCACnB,cAAc,EAAE,EAAE;iCACnB;6BACF;yBACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,qEAAqE,KAAK,2BAA2B,KAAK,sEAAsE,CAAC;AAC1L,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @sugukuru/mcp-houjin-bangou - HTTP entrypoint
|
|
4
|
+
*
|
|
5
|
+
* Express + StreamableHTTPServerTransport (stateless mode)
|
|
6
|
+
*
|
|
7
|
+
* 根拠 / Source:
|
|
8
|
+
* MCP 公式 "Streamable HTTP" transport
|
|
9
|
+
* Transport WG (Dec 2025) stateless direction
|
|
10
|
+
* 国税庁 Web-API 仕様書 第一編 §5 (アプリケーションID)
|
|
11
|
+
*/
|
|
12
|
+
export declare function bootstrap(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAaH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAmI/C"}
|