@sugukuru/mcp-houjin-bangou 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/LICENSE +21 -0
  3. package/README.ja.md +196 -0
  4. package/README.md +198 -0
  5. package/dist/api/csv-parser.d.ts +37 -0
  6. package/dist/api/csv-parser.d.ts.map +1 -0
  7. package/dist/api/csv-parser.js +189 -0
  8. package/dist/api/csv-parser.js.map +1 -0
  9. package/dist/api/nta-client.d.ts +71 -0
  10. package/dist/api/nta-client.d.ts.map +1 -0
  11. package/dist/api/nta-client.js +117 -0
  12. package/dist/api/nta-client.js.map +1 -0
  13. package/dist/api/rate-limiter.d.ts +39 -0
  14. package/dist/api/rate-limiter.d.ts.map +1 -0
  15. package/dist/api/rate-limiter.js +74 -0
  16. package/dist/api/rate-limiter.js.map +1 -0
  17. package/dist/completion/handler.d.ts +19 -0
  18. package/dist/completion/handler.d.ts.map +1 -0
  19. package/dist/completion/handler.js +136 -0
  20. package/dist/completion/handler.js.map +1 -0
  21. package/dist/domain/check-digit.d.ts +47 -0
  22. package/dist/domain/check-digit.d.ts.map +1 -0
  23. package/dist/domain/check-digit.js +91 -0
  24. package/dist/domain/check-digit.js.map +1 -0
  25. package/dist/domain/close-cause-codes.d.ts +28 -0
  26. package/dist/domain/close-cause-codes.d.ts.map +1 -0
  27. package/dist/domain/close-cause-codes.js +27 -0
  28. package/dist/domain/close-cause-codes.js.map +1 -0
  29. package/dist/domain/corporate-number.d.ts +81 -0
  30. package/dist/domain/corporate-number.d.ts.map +1 -0
  31. package/dist/domain/corporate-number.js +88 -0
  32. package/dist/domain/corporate-number.js.map +1 -0
  33. package/dist/domain/invoice-codes.d.ts +142 -0
  34. package/dist/domain/invoice-codes.d.ts.map +1 -0
  35. package/dist/domain/invoice-codes.js +106 -0
  36. package/dist/domain/invoice-codes.js.map +1 -0
  37. package/dist/domain/invoice-number.d.ts +47 -0
  38. package/dist/domain/invoice-number.d.ts.map +1 -0
  39. package/dist/domain/invoice-number.js +71 -0
  40. package/dist/domain/invoice-number.js.map +1 -0
  41. package/dist/domain/kind-codes.d.ts +62 -0
  42. package/dist/domain/kind-codes.d.ts.map +1 -0
  43. package/dist/domain/kind-codes.js +68 -0
  44. package/dist/domain/kind-codes.js.map +1 -0
  45. package/dist/domain/normalizer.d.ts +50 -0
  46. package/dist/domain/normalizer.d.ts.map +1 -0
  47. package/dist/domain/normalizer.js +280 -0
  48. package/dist/domain/normalizer.js.map +1 -0
  49. package/dist/domain/prefecture-codes.d.ts +61 -0
  50. package/dist/domain/prefecture-codes.d.ts.map +1 -0
  51. package/dist/domain/prefecture-codes.js +67 -0
  52. package/dist/domain/prefecture-codes.js.map +1 -0
  53. package/dist/domain/process-codes.d.ts +52 -0
  54. package/dist/domain/process-codes.d.ts.map +1 -0
  55. package/dist/domain/process-codes.js +28 -0
  56. package/dist/domain/process-codes.js.map +1 -0
  57. package/dist/lib/env.d.ts +35 -0
  58. package/dist/lib/env.d.ts.map +1 -0
  59. package/dist/lib/env.js +40 -0
  60. package/dist/lib/env.js.map +1 -0
  61. package/dist/lib/errors.d.ts +47 -0
  62. package/dist/lib/errors.d.ts.map +1 -0
  63. package/dist/lib/errors.js +92 -0
  64. package/dist/lib/errors.js.map +1 -0
  65. package/dist/lib/mcp-logger.d.ts +29 -0
  66. package/dist/lib/mcp-logger.d.ts.map +1 -0
  67. package/dist/lib/mcp-logger.js +98 -0
  68. package/dist/lib/mcp-logger.js.map +1 -0
  69. package/dist/lib/pagination.d.ts +28 -0
  70. package/dist/lib/pagination.d.ts.map +1 -0
  71. package/dist/lib/pagination.js +48 -0
  72. package/dist/lib/pagination.js.map +1 -0
  73. package/dist/lib/result.d.ts +29 -0
  74. package/dist/lib/result.d.ts.map +1 -0
  75. package/dist/lib/result.js +36 -0
  76. package/dist/lib/result.js.map +1 -0
  77. package/dist/lib/trace-context.d.ts +36 -0
  78. package/dist/lib/trace-context.d.ts.map +1 -0
  79. package/dist/lib/trace-context.js +77 -0
  80. package/dist/lib/trace-context.js.map +1 -0
  81. package/dist/mcp.d.ts +9 -0
  82. package/dist/mcp.d.ts.map +1 -0
  83. package/dist/mcp.js +54 -0
  84. package/dist/mcp.js.map +1 -0
  85. package/dist/prompts/business-card-to-database.d.ts +12 -0
  86. package/dist/prompts/business-card-to-database.d.ts.map +1 -0
  87. package/dist/prompts/business-card-to-database.js +80 -0
  88. package/dist/prompts/business-card-to-database.js.map +1 -0
  89. package/dist/prompts/customer-master-dedup.d.ts +9 -0
  90. package/dist/prompts/customer-master-dedup.d.ts.map +1 -0
  91. package/dist/prompts/customer-master-dedup.js +77 -0
  92. package/dist/prompts/customer-master-dedup.js.map +1 -0
  93. package/dist/prompts/index.d.ts +3 -0
  94. package/dist/prompts/index.d.ts.map +1 -0
  95. package/dist/prompts/index.js +9 -0
  96. package/dist/prompts/index.js.map +1 -0
  97. package/dist/prompts/sales-list-enrichment.d.ts +9 -0
  98. package/dist/prompts/sales-list-enrichment.d.ts.map +1 -0
  99. package/dist/prompts/sales-list-enrichment.js +84 -0
  100. package/dist/prompts/sales-list-enrichment.js.map +1 -0
  101. package/dist/resources/attribution.d.ts +9 -0
  102. package/dist/resources/attribution.d.ts.map +1 -0
  103. package/dist/resources/attribution.js +27 -0
  104. package/dist/resources/attribution.js.map +1 -0
  105. package/dist/resources/corporate-template.d.ts +14 -0
  106. package/dist/resources/corporate-template.d.ts.map +1 -0
  107. package/dist/resources/corporate-template.js +87 -0
  108. package/dist/resources/corporate-template.js.map +1 -0
  109. package/dist/resources/index.d.ts +8 -0
  110. package/dist/resources/index.d.ts.map +1 -0
  111. package/dist/resources/index.js +9 -0
  112. package/dist/resources/index.js.map +1 -0
  113. package/dist/resources/ui-resources.d.ts +9 -0
  114. package/dist/resources/ui-resources.d.ts.map +1 -0
  115. package/dist/resources/ui-resources.js +59 -0
  116. package/dist/resources/ui-resources.js.map +1 -0
  117. package/dist/server.d.ts +13 -0
  118. package/dist/server.d.ts.map +1 -0
  119. package/dist/server.js +217 -0
  120. package/dist/server.js.map +1 -0
  121. package/dist/tools/get-attribution.d.ts +25 -0
  122. package/dist/tools/get-attribution.d.ts.map +1 -0
  123. package/dist/tools/get-attribution.js +120 -0
  124. package/dist/tools/get-attribution.js.map +1 -0
  125. package/dist/tools/index.d.ts +12 -0
  126. package/dist/tools/index.d.ts.map +1 -0
  127. package/dist/tools/index.js +16 -0
  128. package/dist/tools/index.js.map +1 -0
  129. package/dist/tools/lookup-by-number.d.ts +82 -0
  130. package/dist/tools/lookup-by-number.d.ts.map +1 -0
  131. package/dist/tools/lookup-by-number.js +157 -0
  132. package/dist/tools/lookup-by-number.js.map +1 -0
  133. package/dist/tools/normalize-company-name.d.ts +60 -0
  134. package/dist/tools/normalize-company-name.d.ts.map +1 -0
  135. package/dist/tools/normalize-company-name.js +130 -0
  136. package/dist/tools/normalize-company-name.js.map +1 -0
  137. package/dist/tools/search-by-name.d.ts +96 -0
  138. package/dist/tools/search-by-name.d.ts.map +1 -0
  139. package/dist/tools/search-by-name.js +176 -0
  140. package/dist/tools/search-by-name.js.map +1 -0
  141. package/dist/tools/validate-check-digit.d.ts +35 -0
  142. package/dist/tools/validate-check-digit.d.ts.map +1 -0
  143. package/dist/tools/validate-check-digit.js +105 -0
  144. package/dist/tools/validate-check-digit.js.map +1 -0
  145. package/dist/ui/corporate-card/mcp-app.html +157 -0
  146. package/dist/ui/search-results/mcp-app.html +158 -0
  147. package/dist/version.d.ts +6 -0
  148. package/dist/version.d.ts.map +1 -0
  149. package/dist/version.js +6 -0
  150. package/dist/version.js.map +1 -0
  151. package/package.json +96 -0
