@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,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 型付きエラー階層
|
|
3
|
+
* Typed error hierarchy
|
|
4
|
+
* Hierarki error bertipe
|
|
5
|
+
*
|
|
6
|
+
* 根拠: SEP-1303 Input Validation Errors as Tool Execution Errors
|
|
7
|
+
* → バリデーション失敗は JSON-RPC エラーではなく tool 結果 (isError: true) として返す
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 国税庁 API 由来のエラー
|
|
11
|
+
* Error originating from NTA Web-API
|
|
12
|
+
*/
|
|
13
|
+
export class NtaApiError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
httpStatus;
|
|
16
|
+
ntaErrorCode;
|
|
17
|
+
name = 'NtaApiError';
|
|
18
|
+
constructor(message, code, httpStatus, ntaErrorCode) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.code = code;
|
|
21
|
+
this.httpStatus = httpStatus;
|
|
22
|
+
this.ntaErrorCode = ntaErrorCode;
|
|
23
|
+
}
|
|
24
|
+
static fromHttpStatus(status, body) {
|
|
25
|
+
let code;
|
|
26
|
+
switch (status) {
|
|
27
|
+
case 400:
|
|
28
|
+
code = 'http_400';
|
|
29
|
+
break;
|
|
30
|
+
case 403:
|
|
31
|
+
code = 'http_403';
|
|
32
|
+
break;
|
|
33
|
+
case 404:
|
|
34
|
+
code = 'http_404';
|
|
35
|
+
break;
|
|
36
|
+
case 500:
|
|
37
|
+
code = 'http_500';
|
|
38
|
+
break;
|
|
39
|
+
default:
|
|
40
|
+
code = 'http_other';
|
|
41
|
+
}
|
|
42
|
+
const message = body
|
|
43
|
+
? `NTA API responded HTTP ${status}: ${body.slice(0, 200)}`
|
|
44
|
+
: `NTA API responded HTTP ${status}`;
|
|
45
|
+
return new NtaApiError(message, code, status);
|
|
46
|
+
}
|
|
47
|
+
static fromUnknown(err) {
|
|
48
|
+
if (err instanceof NtaApiError)
|
|
49
|
+
return err;
|
|
50
|
+
if (err instanceof Error) {
|
|
51
|
+
if (err.name === 'AbortError' || err.message.toLowerCase().includes('abort')) {
|
|
52
|
+
return new NtaApiError('NTA API request timed out', 'timeout');
|
|
53
|
+
}
|
|
54
|
+
return new NtaApiError(`NTA API network error: ${err.message}`, 'network_error');
|
|
55
|
+
}
|
|
56
|
+
return new NtaApiError('Unknown NTA API error', 'unknown');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 入力バリデーションエラー (SEP-1303 でツール実行エラーとして返却)
|
|
61
|
+
*/
|
|
62
|
+
export class InputValidationError extends Error {
|
|
63
|
+
field;
|
|
64
|
+
guidance;
|
|
65
|
+
name = 'InputValidationError';
|
|
66
|
+
constructor(message, field, guidance) {
|
|
67
|
+
super(message);
|
|
68
|
+
this.field = field;
|
|
69
|
+
this.guidance = guidance;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* レート制限関連エラー
|
|
74
|
+
*/
|
|
75
|
+
export class RateLimitError extends Error {
|
|
76
|
+
retryAfterMs;
|
|
77
|
+
name = 'RateLimitError';
|
|
78
|
+
constructor(message, retryAfterMs) {
|
|
79
|
+
super(message);
|
|
80
|
+
this.retryAfterMs = retryAfterMs;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 未実装 (部分実装への明示的マーカー、Zero Placeholder 原則)
|
|
85
|
+
*/
|
|
86
|
+
export class NotImplementedError extends Error {
|
|
87
|
+
name = 'NotImplementedError';
|
|
88
|
+
constructor(feature, targetVersion) {
|
|
89
|
+
super(`${feature} is not implemented yet. Planned for ${targetVersion}.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAIlB;IACA;IACA;IALA,IAAI,GAAG,aAAa,CAAC;IACvC,YACE,OAAe,EACC,IAAkB,EAClB,UAAmB,EACnB,YAAqB;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAc;QAClB,eAAU,GAAV,UAAU,CAAS;QACnB,iBAAY,GAAZ,YAAY,CAAS;IAGvC,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAc,EAAE,IAAa;QACjD,IAAI,IAAkB,CAAC;QACvB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,GAAG;gBACN,IAAI,GAAG,UAAU,CAAC;gBAClB,MAAM;YACR,KAAK,GAAG;gBACN,IAAI,GAAG,UAAU,CAAC;gBAClB,MAAM;YACR,KAAK,GAAG;gBACN,IAAI,GAAG,UAAU,CAAC;gBAClB,MAAM;YACR,KAAK,GAAG;gBACN,IAAI,GAAG,UAAU,CAAC;gBAClB,MAAM;YACR;gBACE,IAAI,GAAG,YAAY,CAAC;QACxB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI;YAClB,CAAC,CAAC,0BAA0B,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YAC3D,CAAC,CAAC,0BAA0B,MAAM,EAAE,CAAC;QACvC,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAY;QAC7B,IAAI,GAAG,YAAY,WAAW;YAAE,OAAO,GAAG,CAAC;QAC3C,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7E,OAAO,IAAI,WAAW,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,WAAW,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAI3B;IACA;IAJA,IAAI,GAAG,sBAAsB,CAAC;IAChD,YACE,OAAe,EACC,KAAc,EACd,QAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,UAAK,GAAL,KAAK,CAAS;QACd,aAAQ,GAAR,QAAQ,CAAS;IAGnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAIrB;IAHA,IAAI,GAAG,gBAAgB,CAAC;IAC1C,YACE,OAAe,EACC,YAAoB;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,iBAAY,GAAZ,YAAY,CAAQ;IAGtC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC1B,IAAI,GAAG,qBAAqB,CAAC;IAC/C,YAAY,OAAe,EAAE,aAAqB;QAChD,KAAK,CAAC,GAAG,OAAO,wCAAwC,aAAa,GAAG,CAAC,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Logging capability 用の emitter
|
|
3
|
+
* MCP Logging notifications/message emitter per RFC 5424 severity
|
|
4
|
+
* Emitor notifikasi log MCP
|
|
5
|
+
*
|
|
6
|
+
* 根拠 / Source:
|
|
7
|
+
* MCP 公式仕様 server/utilities/logging
|
|
8
|
+
* RFC 5424 - The Syslog Protocol
|
|
9
|
+
*
|
|
10
|
+
* セキュリティ要件 (公式):
|
|
11
|
+
* 1. Log messages MUST NOT contain credentials, PII, internal system details
|
|
12
|
+
* 2. Rate limit messages
|
|
13
|
+
* 3. Validate all data fields
|
|
14
|
+
*/
|
|
15
|
+
import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
16
|
+
export type LogLevel = 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical' | 'alert' | 'emergency';
|
|
17
|
+
export interface McpLogger {
|
|
18
|
+
/** Set minimum log level threshold (called via logging/setLevel) */
|
|
19
|
+
setLevel(level: LogLevel): void;
|
|
20
|
+
getLevel(): LogLevel;
|
|
21
|
+
/** Emit a structured log via notifications/message */
|
|
22
|
+
log(level: LogLevel, logger: string, data: Record<string, unknown>): void;
|
|
23
|
+
debug(logger: string, data: Record<string, unknown>): void;
|
|
24
|
+
info(logger: string, data: Record<string, unknown>): void;
|
|
25
|
+
warning(logger: string, data: Record<string, unknown>): void;
|
|
26
|
+
error(logger: string, data: Record<string, unknown>): void;
|
|
27
|
+
}
|
|
28
|
+
export declare function createMcpLogger(server: Server, initialLevel?: LogLevel): McpLogger;
|
|
29
|
+
//# sourceMappingURL=mcp-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-logger.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,MAAM,GACN,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,OAAO,GACP,WAAW,CAAC;AAahB,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,QAAQ,IAAI,QAAQ,CAAC;IACrB,sDAAsD;IACtD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1E,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5D;AAgCD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,GAAE,QAAiB,GAAG,SAAS,CA2C1F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Logging capability 用の emitter
|
|
3
|
+
* MCP Logging notifications/message emitter per RFC 5424 severity
|
|
4
|
+
* Emitor notifikasi log MCP
|
|
5
|
+
*
|
|
6
|
+
* 根拠 / Source:
|
|
7
|
+
* MCP 公式仕様 server/utilities/logging
|
|
8
|
+
* RFC 5424 - The Syslog Protocol
|
|
9
|
+
*
|
|
10
|
+
* セキュリティ要件 (公式):
|
|
11
|
+
* 1. Log messages MUST NOT contain credentials, PII, internal system details
|
|
12
|
+
* 2. Rate limit messages
|
|
13
|
+
* 3. Validate all data fields
|
|
14
|
+
*/
|
|
15
|
+
const LOG_LEVEL_PRIORITY = {
|
|
16
|
+
debug: 7,
|
|
17
|
+
info: 6,
|
|
18
|
+
notice: 5,
|
|
19
|
+
warning: 4,
|
|
20
|
+
error: 3,
|
|
21
|
+
critical: 2,
|
|
22
|
+
alert: 1,
|
|
23
|
+
emergency: 0,
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* 機密情報を log から除去する (Application ID, email, bearer tokens)
|
|
27
|
+
* Redact sensitive fields to prevent PII/credential leakage
|
|
28
|
+
*/
|
|
29
|
+
function redactSensitive(data) {
|
|
30
|
+
const redacted = {};
|
|
31
|
+
for (const [key, value] of Object.entries(data)) {
|
|
32
|
+
const lowerKey = key.toLowerCase();
|
|
33
|
+
if (lowerKey.includes('id') &&
|
|
34
|
+
(lowerKey.includes('application') || lowerKey.includes('api_key'))) {
|
|
35
|
+
redacted[key] = '***REDACTED***';
|
|
36
|
+
}
|
|
37
|
+
else if (lowerKey.includes('token') ||
|
|
38
|
+
lowerKey.includes('secret') ||
|
|
39
|
+
lowerKey.includes('password')) {
|
|
40
|
+
redacted[key] = '***REDACTED***';
|
|
41
|
+
}
|
|
42
|
+
else if (typeof value === 'string') {
|
|
43
|
+
redacted[key] = value.replace(/id=[^&\s]+/g, 'id=***REDACTED***');
|
|
44
|
+
}
|
|
45
|
+
else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
46
|
+
redacted[key] = redactSensitive(value);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
redacted[key] = value;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return redacted;
|
|
53
|
+
}
|
|
54
|
+
export function createMcpLogger(server, initialLevel = 'info') {
|
|
55
|
+
let currentLevel = initialLevel;
|
|
56
|
+
function shouldEmit(level) {
|
|
57
|
+
return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[currentLevel];
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
setLevel(level) {
|
|
61
|
+
currentLevel = level;
|
|
62
|
+
},
|
|
63
|
+
getLevel() {
|
|
64
|
+
return currentLevel;
|
|
65
|
+
},
|
|
66
|
+
log(level, logger, data) {
|
|
67
|
+
if (!shouldEmit(level))
|
|
68
|
+
return;
|
|
69
|
+
const redacted = redactSensitive(data);
|
|
70
|
+
try {
|
|
71
|
+
void server.notification({
|
|
72
|
+
method: 'notifications/message',
|
|
73
|
+
params: {
|
|
74
|
+
level,
|
|
75
|
+
logger,
|
|
76
|
+
data: redacted,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Ignore when no client connected
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
debug(logger, data) {
|
|
85
|
+
this.log('debug', logger, data);
|
|
86
|
+
},
|
|
87
|
+
info(logger, data) {
|
|
88
|
+
this.log('info', logger, data);
|
|
89
|
+
},
|
|
90
|
+
warning(logger, data) {
|
|
91
|
+
this.log('warning', logger, data);
|
|
92
|
+
},
|
|
93
|
+
error(logger, data) {
|
|
94
|
+
this.log('error', logger, data);
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=mcp-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-logger.js","sourceRoot":"","sources":["../../src/lib/mcp-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP cursor-based pagination ↔ 国税庁 divide/divideSize 変換
|
|
3
|
+
* MCP cursor-based pagination ↔ NTA divide/divideSize translation
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source:
|
|
6
|
+
* MCP 公式仕様 server/utilities/pagination (opaque cursor string)
|
|
7
|
+
* 国税庁仕様書 第二編 §3.5, §4.5 (2000件超過時に divide 1-99999 で分割)
|
|
8
|
+
*/
|
|
9
|
+
interface CursorPayload {
|
|
10
|
+
divide: number;
|
|
11
|
+
/** 元クエリのハッシュ (cursor が他クエリで使い回しされないよう識別子に使う) */
|
|
12
|
+
queryKey?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 国税庁の分割番号 (divide) + query key を MCP の opaque cursor に encode
|
|
16
|
+
*/
|
|
17
|
+
export declare function encodeCursor(divide: number, queryKey?: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* MCP cursor を decode (不正な cursor は null)
|
|
20
|
+
*/
|
|
21
|
+
export declare function decodeCursor(cursor: string | undefined): CursorPayload | null;
|
|
22
|
+
/**
|
|
23
|
+
* 国税庁レスポンスヘッダ (divideNumber, divideSize) から次のページの cursor を生成
|
|
24
|
+
* Returns null when no more pages (divideNumber >= divideSize)
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeNextCursor(divideNumber: number, divideSize: number, queryKey?: string): string | null;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/lib/pagination.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAmB7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAGf"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP cursor-based pagination ↔ 国税庁 divide/divideSize 変換
|
|
3
|
+
* MCP cursor-based pagination ↔ NTA divide/divideSize translation
|
|
4
|
+
*
|
|
5
|
+
* 根拠 / Source:
|
|
6
|
+
* MCP 公式仕様 server/utilities/pagination (opaque cursor string)
|
|
7
|
+
* 国税庁仕様書 第二編 §3.5, §4.5 (2000件超過時に divide 1-99999 で分割)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 国税庁の分割番号 (divide) + query key を MCP の opaque cursor に encode
|
|
11
|
+
*/
|
|
12
|
+
export function encodeCursor(divide, queryKey) {
|
|
13
|
+
const payload = queryKey !== undefined ? { divide, queryKey } : { divide };
|
|
14
|
+
return Buffer.from(JSON.stringify(payload), 'utf-8').toString('base64url');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* MCP cursor を decode (不正な cursor は null)
|
|
18
|
+
*/
|
|
19
|
+
export function decodeCursor(cursor) {
|
|
20
|
+
if (cursor === undefined || cursor === '')
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const json = Buffer.from(cursor, 'base64url').toString('utf-8');
|
|
24
|
+
const parsed = JSON.parse(json);
|
|
25
|
+
if (typeof parsed === 'object' &&
|
|
26
|
+
parsed !== null &&
|
|
27
|
+
'divide' in parsed &&
|
|
28
|
+
typeof parsed.divide === 'number' &&
|
|
29
|
+
parsed.divide >= 1 &&
|
|
30
|
+
parsed.divide <= 99999) {
|
|
31
|
+
return parsed;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 国税庁レスポンスヘッダ (divideNumber, divideSize) から次のページの cursor を生成
|
|
41
|
+
* Returns null when no more pages (divideNumber >= divideSize)
|
|
42
|
+
*/
|
|
43
|
+
export function computeNextCursor(divideNumber, divideSize, queryKey) {
|
|
44
|
+
if (divideNumber >= divideSize)
|
|
45
|
+
return null;
|
|
46
|
+
return encodeCursor(divideNumber + 1, queryKey);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/lib/pagination.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,QAAiB;IAC5D,MAAM,OAAO,GAAkB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1F,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC3C,IACE,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,QAAQ,IAAI,MAAM;YAClB,OAAQ,MAAwB,CAAC,MAAM,KAAK,QAAQ;YACnD,MAAwB,CAAC,MAAM,IAAI,CAAC;YACpC,MAAwB,CAAC,MAAM,IAAI,KAAK,EACzC,CAAC;YACD,OAAO,MAAuB,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,UAAkB,EAClB,QAAiB;IAEjB,IAAI,YAAY,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,YAAY,CAAC,YAAY,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result<T, E> モナド
|
|
3
|
+
* Result monad for explicit error handling
|
|
4
|
+
* Monad Result untuk penanganan error eksplisit
|
|
5
|
+
*/
|
|
6
|
+
export type Result<T, E> = {
|
|
7
|
+
ok: true;
|
|
8
|
+
value: T;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
error: E;
|
|
12
|
+
};
|
|
13
|
+
export declare const Result: {
|
|
14
|
+
ok<T>(value: T): Result<T, never>;
|
|
15
|
+
err<E>(error: E): Result<never, E>;
|
|
16
|
+
isOk<T, E>(r: Result<T, E>): r is {
|
|
17
|
+
ok: true;
|
|
18
|
+
value: T;
|
|
19
|
+
};
|
|
20
|
+
isErr<T, E>(r: Result<T, E>): r is {
|
|
21
|
+
ok: false;
|
|
22
|
+
error: E;
|
|
23
|
+
};
|
|
24
|
+
unwrap<T, E>(r: Result<T, E>): T;
|
|
25
|
+
unwrapErr<T, E>(r: Result<T, E>): E;
|
|
26
|
+
map<T, U, E>(r: Result<T, E>, fn: (value: T) => U): Result<U, E>;
|
|
27
|
+
mapErr<T, E, F>(r: Result<T, E>, fn: (error: E) => F): Result<T, F>;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/lib/result.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE5E,eAAO,MAAM,MAAM;OACd,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC;QAG7B,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;SAG7B,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE;UAGlD,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE;WAGnD,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;cAItB,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;QAI/B,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;WAGzD,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;CAGpE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result<T, E> モナド
|
|
3
|
+
* Result monad for explicit error handling
|
|
4
|
+
* Monad Result untuk penanganan error eksplisit
|
|
5
|
+
*/
|
|
6
|
+
export const Result = {
|
|
7
|
+
ok(value) {
|
|
8
|
+
return { ok: true, value };
|
|
9
|
+
},
|
|
10
|
+
err(error) {
|
|
11
|
+
return { ok: false, error };
|
|
12
|
+
},
|
|
13
|
+
isOk(r) {
|
|
14
|
+
return r.ok;
|
|
15
|
+
},
|
|
16
|
+
isErr(r) {
|
|
17
|
+
return !r.ok;
|
|
18
|
+
},
|
|
19
|
+
unwrap(r) {
|
|
20
|
+
if (r.ok)
|
|
21
|
+
return r.value;
|
|
22
|
+
throw new Error(`Result.unwrap called on Err: ${String(r.error)}`);
|
|
23
|
+
},
|
|
24
|
+
unwrapErr(r) {
|
|
25
|
+
if (!r.ok)
|
|
26
|
+
return r.error;
|
|
27
|
+
throw new Error('Result.unwrapErr called on Ok');
|
|
28
|
+
},
|
|
29
|
+
map(r, fn) {
|
|
30
|
+
return r.ok ? Result.ok(fn(r.value)) : r;
|
|
31
|
+
},
|
|
32
|
+
mapErr(r, fn) {
|
|
33
|
+
return r.ok ? r : Result.err(fn(r.error));
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/lib/result.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,EAAE,CAAI,KAAQ;QACZ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,GAAG,CAAI,KAAQ;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,CAAO,CAAe;QACxB,OAAO,CAAC,CAAC,EAAE,CAAC;IACd,CAAC;IACD,KAAK,CAAO,CAAe;QACzB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACf,CAAC;IACD,MAAM,CAAO,CAAe;QAC1B,IAAI,CAAC,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,SAAS,CAAO,CAAe;QAC7B,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,GAAG,CAAU,CAAe,EAAE,EAAmB;QAC/C,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,CAAU,CAAe,EAAE,EAAmB;QAClD,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry Trace Context (W3C TraceContext) 最小実装
|
|
3
|
+
* Minimal W3C TraceContext propagation (SEP-414 compliant baseline)
|
|
4
|
+
*
|
|
5
|
+
* v0.1.0 では受信側のパースと NTA API への伝搭のみ。
|
|
6
|
+
* v0.5.0 で Cloud Trace exporter 等に展開予定。
|
|
7
|
+
*
|
|
8
|
+
* 根拠 / Source:
|
|
9
|
+
* W3C TraceContext spec: https://www.w3.org/TR/trace-context/
|
|
10
|
+
* SEP-414 Final: MCP OpenTelemetry Trace Context Propagation Conventions
|
|
11
|
+
*
|
|
12
|
+
* `traceparent` ヘッダのフォーマット:
|
|
13
|
+
* version-trace_id-parent_id-flags
|
|
14
|
+
* 例: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
|
|
15
|
+
*/
|
|
16
|
+
export interface TraceContext {
|
|
17
|
+
version: string;
|
|
18
|
+
traceId: string;
|
|
19
|
+
parentId: string;
|
|
20
|
+
flags: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseTraceparent(header: string | undefined): TraceContext | null;
|
|
23
|
+
export declare function formatTraceparent(ctx: TraceContext): string;
|
|
24
|
+
/**
|
|
25
|
+
* 16進数の ID を生成 (lightweight, 暗号学的強度は不要)
|
|
26
|
+
* crypto.randomBytes 相当の精度
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateTraceId(): string;
|
|
29
|
+
export declare function generateSpanId(): string;
|
|
30
|
+
/**
|
|
31
|
+
* 親コンテキスト (req.headers.traceparent) から子 span の context を派生
|
|
32
|
+
* Derive child span context from parent context.
|
|
33
|
+
* If parent is null, generate new trace id.
|
|
34
|
+
*/
|
|
35
|
+
export declare function deriveChildSpan(parent: TraceContext | null): TraceContext;
|
|
36
|
+
//# sourceMappingURL=trace-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-context.d.ts","sourceRoot":"","sources":["../../src/lib/trace-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAehF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,YAAY,CAezE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry Trace Context (W3C TraceContext) 最小実装
|
|
3
|
+
* Minimal W3C TraceContext propagation (SEP-414 compliant baseline)
|
|
4
|
+
*
|
|
5
|
+
* v0.1.0 では受信側のパースと NTA API への伝搭のみ。
|
|
6
|
+
* v0.5.0 で Cloud Trace exporter 等に展開予定。
|
|
7
|
+
*
|
|
8
|
+
* 根拠 / Source:
|
|
9
|
+
* W3C TraceContext spec: https://www.w3.org/TR/trace-context/
|
|
10
|
+
* SEP-414 Final: MCP OpenTelemetry Trace Context Propagation Conventions
|
|
11
|
+
*
|
|
12
|
+
* `traceparent` ヘッダのフォーマット:
|
|
13
|
+
* version-trace_id-parent_id-flags
|
|
14
|
+
* 例: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
|
|
15
|
+
*/
|
|
16
|
+
const TRACEPARENT_REGEX = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;
|
|
17
|
+
export function parseTraceparent(header) {
|
|
18
|
+
if (header === undefined || header === '')
|
|
19
|
+
return null;
|
|
20
|
+
const m = TRACEPARENT_REGEX.exec(header.trim().toLowerCase());
|
|
21
|
+
if (m === null)
|
|
22
|
+
return null;
|
|
23
|
+
const [, version, traceId, parentId, flags] = m;
|
|
24
|
+
if (version === undefined ||
|
|
25
|
+
traceId === undefined ||
|
|
26
|
+
parentId === undefined ||
|
|
27
|
+
flags === undefined) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
if (traceId === '0'.repeat(32) || parentId === '0'.repeat(16))
|
|
31
|
+
return null;
|
|
32
|
+
return { version, traceId, parentId, flags };
|
|
33
|
+
}
|
|
34
|
+
export function formatTraceparent(ctx) {
|
|
35
|
+
return `${ctx.version}-${ctx.traceId}-${ctx.parentId}-${ctx.flags}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 16進数の ID を生成 (lightweight, 暗号学的強度は不要)
|
|
39
|
+
* crypto.randomBytes 相当の精度
|
|
40
|
+
*/
|
|
41
|
+
export function generateTraceId() {
|
|
42
|
+
const array = new Uint8Array(16);
|
|
43
|
+
crypto.getRandomValues(array);
|
|
44
|
+
return bufferToHex(array);
|
|
45
|
+
}
|
|
46
|
+
export function generateSpanId() {
|
|
47
|
+
const array = new Uint8Array(8);
|
|
48
|
+
crypto.getRandomValues(array);
|
|
49
|
+
return bufferToHex(array);
|
|
50
|
+
}
|
|
51
|
+
function bufferToHex(buffer) {
|
|
52
|
+
return Array.from(buffer)
|
|
53
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
54
|
+
.join('');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 親コンテキスト (req.headers.traceparent) から子 span の context を派生
|
|
58
|
+
* Derive child span context from parent context.
|
|
59
|
+
* If parent is null, generate new trace id.
|
|
60
|
+
*/
|
|
61
|
+
export function deriveChildSpan(parent) {
|
|
62
|
+
if (parent === null) {
|
|
63
|
+
return {
|
|
64
|
+
version: '00',
|
|
65
|
+
traceId: generateTraceId(),
|
|
66
|
+
parentId: generateSpanId(),
|
|
67
|
+
flags: '01',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
version: parent.version,
|
|
72
|
+
traceId: parent.traceId,
|
|
73
|
+
parentId: generateSpanId(),
|
|
74
|
+
flags: parent.flags,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=trace-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-context.js","sourceRoot":"","sources":["../../src/lib/trace-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,MAAM,iBAAiB,GAAG,6DAA6D,CAAC;AAExF,MAAM,UAAU,gBAAgB,CAAC,MAA0B;IACzD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,IACE,OAAO,KAAK,SAAS;QACrB,OAAO,KAAK,SAAS;QACrB,QAAQ,KAAK,SAAS;QACtB,KAAK,KAAK,SAAS,EACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAA2B;IACzD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,eAAe,EAAE;YAC1B,QAAQ,EAAE,cAAc,EAAE;YAC1B,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,cAAc,EAAE;QAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpServer factory - all capabilities declared + all primitives registered
|
|
3
|
+
*/
|
|
4
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import type { NtaClient } from './api/nta-client.js';
|
|
6
|
+
export declare function createServer(deps: {
|
|
7
|
+
ntaClient: NtaClient;
|
|
8
|
+
}): McpServer;
|
|
9
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQrD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAgDtE"}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpServer factory - all capabilities declared + all primitives registered
|
|
3
|
+
*/
|
|
4
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { registerAllTools } from './tools/index.js';
|
|
6
|
+
import { registerAllResources } from './resources/index.js';
|
|
7
|
+
import { registerAllPrompts } from './prompts/index.js';
|
|
8
|
+
import { registerCompletionHandler } from './completion/handler.js';
|
|
9
|
+
import { createMcpLogger } from './lib/mcp-logger.js';
|
|
10
|
+
import { SERVER_NAME, VERSION } from './version.js';
|
|
11
|
+
export function createServer(deps) {
|
|
12
|
+
const mcpServer = new McpServer({
|
|
13
|
+
name: SERVER_NAME,
|
|
14
|
+
version: VERSION,
|
|
15
|
+
}, {
|
|
16
|
+
capabilities: {
|
|
17
|
+
tools: { listChanged: true },
|
|
18
|
+
resources: { listChanged: true, subscribe: false },
|
|
19
|
+
prompts: { listChanged: true },
|
|
20
|
+
completions: {},
|
|
21
|
+
logging: {},
|
|
22
|
+
},
|
|
23
|
+
instructions: [
|
|
24
|
+
"This server provides access to Japan's National Corporate Number (法人番号) public database.",
|
|
25
|
+
'All operations are READ-ONLY. No write/delete/exec capabilities exist.',
|
|
26
|
+
'',
|
|
27
|
+
'Tools:',
|
|
28
|
+
' lookup_corporate_by_number - Look up by 13-digit corporate number (up to 10 at once)',
|
|
29
|
+
' search_corporate_by_name - Search by name (supports fuzzy/exact/english)',
|
|
30
|
+
' validate_corporate_number - Check digit validation (local, no API call)',
|
|
31
|
+
' normalize_company_name - Normalize fuzzy company names (complements NTA target=1)',
|
|
32
|
+
' get_attribution - Required attribution text for NTA API usage',
|
|
33
|
+
'',
|
|
34
|
+
'Prompts (workflow templates):',
|
|
35
|
+
' business-card-to-database - Business card OCR → normalize → NTA lookup → CRM record',
|
|
36
|
+
' sales-list-enrichment - Bulk enrichment of sales lists',
|
|
37
|
+
' customer-master-dedup - Customer master dedup via corporate number',
|
|
38
|
+
'',
|
|
39
|
+
'Resources:',
|
|
40
|
+
' corp://{corporate_number} - Corporation info as a resource',
|
|
41
|
+
' attribution://houjin-bangou - Static attribution resource',
|
|
42
|
+
'',
|
|
43
|
+
'Attribution: All outputs include mandatory attribution per Article 6 of NTA Web-API Terms',
|
|
44
|
+
'and 公共データ利用規約 第1.0版. Source: 国税庁法人番号公表サイト (https://www.houjin-bangou.nta.go.jp/).',
|
|
45
|
+
].join('\n'),
|
|
46
|
+
});
|
|
47
|
+
const logger = createMcpLogger(mcpServer.server, 'info');
|
|
48
|
+
registerAllTools(mcpServer, { ntaClient: deps.ntaClient, logger });
|
|
49
|
+
registerAllResources(mcpServer, { ntaClient: deps.ntaClient, logger });
|
|
50
|
+
registerAllPrompts(mcpServer);
|
|
51
|
+
registerCompletionHandler(mcpServer.server, { logger });
|
|
52
|
+
return mcpServer;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,IAA8B;IACzD,MAAM,SAAS,GAAG,IAAI,SAAS,CAC7B;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;YAC5B,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;YAClD,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;YAC9B,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;SACZ;QACD,YAAY,EAAE;YACZ,0FAA0F;YAC1F,wEAAwE;YACxE,EAAE;YACF,QAAQ;YACR,yFAAyF;YACzF,+EAA+E;YAC/E,6EAA6E;YAC7E,0FAA0F;YAC1F,6EAA6E;YAC7E,EAAE;YACF,+BAA+B;YAC/B,yFAAyF;YACzF,gEAAgE;YAChE,4EAA4E;YAC5E,EAAE;YACF,YAAY;YACZ,gEAAgE;YAChE,6DAA6D;YAC7D,EAAE;YACF,2FAA2F;YAC3F,mFAAmF;SACpF,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzD,gBAAgB,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,oBAAoB,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC9B,yBAAyB,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAExD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt: business-card-to-database
|
|
3
|
+
*
|
|
4
|
+
* 名刺 OCR テキストから国税庁公表データを参照して正確な法人情報を引き出し、
|
|
5
|
+
* 構造化レコードとして新規取引先登録に使える形にするワークフロー。
|
|
6
|
+
*
|
|
7
|
+
* 根拠 / Source: MCP 公式仕様 (Prompts primitive)
|
|
8
|
+
* user-controlled、LLM 側で「ツールを順番に呼び出す」ガイダンスを提供
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
export declare function registerBusinessCardToDatabasePrompt(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=business-card-to-database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"business-card-to-database.d.ts","sourceRoot":"","sources":["../../src/prompts/business-card-to-database.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8D5E"}
|