package/dist/server.js ADDED
@@ -0,0 +1,217 @@
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
+ import express from 'express';
13
+ import cors from 'cors';
14
+ import helmet from 'helmet';
15
+ import pino from 'pino';
16
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
17
+ import { randomUUID } from 'node:crypto';
18
+ import { getEnv } from './lib/env.js';
19
+ import { createNtaClient } from './api/nta-client.js';
20
+ import { createServer } from './mcp.js';
21
+ import { VERSION } from './version.js';
22
+ export async function bootstrap() {
23
+ const env = getEnv();
24
+ const logger = pino({
25
+ level: env.LOG_LEVEL,
26
+ redact: {
27
+ paths: [
28
+ 'req.headers.authorization',
29
+ 'req.headers["x-api-key"]',
30
+ 'req.query.id',
31
+ 'NTA_APPLICATION_ID',
32
+ ],
33
+ censor: '***REDACTED***',
34
+ },
35
+ formatters: {
36
+ level: (label) => ({ level: label }),
37
+ },
38
+ });
39
+ const ntaClient = createNtaClient({
40
+ applicationId: env.NTA_APPLICATION_ID,
41
+ baseUrl: env.NTA_BASE_URL,
42
+ timeoutMs: env.NTA_TIMEOUT_MS,
43
+ rps: env.NTA_RATE_LIMIT_RPS,
44
+ userAgent: `@sugukuru/mcp-houjin-bangou/${VERSION}`,
45
+ onBackoff: (waitMs) => {
46
+ logger.warn({ waitMs }, 'NTA API rate limit hit, backoff applied');
47
+ },
48
+ });
49
+ const app = express();
50
+ app.disable('x-powered-by');
51
+ app.use(helmet({
52
+ contentSecurityPolicy: {
53
+ useDefaults: false,
54
+ directives: {
55
+ defaultSrc: ["'none'"],
56
+ connectSrc: ["'self'"],
57
+ baseUri: ["'self'"],
58
+ formAction: ["'none'"],
59
+ frameAncestors: ["'none'"],
60
+ },
61
+ },
62
+ }));
63
+ app.use(cors({ origin: true, credentials: false }));
64
+ app.use(express.json({ limit: '64kb' }));
65
+ app.use((req, _res, next) => {
66
+ req.id = randomUUID();
67
+ next();
68
+ });
69
+ // Health check
70
+ app.get('/health', (_req, res) => {
71
+ res.status(200).json({
72
+ status: 'ok',
73
+ version: VERSION,
74
+ nta_api_version: 'Ver.4.0',
75
+ timestamp: new Date().toISOString(),
76
+ });
77
+ });
78
+ // Server Card (SEP-2127 Draft + Transport WG Dec 2025)
79
+ app.get('/.well-known/mcp.json', (_req, res) => {
80
+ res.status(200).json(buildServerCard());
81
+ });
82
+ // MCP endpoint
83
+ app.post('/mcp', async (req, res) => {
84
+ try {
85
+ const mcpServer = createServer({ ntaClient });
86
+ const transport = new StreamableHTTPServerTransport({
87
+ sessionIdGenerator: undefined, // stateless mode
88
+ enableJsonResponse: true,
89
+ });
90
+ res.on('close', () => {
91
+ void transport.close();
92
+ void mcpServer.close();
93
+ });
94
+ await mcpServer.connect(transport);
95
+ await transport.handleRequest(req, res, req.body);
96
+ }
97
+ catch (err) {
98
+ logger.error({ err }, 'MCP request handling failed');
99
+ if (!res.headersSent) {
100
+ res.status(500).json({
101
+ jsonrpc: '2.0',
102
+ error: { code: -32603, message: 'Internal server error' },
103
+ id: null,
104
+ });
105
+ }
106
+ }
107
+ });
108
+ // Reject GET /mcp and DELETE /mcp in stateless mode
109
+ app.get('/mcp', (_req, res) => {
110
+ res.status(405).json({
111
+ jsonrpc: '2.0',
112
+ error: { code: -32000, message: 'Method not allowed (stateless mode, use POST)' },
113
+ id: null,
114
+ });
115
+ });
116
+ app.delete('/mcp', (_req, res) => {
117
+ res.status(405).json({
118
+ jsonrpc: '2.0',
119
+ error: { code: -32000, message: 'Method not allowed (stateless mode)' },
120
+ id: null,
121
+ });
122
+ });
123
+ // Generic error handler
124
+ app.use((err, req, res, _next) => {
125
+ logger.error({ err, reqId: req.id }, 'unhandled error');
126
+ if (!res.headersSent) {
127
+ res.status(500).json({ error: 'internal_error' });
128
+ }
129
+ });
130
+ app.listen(env.PORT, () => {
131
+ logger.info({
132
+ port: env.PORT,
133
+ version: VERSION,
134
+ nodeEnv: env.NODE_ENV,
135
+ mcpEndpoint: `http://localhost:${env.PORT}/mcp`,
136
+ serverCardEndpoint: `http://localhost:${env.PORT}/.well-known/mcp.json`,
137
+ }, '@sugukuru/mcp-houjin-bangou listening');
138
+ });
139
+ }
140
+ function buildServerCard() {
141
+ return {
142
+ name: '@sugukuru/mcp-houjin-bangou',
143
+ version: VERSION,
144
+ description: 'MCP server for Japan National Tax Agency Corporate Number Web-API (Ver.4.0). Read-only, anonymous, full 7-primitive activation.',
145
+ protocol_version: '2025-11-25',
146
+ homepage: 'https://github.com/sugukurukabe/mcp-houjin-bangou',
147
+ transport: {
148
+ type: 'streamable-http',
149
+ endpoint: '/mcp',
150
+ stateless: true,
151
+ },
152
+ authentication: {
153
+ required: false,
154
+ note: 'Anonymous read-only access. v0.5.0 Hosted edition will add OAuth Client Credentials and Enterprise-Managed Authorization (ID-JAG).',
155
+ },
156
+ capabilities: {
157
+ tools: { listChanged: true },
158
+ resources: { listChanged: true, subscribe: false },
159
+ prompts: { listChanged: true },
160
+ completions: {},
161
+ logging: {},
162
+ },
163
+ primitives: {
164
+ tools: [
165
+ 'lookup_corporate_by_number',
166
+ 'search_corporate_by_name',
167
+ 'validate_corporate_number',
168
+ 'normalize_company_name',
169
+ 'get_attribution',
170
+ ],
171
+ prompts: ['business-card-to-database', 'sales-list-enrichment', 'customer-master-dedup'],
172
+ resource_templates: ['corp://{corporate_number}'],
173
+ resources: [
174
+ 'attribution://houjin-bangou',
175
+ 'ui://corporate-card/mcp-app.html',
176
+ 'ui://search-results/mcp-app.html',
177
+ ],
178
+ },
179
+ attribution: {
180
+ data_source: '国税庁法人番号公表サイト (https://www.houjin-bangou.nta.go.jp/)',
181
+ license: '公共データ利用規約 第1.0版',
182
+ api_version: 'Ver.4.0',
183
+ },
184
+ maintainer: {
185
+ name: 'Sugukuru K.K.',
186
+ email: 'engineering@sugukuru.co.jp',
187
+ location: 'Kagoshima, Japan',
188
+ },
189
+ license: 'MIT',
190
+ // プロンプトインジェクション防御メタデータ
191
+ safety: {
192
+ read_only: true,
193
+ destructive_operations: [],
194
+ prompt_injection_mitigations: [
195
+ 'static_tool_descriptions',
196
+ 'no_runtime_schema_mutation',
197
+ 'application_id_only_from_env',
198
+ 'attribution_required_on_all_outputs',
199
+ ],
200
+ },
201
+ specs_referenced: [
202
+ 'MCP 2025-11-25',
203
+ 'SEP-2127 Server Card (Draft)',
204
+ 'SEP-1303 Input Validation as Tool Errors',
205
+ 'SEP-986 Tool Name Format',
206
+ 'RFC 5424 (Logging severity)',
207
+ ],
208
+ };
209
+ }
210
+ const isMainModule = import.meta.url === `file://${process.argv[1]}`;
211
+ if (isMainModule) {
212
+ bootstrap().catch((err) => {
213
+ process.stderr.write(`bootstrap failed: ${err instanceof Error ? err.stack : String(err)}\n`);
214
+ process.exit(1);
215
+ });
216
+ }
217
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * T6: get_attribution
3
+ * 国税庁 Web-API 機能利用規約 別添1 第6条 + 公共データ利用規約 第1.0版 の出典文を返却
4
+ *
5
+ * 根拠 / Source:
6
+ * 国税庁仕様書 第一編 別添1 第6条 (情報の取得元の明示義務)
7
+ * 国税庁仕様書 第一編 別添3 公共データ利用規約 第1.0版 (コンテンツ利用)
8
+ */
9
+ import { z } from 'zod';
10
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
11
+ declare const OutputSchema: z.ZodObject<{
12
+ attribution: z.ZodObject<{
13
+ data_source: z.ZodString;
14
+ service_disclaimer: z.ZodString;
15
+ license: z.ZodLiteral<"公共データ利用規約 第1.0版">;
16
+ api_version: z.ZodLiteral<"Ver.4.0">;
17
+ accessed_at: z.ZodString;
18
+ }, z.core.$strip>;
19
+ formatted_text: z.ZodString;
20
+ usage_guidance: z.ZodString;
21
+ }, z.core.$strict>;
22
+ export type GetAttributionOutput = z.infer<typeof OutputSchema>;
23
+ export declare function registerGetAttributionTool(server: McpServer): void;
24
+ export {};
25
+ //# sourceMappingURL=get-attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-attribution.d.ts","sourceRoot":"","sources":["../../src/tools/get-attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,QAAA,MAAM,YAAY;;;;;;;;;;kBAQP,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAgBhE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsFlE"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * T6: get_attribution
3
+ * 国税庁 Web-API 機能利用規約 別添1 第6条 + 公共データ利用規約 第1.0版 の出典文を返却
4
+ *
5
+ * 根拠 / Source:
6
+ * 国税庁仕様書 第一編 別添1 第6条 (情報の取得元の明示義務)
7
+ * 国税庁仕様書 第一編 別添3 公共データ利用規約 第1.0版 (コンテンツ利用)
8
+ */
9
+ import { z } from 'zod';
10
+ import { AttributionSchema, buildAttribution } from '../domain/corporate-number.js';
11
+ const InputSchema = z
12
+ .object({
13
+ format: z
14
+ .enum(['full', 'short', 'citation'])
15
+ .default('full')
16
+ .describe('full=完全版 (全5フィールド), short=1行テキスト, citation=「出典: ...」形式の引用文'),
17
+ language: z.enum(['ja', 'en']).default('ja'),
18
+ })
19
+ .strict();
20
+ const OutputSchema = z
21
+ .object({
22
+ attribution: AttributionSchema,
23
+ formatted_text: z.string().describe('format パラメータに応じた整形済み文字列'),
24
+ usage_guidance: z
25
+ .string()
26
+ .describe('本 MCP の結果を下流のサービス・画面で表示する際の出典明示ガイダンス'),
27
+ })
28
+ .strict();
29
+ const DESCRIPTION = `国税庁法人番号公表サイト (Web-API 機能) の公式出典文を返します。本 MCP サーバーから取得した情報を下流のアプリケーション・ドキュメント・プレゼンテーション等で使用する際の明示必須文言を提供。
30
+
31
+ USE THIS WHEN:
32
+ - MCP から取得した法人情報を自社サービスで表示する前に、正しい出典文を取得したい
33
+ - 利用規約遵守のための指定文言を確認したい
34
+ - 報告書・プレゼン・Web ページに掲載する際の出典クレジットを生成したい
35
+
36
+ DO NOT USE WHEN:
37
+ - 法人番号や法人名を検索したい → 他の tool を使う (各 tool の出力に既に attribution が含まれる)
38
+
39
+ 根拠:
40
+ - Web-API 機能利用規約 別添1 第6条: 取得情報をもとにしたサービス提供時の指定文言を明示する義務
41
+ - 公共データ利用規約 第1.0版 (別添3): 出典の記載 + 加工時の明示`;
42
+ export function registerGetAttributionTool(server) {
43
+ server.registerTool('get_attribution', {
44
+ title: 'Get required attribution text for NTA Web-API usage',
45
+ description: DESCRIPTION,
46
+ inputSchema: InputSchema.shape,
47
+ outputSchema: OutputSchema.shape,
48
+ annotations: {
49
+ title: 'Get required attribution text for NTA Web-API usage',
50
+ readOnlyHint: true,
51
+ destructiveHint: false,
52
+ idempotentHint: true,
53
+ openWorldHint: false,
54
+ },
55
+ }, async (args) => {
56
+ const input = InputSchema.parse(args);
57
+ const attribution = buildAttribution();
58
+ let formattedText;
59
+ switch (input.format) {
60
+ case 'full':
61
+ formattedText =
62
+ input.language === 'ja'
63
+ ? [
64
+ `出典: ${attribution.data_source}`,
65
+ `免責: ${attribution.service_disclaimer}`,
66
+ `ライセンス: ${attribution.license}`,
67
+ `API バージョン: ${attribution.api_version}`,
68
+ `アクセス日時: ${attribution.accessed_at}`,
69
+ ].join('\n')
70
+ : [
71
+ `Source: ${attribution.data_source}`,
72
+ `Disclaimer: ${attribution.service_disclaimer}`,
73
+ `License: ${attribution.license}`,
74
+ `API Version: ${attribution.api_version}`,
75
+ `Accessed At: ${attribution.accessed_at}`,
76
+ ].join('\n');
77
+ break;
78
+ case 'short':
79
+ formattedText =
80
+ input.language === 'ja'
81
+ ? '出典: 国税庁法人番号公表サイト (公共データ利用規約 第1.0版)'
82
+ : 'Source: NTA Corporate Number Publication Site (Japanese Public Data License v1.0)';
83
+ break;
84
+ case 'citation':
85
+ formattedText =
86
+ input.language === 'ja'
87
+ ? `出典: ${attribution.data_source}`
88
+ : `Source: ${attribution.data_source}`;
89
+ break;
90
+ }
91
+ const guidance = input.language === 'ja'
92
+ ? [
93
+ '本 MCP の出力を自社サービスで利用する際は、Web-API 機能利用規約 別添1 第6条に基づき',
94
+ 'サービスのいずれかの箇所に service_disclaimer の文言を明示してください。',
95
+ 'また、公共データ利用規約 第1.0版 別添3 に基づき data_source の出典を記載してください。',
96
+ '加工利用する場合は「○○を加工して作成」と併記してください。',
97
+ ].join(' ')
98
+ : [
99
+ 'When using this MCP output in downstream services, per Article 6 of NTA Web-API Terms Annex 1,',
100
+ 'display the service_disclaimer text somewhere in your service.',
101
+ 'Per Japanese Public Data License v1.0 (Annex 3), cite data_source as the source.',
102
+ 'If modified, annotate as "Created by modifying [data_source]".',
103
+ ].join(' ');
104
+ const output = {
105
+ attribution,
106
+ formatted_text: formattedText,
107
+ usage_guidance: guidance,
108
+ };
109
+ return {
110
+ content: [
111
+ {
112
+ type: 'text',
113
+ text: JSON.stringify(output, null, 2),
114
+ },
115
+ ],
116
+ structuredContent: output,
117
+ };
118
+ });
119
+ }
120
+ //# sourceMappingURL=get-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-attribution.js","sourceRoot":"","sources":["../../src/tools/get-attribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tool registration orchestrator
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { NtaClient } from '../api/nta-client.js';
6
+ import type { McpLogger } from '../lib/mcp-logger.js';
7
+ export interface ToolDeps {
8
+ ntaClient: NtaClient;
9
+ logger: McpLogger;
10
+ }
11
+ export declare function registerAllTools(server: McpServer, deps: ToolDeps): void;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,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;AAOtD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAMxE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tool registration orchestrator
3
+ */
4
+ import { registerLookupByNumberTool } from './lookup-by-number.js';
5
+ import { registerSearchByNameTool } from './search-by-name.js';
6
+ import { registerValidateCheckDigitTool } from './validate-check-digit.js';
7
+ import { registerGetAttributionTool } from './get-attribution.js';
8
+ import { registerNormalizeCompanyNameTool } from './normalize-company-name.js';
9
+ export function registerAllTools(server, deps) {
10
+ registerLookupByNumberTool(server, deps);
11
+ registerSearchByNameTool(server, deps);
12
+ registerValidateCheckDigitTool(server);
13
+ registerGetAttributionTool(server);
14
+ registerNormalizeCompanyNameTool(server);
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAO/E,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,IAAc;IAChE,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,gCAAgC,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * T1: lookup_corporate_by_number
3
+ * 13桁の法人番号で法人情報を取得 (最大10件カンマ区切り)
4
+ *
5
+ * 根拠 / Source: 国税庁仕様書 第六編 §2, 第二編 §2
6
+ * エンドポイント: GET /4/num?id=...&number=...&type=02&history=0|1
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
+ corporate_numbers: z.ZodArray<z.ZodString>;
14
+ include_history: z.ZodDefault<z.ZodBoolean>;
15
+ language: z.ZodDefault<z.ZodEnum<{
16
+ ja: "ja";
17
+ en: "en";
18
+ }>>;
19
+ }, z.core.$strict>;
20
+ declare const OutputSchema: z.ZodObject<{
21
+ corporations: z.ZodArray<z.ZodObject<{
22
+ corporate_number: z.ZodString;
23
+ sequence_number: z.ZodNumber;
24
+ process: z.ZodString;
25
+ correct: z.ZodEnum<{
26
+ 0: "0";
27
+ 1: "1";
28
+ }>;
29
+ update_date: z.ZodString;
30
+ change_date: z.ZodString;
31
+ name: z.ZodString;
32
+ name_image_id: z.ZodString;
33
+ kind: z.ZodString;
34
+ prefecture_name: z.ZodString;
35
+ city_name: z.ZodString;
36
+ street_number: z.ZodString;
37
+ address_image_id: z.ZodString;
38
+ prefecture_code: z.ZodString;
39
+ city_code: z.ZodString;
40
+ post_code: z.ZodString;
41
+ address_outside: z.ZodString;
42
+ address_outside_image_id: z.ZodString;
43
+ close_date: z.ZodString;
44
+ close_cause: z.ZodString;
45
+ successor_corporate_number: z.ZodString;
46
+ change_cause: z.ZodString;
47
+ assignment_date: z.ZodString;
48
+ latest: z.ZodEnum<{
49
+ 0: "0";
50
+ 1: "1";
51
+ }>;
52
+ en_name: z.ZodString;
53
+ en_prefecture_name: z.ZodString;
54
+ en_city_name: z.ZodString;
55
+ en_address_outside: z.ZodString;
56
+ furigana: z.ZodString;
57
+ hihyoji: z.ZodEnum<{
58
+ 0: "0";
59
+ 1: "1";
60
+ }>;
61
+ }, z.core.$strip>>;
62
+ not_found: z.ZodArray<z.ZodString>;
63
+ invalid_inputs: z.ZodArray<z.ZodObject<{
64
+ input: z.ZodString;
65
+ reason: z.ZodString;
66
+ }, z.core.$strip>>;
67
+ attribution: z.ZodObject<{
68
+ data_source: z.ZodString;
69
+ service_disclaimer: z.ZodString;
70
+ license: z.ZodLiteral<"公共データ利用規約 第1.0版">;
71
+ api_version: z.ZodLiteral<"Ver.4.0">;
72
+ accessed_at: z.ZodString;
73
+ }, z.core.$strip>;
74
+ }, z.core.$strict>;
75
+ export type LookupByNumberInput = z.infer<typeof InputSchema>;
76
+ export type LookupByNumberOutput = z.infer<typeof OutputSchema>;
77
+ export declare function registerLookupByNumberTool(server: McpServer, deps: {
78
+ ntaClient: NtaClient;
79
+ logger: McpLogger;
80
+ }): void;
81
+ export {};
82
+ //# sourceMappingURL=lookup-by-number.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup-by-number.d.ts","sourceRoot":"","sources":["../../src/tools/lookup-by-number.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;;;;;;;kBAgBN,CAAC;AAEZ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAcP,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAC9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAgBhE,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAChD,IAAI,CAqHN"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * T1: lookup_corporate_by_number
3
+ * 13桁の法人番号で法人情報を取得 (最大10件カンマ区切り)
4
+ *
5
+ * 根拠 / Source: 国税庁仕様書 第六編 §2, 第二編 §2
6
+ * エンドポイント: GET /4/num?id=...&number=...&type=02&history=0|1
7
+ */
8
+ import { z } from 'zod';
9
+ import { AttributionSchema, CorporationSchema, buildAttribution, } from '../domain/corporate-number.js';
10
+ import { normalizeAndValidateCorporateNumber } from '../domain/check-digit.js';
11
+ import { Result } from '../lib/result.js';
12
+ const InputSchema = z
13
+ .object({
14
+ corporate_numbers: z
15
+ .array(z.string().min(1))
16
+ .min(1)
17
+ .max(10)
18
+ .describe('13桁の法人番号 (最大10件)。半角数字必須。ハイフン・空白は自動除去されます。'),
19
+ include_history: z
20
+ .boolean()
21
+ .default(false)
22
+ .describe('変更履歴 (商号変更・所在地変更等) を含めるか。デフォルト false。'),
23
+ language: z
24
+ .enum(['ja', 'en'])
25
+ .default('ja')
26
+ .describe('ラベル言語 (住所等のデータ値は API のまま、ラベルのみ切替)。'),
27
+ })
28
+ .strict();
29
+ const OutputSchema = z
30
+ .object({
31
+ corporations: z.array(CorporationSchema),
32
+ not_found: z.array(z.string()).describe('該当が見つからなかった法人番号のリスト。'),
33
+ invalid_inputs: z
34
+ .array(z.object({
35
+ input: z.string(),
36
+ reason: z.string(),
37
+ }))
38
+ .describe('入力エラーの詳細 (SEP-1303 準拠、ツール実行エラーとして返却)。'),
39
+ attribution: AttributionSchema,
40
+ })
41
+ .strict();
42
+ const DESCRIPTION = `法人番号 (13桁) を指定して国税庁公表サイトから法人情報を取得します。最大10件カンマ区切りで一括取得可能。チェックデジット検証をローカルで事前実施し、無効な番号は API を叩かず弾きます。
43
+
44
+ USE THIS WHEN:
45
+ - ユーザーが法人番号 (13桁の数字、例: 1340001023456) を知っていて、社名・住所・登記日を知りたい
46
+ - 名刺・契約書・請求書に記載された法人番号が有効か確認したい
47
+ - 複数の法人番号を一括で検証・情報取得したい (最大10件)
48
+
49
+ DO NOT USE WHEN:
50
+ - 会社名しか分からない → search_corporate_by_name を使う
51
+ - 番号が有効かだけ確認したい (API 呼出不要) → validate_corporate_number を使う
52
+ - 表記揺れを含む会社名から検索したい → normalize_company_name で候補化してから search_corporate_by_name
53
+
54
+ 根拠: 国税庁 法人番号 Web-API 仕様書 第六編 §2「法人番号を指定して情報を取得する機能」`;
55
+ export function registerLookupByNumberTool(server, deps) {
56
+ server.registerTool('lookup_corporate_by_number', {
57
+ title: 'Lookup Japanese corporation by national corporate number',
58
+ description: DESCRIPTION,
59
+ inputSchema: InputSchema.shape,
60
+ outputSchema: OutputSchema.shape,
61
+ _meta: {
62
+ ui: { resourceUri: 'ui://corporate-card/mcp-app.html' },
63
+ },
64
+ annotations: {
65
+ title: 'Lookup Japanese corporation by national corporate number',
66
+ readOnlyHint: true,
67
+ destructiveHint: false,
68
+ idempotentHint: true,
69
+ openWorldHint: true,
70
+ },
71
+ }, async (args) => {
72
+ const input = InputSchema.parse(args);
73
+ const validInputs = [];
74
+ const invalidInputs = [];
75
+ for (const raw of input.corporate_numbers) {
76
+ const result = normalizeAndValidateCorporateNumber(raw);
77
+ if (result.isValid) {
78
+ validInputs.push(result.normalized);
79
+ }
80
+ else {
81
+ invalidInputs.push({
82
+ input: raw,
83
+ reason: result.reason,
84
+ });
85
+ }
86
+ }
87
+ if (validInputs.length === 0) {
88
+ const output = {
89
+ corporations: [],
90
+ not_found: [],
91
+ invalid_inputs: invalidInputs,
92
+ attribution: buildAttribution(),
93
+ };
94
+ return {
95
+ isError: true,
96
+ content: [
97
+ {
98
+ type: 'text',
99
+ text: JSON.stringify(output, null, 2),
100
+ },
101
+ ],
102
+ structuredContent: output,
103
+ };
104
+ }
105
+ deps.logger.info('tool.lookup_corporate_by_number', {
106
+ count: validInputs.length,
107
+ include_history: input.include_history,
108
+ });
109
+ const apiResult = await deps.ntaClient.lookupByNumber({
110
+ numbers: validInputs,
111
+ history: input.include_history ? '1' : '0',
112
+ });
113
+ if (Result.isErr(apiResult)) {
114
+ const err = apiResult.error;
115
+ deps.logger.error('tool.lookup_corporate_by_number.api_error', {
116
+ code: err.code,
117
+ httpStatus: err.httpStatus,
118
+ message: err.message,
119
+ });
120
+ return {
121
+ isError: true,
122
+ content: [
123
+ {
124
+ type: 'text',
125
+ text: JSON.stringify({
126
+ error: {
127
+ code: err.code,
128
+ message: err.message,
129
+ httpStatus: err.httpStatus,
130
+ },
131
+ attribution: buildAttribution(),
132
+ }, null, 2),
133
+ },
134
+ ],
135
+ };
136
+ }
137
+ const parsed = apiResult.value;
138
+ const foundNumbers = new Set(parsed.corporations.map((c) => c.corporate_number));
139
+ const notFound = validInputs.filter((n) => !foundNumbers.has(n));
140
+ const output = {
141
+ corporations: parsed.corporations,
142
+ not_found: notFound,
143
+ invalid_inputs: invalidInputs,
144
+ attribution: buildAttribution(),
145
+ };
146
+ return {
147
+ content: [
148
+ {
149
+ type: 'text',
150
+ text: JSON.stringify(output, null, 2),
151
+ },
152
+ ],
153
+ structuredContent: output,
154
+ };
155
+ });
156
+ }
157
+ //# sourceMappingURL=lookup-by-number.js.map