@taxdao/fintax-mcp 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/README.md +220 -0
- package/dist/app/create-server.d.ts +18 -0
- package/dist/app/create-server.js +80 -0
- package/dist/app/create-server.js.map +1 -0
- package/dist/app/register-tools.d.ts +4 -0
- package/dist/app/register-tools.js +18 -0
- package/dist/app/register-tools.js.map +1 -0
- package/dist/audit/audit-context.d.ts +38 -0
- package/dist/audit/audit-context.js +167 -0
- package/dist/audit/audit-context.js.map +1 -0
- package/dist/audit/audit-sink.d.ts +20 -0
- package/dist/audit/audit-sink.js +6 -0
- package/dist/audit/audit-sink.js.map +1 -0
- package/dist/audit/file-audit-sink.d.ts +6 -0
- package/dist/audit/file-audit-sink.js +18 -0
- package/dist/audit/file-audit-sink.js.map +1 -0
- package/dist/auth/auth-session.d.ts +63 -0
- package/dist/auth/auth-session.js +226 -0
- package/dist/auth/auth-session.js.map +1 -0
- package/dist/auth/credentials.d.ts +6 -0
- package/dist/auth/credentials.js +12 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/org-token-provider.d.ts +15 -0
- package/dist/auth/org-token-provider.js +62 -0
- package/dist/auth/org-token-provider.js.map +1 -0
- package/dist/capabilities/capability.d.ts +100 -0
- package/dist/capabilities/capability.js +26 -0
- package/dist/capabilities/capability.js.map +1 -0
- package/dist/capabilities/create-capabilities.d.ts +2 -0
- package/dist/capabilities/create-capabilities.js +37 -0
- package/dist/capabilities/create-capabilities.js.map +1 -0
- package/dist/capabilities/define-capability.d.ts +39 -0
- package/dist/capabilities/define-capability.js +64 -0
- package/dist/capabilities/define-capability.js.map +1 -0
- package/dist/capabilities/definitions/accounting-balances.d.ts +4 -0
- package/dist/capabilities/definitions/accounting-balances.js +98 -0
- package/dist/capabilities/definitions/accounting-balances.js.map +1 -0
- package/dist/capabilities/definitions/accounting-context.d.ts +2 -0
- package/dist/capabilities/definitions/accounting-context.js +17 -0
- package/dist/capabilities/definitions/accounting-context.js.map +1 -0
- package/dist/capabilities/definitions/assets.d.ts +2 -0
- package/dist/capabilities/definitions/assets.js +367 -0
- package/dist/capabilities/definitions/assets.js.map +1 -0
- package/dist/capabilities/definitions/business-documents.d.ts +9 -0
- package/dist/capabilities/definitions/business-documents.js +386 -0
- package/dist/capabilities/definitions/business-documents.js.map +1 -0
- package/dist/capabilities/definitions/dashboard.d.ts +2 -0
- package/dist/capabilities/definitions/dashboard.js +153 -0
- package/dist/capabilities/definitions/dashboard.js.map +1 -0
- package/dist/capabilities/definitions/extended-operation-contracts.d.ts +597 -0
- package/dist/capabilities/definitions/extended-operation-contracts.js +1180 -0
- package/dist/capabilities/definitions/extended-operation-contracts.js.map +1 -0
- package/dist/capabilities/definitions/extended-operations.d.ts +2 -0
- package/dist/capabilities/definitions/extended-operations.js +699 -0
- package/dist/capabilities/definitions/extended-operations.js.map +1 -0
- package/dist/capabilities/definitions/financial-reports.d.ts +2 -0
- package/dist/capabilities/definitions/financial-reports.js +100 -0
- package/dist/capabilities/definitions/financial-reports.js.map +1 -0
- package/dist/capabilities/definitions/fnd-import.d.ts +34 -0
- package/dist/capabilities/definitions/fnd-import.js +282 -0
- package/dist/capabilities/definitions/fnd-import.js.map +1 -0
- package/dist/capabilities/definitions/fund-accounts.d.ts +2 -0
- package/dist/capabilities/definitions/fund-accounts.js +188 -0
- package/dist/capabilities/definitions/fund-accounts.js.map +1 -0
- package/dist/capabilities/definitions/fund-balances.d.ts +2 -0
- package/dist/capabilities/definitions/fund-balances.js +84 -0
- package/dist/capabilities/definitions/fund-balances.js.map +1 -0
- package/dist/capabilities/definitions/journals.d.ts +10 -0
- package/dist/capabilities/definitions/journals.js +224 -0
- package/dist/capabilities/definitions/journals.js.map +1 -0
- package/dist/capabilities/definitions/master-data.d.ts +2 -0
- package/dist/capabilities/definitions/master-data.js +451 -0
- package/dist/capabilities/definitions/master-data.js.map +1 -0
- package/dist/capabilities/definitions/pnl.d.ts +2 -0
- package/dist/capabilities/definitions/pnl.js +139 -0
- package/dist/capabilities/definitions/pnl.js.map +1 -0
- package/dist/capabilities/definitions/reference-data.d.ts +2 -0
- package/dist/capabilities/definitions/reference-data.js +169 -0
- package/dist/capabilities/definitions/reference-data.js.map +1 -0
- package/dist/capabilities/definitions/transaction-drafts.d.ts +2 -0
- package/dist/capabilities/definitions/transaction-drafts.js +157 -0
- package/dist/capabilities/definitions/transaction-drafts.js.map +1 -0
- package/dist/capabilities/definitions/transactions.d.ts +168 -0
- package/dist/capabilities/definitions/transactions.js +79 -0
- package/dist/capabilities/definitions/transactions.js.map +1 -0
- package/dist/capabilities/executor.d.ts +19 -0
- package/dist/capabilities/executor.js +134 -0
- package/dist/capabilities/executor.js.map +1 -0
- package/dist/capabilities/registry.d.ts +7 -0
- package/dist/capabilities/registry.js +51 -0
- package/dist/capabilities/registry.js.map +1 -0
- package/dist/clients/base-client.d.ts +5 -0
- package/dist/clients/base-client.js +13 -0
- package/dist/clients/base-client.js.map +1 -0
- package/dist/clients/http-client.d.ts +29 -0
- package/dist/clients/http-client.js +167 -0
- package/dist/clients/http-client.js.map +1 -0
- package/dist/clients/suite-client.d.ts +5 -0
- package/dist/clients/suite-client.js +5 -0
- package/dist/clients/suite-client.js.map +1 -0
- package/dist/concurrency/lock-manager.d.ts +4 -0
- package/dist/concurrency/lock-manager.js +23 -0
- package/dist/concurrency/lock-manager.js.map +1 -0
- package/dist/config/load-config.d.ts +2 -0
- package/dist/config/load-config.js +18 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/schema.d.ts +24 -0
- package/dist/config/schema.js +85 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/errors/fintax-error.d.ts +24 -0
- package/dist/errors/fintax-error.js +21 -0
- package/dist/errors/fintax-error.js.map +1 -0
- package/dist/errors/normalize-error.d.ts +3 -0
- package/dist/errors/normalize-error.js +67 -0
- package/dist/errors/normalize-error.js.map +1 -0
- package/dist/files/artifact-store.d.ts +17 -0
- package/dist/files/artifact-store.js +74 -0
- package/dist/files/artifact-store.js.map +1 -0
- package/dist/files/input-policy.d.ts +28 -0
- package/dist/files/input-policy.js +109 -0
- package/dist/files/input-policy.js.map +1 -0
- package/dist/files/roots-provider.d.ts +14 -0
- package/dist/files/roots-provider.js +47 -0
- package/dist/files/roots-provider.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/logger.d.ts +3 -0
- package/dist/logging/logger.js +13 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/policies/idempotency.d.ts +32 -0
- package/dist/policies/idempotency.js +155 -0
- package/dist/policies/idempotency.js.map +1 -0
- package/dist/policies/job-reference.d.ts +16 -0
- package/dist/policies/job-reference.js +62 -0
- package/dist/policies/job-reference.js.map +1 -0
- package/dist/policies/operation-plan.d.ts +27 -0
- package/dist/policies/operation-plan.js +99 -0
- package/dist/policies/operation-plan.js.map +1 -0
- package/dist/policies/redaction.d.ts +2 -0
- package/dist/policies/redaction.js +29 -0
- package/dist/policies/redaction.js.map +1 -0
- package/dist/policies/retry.d.ts +8 -0
- package/dist/policies/retry.js +19 -0
- package/dist/policies/retry.js.map +1 -0
- package/dist/responses/tool-response.d.ts +4 -0
- package/dist/responses/tool-response.js +24 -0
- package/dist/responses/tool-response.js.map +1 -0
- package/dist/schemas/common.d.ts +226 -0
- package/dist/schemas/common.js +133 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/domains/accounting-balances.d.ts +497 -0
- package/dist/schemas/domains/accounting-balances.js +226 -0
- package/dist/schemas/domains/accounting-balances.js.map +1 -0
- package/dist/schemas/domains/accounting-context.d.ts +118 -0
- package/dist/schemas/domains/accounting-context.js +54 -0
- package/dist/schemas/domains/accounting-context.js.map +1 -0
- package/dist/schemas/domains/assets.d.ts +2508 -0
- package/dist/schemas/domains/assets.js +960 -0
- package/dist/schemas/domains/assets.js.map +1 -0
- package/dist/schemas/domains/business-documents.d.ts +4406 -0
- package/dist/schemas/domains/business-documents.js +1153 -0
- package/dist/schemas/domains/business-documents.js.map +1 -0
- package/dist/schemas/domains/configuration.d.ts +518 -0
- package/dist/schemas/domains/configuration.js +504 -0
- package/dist/schemas/domains/configuration.js.map +1 -0
- package/dist/schemas/domains/dashboard.d.ts +339 -0
- package/dist/schemas/domains/dashboard.js +211 -0
- package/dist/schemas/domains/dashboard.js.map +1 -0
- package/dist/schemas/domains/extended-operation-results.d.ts +1588 -0
- package/dist/schemas/domains/extended-operation-results.js +275 -0
- package/dist/schemas/domains/extended-operation-results.js.map +1 -0
- package/dist/schemas/domains/extended-operations.d.ts +1061 -0
- package/dist/schemas/domains/extended-operations.js +567 -0
- package/dist/schemas/domains/extended-operations.js.map +1 -0
- package/dist/schemas/domains/extended-query-results.d.ts +1688 -0
- package/dist/schemas/domains/extended-query-results.js +337 -0
- package/dist/schemas/domains/extended-query-results.js.map +1 -0
- package/dist/schemas/domains/financial-reports.d.ts +540 -0
- package/dist/schemas/domains/financial-reports.js +206 -0
- package/dist/schemas/domains/financial-reports.js.map +1 -0
- package/dist/schemas/domains/fnd-import.d.ts +912 -0
- package/dist/schemas/domains/fnd-import.js +396 -0
- package/dist/schemas/domains/fnd-import.js.map +1 -0
- package/dist/schemas/domains/fund-accounts.d.ts +1092 -0
- package/dist/schemas/domains/fund-accounts.js +410 -0
- package/dist/schemas/domains/fund-accounts.js.map +1 -0
- package/dist/schemas/domains/fund-balances.d.ts +476 -0
- package/dist/schemas/domains/fund-balances.js +233 -0
- package/dist/schemas/domains/fund-balances.js.map +1 -0
- package/dist/schemas/domains/journals.d.ts +1619 -0
- package/dist/schemas/domains/journals.js +615 -0
- package/dist/schemas/domains/journals.js.map +1 -0
- package/dist/schemas/domains/master-data.d.ts +2010 -0
- package/dist/schemas/domains/master-data.js +799 -0
- package/dist/schemas/domains/master-data.js.map +1 -0
- package/dist/schemas/domains/pnl.d.ts +837 -0
- package/dist/schemas/domains/pnl.js +469 -0
- package/dist/schemas/domains/pnl.js.map +1 -0
- package/dist/schemas/domains/reference-data.d.ts +227 -0
- package/dist/schemas/domains/reference-data.js +144 -0
- package/dist/schemas/domains/reference-data.js.map +1 -0
- package/dist/schemas/domains/transaction-drafts.d.ts +903 -0
- package/dist/schemas/domains/transaction-drafts.js +242 -0
- package/dist/schemas/domains/transaction-drafts.js.map +1 -0
- package/dist/schemas/domains/transactions.d.ts +910 -0
- package/dist/schemas/domains/transactions.js +266 -0
- package/dist/schemas/domains/transactions.js.map +1 -0
- package/dist/schemas/primitives.d.ts +6 -0
- package/dist/schemas/primitives.js +11 -0
- package/dist/schemas/primitives.js.map +1 -0
- package/dist/schemas/public-input.d.ts +3 -0
- package/dist/schemas/public-input.js +524 -0
- package/dist/schemas/public-input.js.map +1 -0
- package/dist/tools/core-edit/idempotent-write.d.ts +23 -0
- package/dist/tools/core-edit/idempotent-write.js +58 -0
- package/dist/tools/core-edit/idempotent-write.js.map +1 -0
- package/dist/tools/core-edit/save-asset.d.ts +5 -0
- package/dist/tools/core-edit/save-asset.js +334 -0
- package/dist/tools/core-edit/save-asset.js.map +1 -0
- package/dist/tools/core-edit/save-business-document-draft.d.ts +2 -0
- package/dist/tools/core-edit/save-business-document-draft.js +128 -0
- package/dist/tools/core-edit/save-business-document-draft.js.map +1 -0
- package/dist/tools/core-edit/save-fund-account.d.ts +2 -0
- package/dist/tools/core-edit/save-fund-account.js +138 -0
- package/dist/tools/core-edit/save-fund-account.js.map +1 -0
- package/dist/tools/core-edit/save-journal-draft.d.ts +2 -0
- package/dist/tools/core-edit/save-journal-draft.js +122 -0
- package/dist/tools/core-edit/save-journal-draft.js.map +1 -0
- package/dist/tools/core-edit/save-master-data.d.ts +2 -0
- package/dist/tools/core-edit/save-master-data.js +153 -0
- package/dist/tools/core-edit/save-master-data.js.map +1 -0
- package/dist/tools/core-edit/save-transaction-draft.d.ts +2 -0
- package/dist/tools/core-edit/save-transaction-draft.js +128 -0
- package/dist/tools/core-edit/save-transaction-draft.js.map +1 -0
- package/dist/tools/core-read/export-business-documents.d.ts +2 -0
- package/dist/tools/core-read/export-business-documents.js +67 -0
- package/dist/tools/core-read/export-business-documents.js.map +1 -0
- package/dist/tools/core-read/export-journals.d.ts +2 -0
- package/dist/tools/core-read/export-journals.js +56 -0
- package/dist/tools/core-read/export-journals.js.map +1 -0
- package/dist/tools/core-read/export-transactions.d.ts +2 -0
- package/dist/tools/core-read/export-transactions.js +67 -0
- package/dist/tools/core-read/export-transactions.js.map +1 -0
- package/dist/tools/core-read/query-accounting-balances.d.ts +2 -0
- package/dist/tools/core-read/query-accounting-balances.js +135 -0
- package/dist/tools/core-read/query-accounting-balances.js.map +1 -0
- package/dist/tools/core-read/query-accounting-context.d.ts +2 -0
- package/dist/tools/core-read/query-accounting-context.js +76 -0
- package/dist/tools/core-read/query-accounting-context.js.map +1 -0
- package/dist/tools/core-read/query-assets.d.ts +2 -0
- package/dist/tools/core-read/query-assets.js +425 -0
- package/dist/tools/core-read/query-assets.js.map +1 -0
- package/dist/tools/core-read/query-business-documents.d.ts +9 -0
- package/dist/tools/core-read/query-business-documents.js +620 -0
- package/dist/tools/core-read/query-business-documents.js.map +1 -0
- package/dist/tools/core-read/query-dashboard.d.ts +2 -0
- package/dist/tools/core-read/query-dashboard.js +144 -0
- package/dist/tools/core-read/query-dashboard.js.map +1 -0
- package/dist/tools/core-read/query-financial-reports.d.ts +2 -0
- package/dist/tools/core-read/query-financial-reports.js +171 -0
- package/dist/tools/core-read/query-financial-reports.js.map +1 -0
- package/dist/tools/core-read/query-fund-accounts.d.ts +2 -0
- package/dist/tools/core-read/query-fund-accounts.js +140 -0
- package/dist/tools/core-read/query-fund-accounts.js.map +1 -0
- package/dist/tools/core-read/query-fund-balances.d.ts +2 -0
- package/dist/tools/core-read/query-fund-balances.js +150 -0
- package/dist/tools/core-read/query-fund-balances.js.map +1 -0
- package/dist/tools/core-read/query-journals.d.ts +2 -0
- package/dist/tools/core-read/query-journals.js +277 -0
- package/dist/tools/core-read/query-journals.js.map +1 -0
- package/dist/tools/core-read/query-master-data.d.ts +2 -0
- package/dist/tools/core-read/query-master-data.js +363 -0
- package/dist/tools/core-read/query-master-data.js.map +1 -0
- package/dist/tools/core-read/query-pnl.d.ts +2 -0
- package/dist/tools/core-read/query-pnl.js +244 -0
- package/dist/tools/core-read/query-pnl.js.map +1 -0
- package/dist/tools/core-read/query-reference-data.d.ts +2 -0
- package/dist/tools/core-read/query-reference-data.js +293 -0
- package/dist/tools/core-read/query-reference-data.js.map +1 -0
- package/dist/tools/core-read/query-transactions.d.ts +2 -0
- package/dist/tools/core-read/query-transactions.js +58 -0
- package/dist/tools/core-read/query-transactions.js.map +1 -0
- package/dist/tools/create-tools.d.ts +3 -0
- package/dist/tools/create-tools.js +88 -0
- package/dist/tools/create-tools.js.map +1 -0
- package/dist/tools/extended/asset-operation-tools.d.ts +9 -0
- package/dist/tools/extended/asset-operation-tools.js +419 -0
- package/dist/tools/extended/asset-operation-tools.js.map +1 -0
- package/dist/tools/extended/automation-tools.d.ts +7 -0
- package/dist/tools/extended/automation-tools.js +333 -0
- package/dist/tools/extended/automation-tools.js.map +1 -0
- package/dist/tools/extended/configuration-tools.d.ts +14 -0
- package/dist/tools/extended/configuration-tools.js +871 -0
- package/dist/tools/extended/configuration-tools.js.map +1 -0
- package/dist/tools/extended/period-end-tools.d.ts +11 -0
- package/dist/tools/extended/period-end-tools.js +480 -0
- package/dist/tools/extended/period-end-tools.js.map +1 -0
- package/dist/tools/extended/query-output.d.ts +2589 -0
- package/dist/tools/extended/query-output.js +610 -0
- package/dist/tools/extended/query-output.js.map +1 -0
- package/dist/tools/extended/tool-support.d.ts +56 -0
- package/dist/tools/extended/tool-support.js +198 -0
- package/dist/tools/extended/tool-support.js.map +1 -0
- package/dist/tools/extended/workflow-tools.d.ts +10 -0
- package/dist/tools/extended/workflow-tools.js +678 -0
- package/dist/tools/extended/workflow-tools.js.map +1 -0
- package/dist/tools/fnd-import/execute-import.d.ts +2 -0
- package/dist/tools/fnd-import/execute-import.js +201 -0
- package/dist/tools/fnd-import/execute-import.js.map +1 -0
- package/dist/tools/fnd-import/get-import-template.d.ts +2 -0
- package/dist/tools/fnd-import/get-import-template.js +66 -0
- package/dist/tools/fnd-import/get-import-template.js.map +1 -0
- package/dist/tools/fnd-import/get-job-status.d.ts +8 -0
- package/dist/tools/fnd-import/get-job-status.js +201 -0
- package/dist/tools/fnd-import/get-job-status.js.map +1 -0
- package/dist/tools/fnd-import/prepare-import.d.ts +31 -0
- package/dist/tools/fnd-import/prepare-import.js +214 -0
- package/dist/tools/fnd-import/prepare-import.js.map +1 -0
- package/dist/tools/fnd-import/public-import-result.d.ts +18 -0
- package/dist/tools/fnd-import/public-import-result.js +35 -0
- package/dist/tools/fnd-import/public-import-result.js.map +1 -0
- package/dist/tools/tool-definition.d.ts +45 -0
- package/dist/tools/tool-definition.js +11 -0
- package/dist/tools/tool-definition.js.map +1 -0
- package/dist/tools/tool-handler.d.ts +27 -0
- package/dist/tools/tool-handler.js +196 -0
- package/dist/tools/tool-handler.js.map +1 -0
- package/dist/tools/transaction-item.d.ts +225 -0
- package/dist/tools/transaction-item.js +109 -0
- package/dist/tools/transaction-item.js.map +1 -0
- package/dist/transport/draining-transport.d.ts +14 -0
- package/dist/transport/draining-transport.js +36 -0
- package/dist/transport/draining-transport.js.map +1 -0
- package/dist/transport/stdio.d.ts +2 -0
- package/dist/transport/stdio.js +5 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type FinTaxErrorCode = 'AUTH_REQUIRED' | 'PERMISSION_DENIED' | 'VALIDATION_FAILED' | 'NOT_FOUND' | 'CONFLICT' | 'CONFIRMATION_REQUIRED' | 'RATE_LIMITED' | 'UPSTREAM_UNAVAILABLE' | 'TIMEOUT' | 'UNKNOWN';
|
|
2
|
+
export interface FieldError {
|
|
3
|
+
readonly field: string;
|
|
4
|
+
readonly message: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RecoveryAction {
|
|
7
|
+
readonly tool: string;
|
|
8
|
+
readonly input: Readonly<Record<string, unknown>>;
|
|
9
|
+
}
|
|
10
|
+
export interface FinTaxErrorOptions {
|
|
11
|
+
readonly retryable?: boolean;
|
|
12
|
+
readonly status?: number;
|
|
13
|
+
readonly fieldErrors?: readonly FieldError[];
|
|
14
|
+
readonly recovery?: RecoveryAction;
|
|
15
|
+
readonly cause?: unknown;
|
|
16
|
+
}
|
|
17
|
+
export declare class FinTaxError extends Error {
|
|
18
|
+
readonly code: FinTaxErrorCode;
|
|
19
|
+
readonly retryable: boolean;
|
|
20
|
+
readonly status?: number;
|
|
21
|
+
readonly fieldErrors: readonly FieldError[];
|
|
22
|
+
readonly recovery?: RecoveryAction;
|
|
23
|
+
constructor(code: FinTaxErrorCode, message: string, options?: FinTaxErrorOptions);
|
|
24
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class FinTaxError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
retryable;
|
|
4
|
+
status;
|
|
5
|
+
fieldErrors;
|
|
6
|
+
recovery;
|
|
7
|
+
constructor(code, message, options = {}) {
|
|
8
|
+
super(message, { cause: options.cause });
|
|
9
|
+
this.name = 'FinTaxError';
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.retryable = options.retryable ?? false;
|
|
12
|
+
this.fieldErrors = options.fieldErrors ?? [];
|
|
13
|
+
if (options.status !== undefined) {
|
|
14
|
+
this.status = options.status;
|
|
15
|
+
}
|
|
16
|
+
if (options.recovery !== undefined) {
|
|
17
|
+
this.recovery = options.recovery;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=fintax-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fintax-error.js","sourceRoot":"","sources":["../../src/errors/fintax-error.ts"],"names":[],"mappings":"AA8BA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,SAAS,CAAU;IACnB,MAAM,CAAU;IAChB,WAAW,CAAwB;IACnC,QAAQ,CAAkB;IAEnC,YACE,IAAqB,EACrB,OAAe,EACf,UAA8B,EAAE;QAEhC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACnC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { FinTaxError } from './fintax-error.js';
|
|
3
|
+
function codeForStatus(status) {
|
|
4
|
+
if (status === 401)
|
|
5
|
+
return 'AUTH_REQUIRED';
|
|
6
|
+
if (status === 403)
|
|
7
|
+
return 'PERMISSION_DENIED';
|
|
8
|
+
if (status === 404)
|
|
9
|
+
return 'NOT_FOUND';
|
|
10
|
+
if (status === 409)
|
|
11
|
+
return 'CONFLICT';
|
|
12
|
+
if (status === 429)
|
|
13
|
+
return 'RATE_LIMITED';
|
|
14
|
+
if ([502, 503, 504].includes(status))
|
|
15
|
+
return 'UPSTREAM_UNAVAILABLE';
|
|
16
|
+
if (status >= 400 && status < 500)
|
|
17
|
+
return 'VALIDATION_FAILED';
|
|
18
|
+
return 'UPSTREAM_UNAVAILABLE';
|
|
19
|
+
}
|
|
20
|
+
function publicMessageForStatus(status) {
|
|
21
|
+
if (status === 401)
|
|
22
|
+
return 'FinTax authentication has expired; log in again';
|
|
23
|
+
if (status === 403)
|
|
24
|
+
return 'FinTax rejected the request';
|
|
25
|
+
if (status === 404)
|
|
26
|
+
return 'The requested FinTax resource does not exist';
|
|
27
|
+
if (status === 409)
|
|
28
|
+
return 'The FinTax request conflicts with the current business state';
|
|
29
|
+
if (status === 429)
|
|
30
|
+
return 'Too many FinTax requests; retry later';
|
|
31
|
+
if (status >= 400 && status < 500)
|
|
32
|
+
return 'FinTax rejected the request';
|
|
33
|
+
return 'The FinTax service is temporarily unavailable';
|
|
34
|
+
}
|
|
35
|
+
export function httpError(status, cause) {
|
|
36
|
+
return new FinTaxError(codeForStatus(status), publicMessageForStatus(status), {
|
|
37
|
+
status,
|
|
38
|
+
retryable: status === 429 || [502, 503, 504].includes(status),
|
|
39
|
+
cause,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export function normalizeError(error) {
|
|
43
|
+
if (error instanceof FinTaxError)
|
|
44
|
+
return error;
|
|
45
|
+
if (error instanceof z.ZodError) {
|
|
46
|
+
return new FinTaxError('UNKNOWN', 'FinTax MCP execution failed', {
|
|
47
|
+
cause: error,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (error instanceof DOMException &&
|
|
51
|
+
(error.name === 'TimeoutError' || error.name === 'AbortError')) {
|
|
52
|
+
return new FinTaxError('TIMEOUT', 'Upstream request timed out', {
|
|
53
|
+
retryable: true,
|
|
54
|
+
cause: error,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (error instanceof TypeError) {
|
|
58
|
+
return new FinTaxError('UPSTREAM_UNAVAILABLE', 'Unable to connect to the FinTax service', {
|
|
59
|
+
retryable: true,
|
|
60
|
+
cause: error,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return new FinTaxError('UNKNOWN', 'FinTax MCP execution failed', {
|
|
64
|
+
cause: error,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=normalize-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-error.js","sourceRoot":"","sources":["../../src/errors/normalize-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AAEtE,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,eAAe,CAAC;IAC3C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,mBAAmB,CAAC;IAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,UAAU,CAAC;IACtC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,sBAAsB,CAAC;IACpE,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,mBAAmB,CAAC;IAC9D,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAc;IAC5C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,iDAAiD,CAAC;IAC7E,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,6BAA6B,CAAC;IACzD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,8CAA8C,CAAC;IAC1E,IAAI,MAAM,KAAK,GAAG;QAChB,OAAO,8DAA8D,CAAC;IACxE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,uCAAuC,CAAC;IACnE,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,6BAA6B,CAAC;IACxE,OAAO,+CAA+C,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,KAAe;IACvD,OAAO,IAAI,WAAW,CACpB,aAAa,CAAC,MAAM,CAAC,EACrB,sBAAsB,CAAC,MAAM,CAAC,EAC9B;QACE,MAAM;QACN,SAAS,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7D,KAAK;KACN,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,KAAK,CAAC;IAE/C,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,6BAA6B,EAAE;YAC/D,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IAED,IACE,KAAK,YAAY,YAAY;QAC7B,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,EAC9D,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,4BAA4B,EAAE;YAC9D,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,WAAW,CACpB,sBAAsB,EACtB,yCAAyC,EACzC;YACE,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,KAAK;SACb,CACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,6BAA6B,EAAE;QAC/D,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ArtifactMetadata {
|
|
2
|
+
readonly artifactId: string;
|
|
3
|
+
readonly fileName: string;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly size: number;
|
|
6
|
+
readonly sha256: string;
|
|
7
|
+
readonly createdAt: string;
|
|
8
|
+
readonly expiresAt: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ArtifactStore {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(directory: string, ttlMs?: number);
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
create(bytes: Uint8Array, requestedFileName: string): Promise<ArtifactMetadata>;
|
|
15
|
+
resolve(artifactId: string): Promise<ArtifactMetadata>;
|
|
16
|
+
cleanup(limit: number): Promise<number>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readdir, realpath, stat, unlink, writeFile, } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { FinTaxError } from '../errors/fintax-error.js';
|
|
5
|
+
export class ArtifactStore {
|
|
6
|
+
#directory;
|
|
7
|
+
#ttlMs;
|
|
8
|
+
#artifacts = new Map();
|
|
9
|
+
constructor(directory, ttlMs = 24 * 60 * 60 * 1000) {
|
|
10
|
+
this.#directory = path.resolve(directory);
|
|
11
|
+
this.#ttlMs = ttlMs;
|
|
12
|
+
}
|
|
13
|
+
async initialize() {
|
|
14
|
+
await mkdir(this.#directory, { recursive: true, mode: 0o700 });
|
|
15
|
+
await this.cleanup(100);
|
|
16
|
+
}
|
|
17
|
+
async create(bytes, requestedFileName) {
|
|
18
|
+
await this.initialize();
|
|
19
|
+
const artifactId = randomUUID();
|
|
20
|
+
const extension = path.extname(requestedFileName).toLowerCase();
|
|
21
|
+
const safeExtension = /^\.[a-z0-9]{1,10}$/.test(extension)
|
|
22
|
+
? extension
|
|
23
|
+
: '.bin';
|
|
24
|
+
const storedFileName = `${artifactId}${safeExtension}`;
|
|
25
|
+
const artifactPath = path.join(this.#directory, storedFileName);
|
|
26
|
+
await writeFile(artifactPath, bytes, { flag: 'wx', mode: 0o600 });
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
const metadata = {
|
|
29
|
+
artifactId,
|
|
30
|
+
fileName: path.basename(requestedFileName),
|
|
31
|
+
path: artifactPath,
|
|
32
|
+
size: bytes.byteLength,
|
|
33
|
+
sha256: createHash('sha256').update(bytes).digest('hex'),
|
|
34
|
+
createdAt: new Date(now).toISOString(),
|
|
35
|
+
expiresAt: new Date(now + this.#ttlMs).toISOString(),
|
|
36
|
+
};
|
|
37
|
+
this.#artifacts.set(artifactId, metadata);
|
|
38
|
+
return metadata;
|
|
39
|
+
}
|
|
40
|
+
async resolve(artifactId) {
|
|
41
|
+
const metadata = this.#artifacts.get(artifactId);
|
|
42
|
+
if (metadata === undefined ||
|
|
43
|
+
Date.parse(metadata.expiresAt) <= Date.now()) {
|
|
44
|
+
throw new FinTaxError('NOT_FOUND', 'Artifact reference does not exist or has expired');
|
|
45
|
+
}
|
|
46
|
+
const resolved = await realpath(metadata.path);
|
|
47
|
+
if (resolved !== metadata.path) {
|
|
48
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Artifact reference is no longer valid');
|
|
49
|
+
}
|
|
50
|
+
const info = await stat(resolved);
|
|
51
|
+
if (!info.isFile()) {
|
|
52
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Artifact reference does not point to a regular file');
|
|
53
|
+
}
|
|
54
|
+
return metadata;
|
|
55
|
+
}
|
|
56
|
+
async cleanup(limit) {
|
|
57
|
+
await mkdir(this.#directory, { recursive: true, mode: 0o700 });
|
|
58
|
+
const entries = await readdir(this.#directory, { withFileTypes: true });
|
|
59
|
+
const cutoff = Date.now() - this.#ttlMs;
|
|
60
|
+
let removed = 0;
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
if (removed >= limit || !entry.isFile())
|
|
63
|
+
continue;
|
|
64
|
+
const candidate = path.join(this.#directory, entry.name);
|
|
65
|
+
const info = await stat(candidate);
|
|
66
|
+
if (info.mtimeMs >= cutoff)
|
|
67
|
+
continue;
|
|
68
|
+
await unlink(candidate);
|
|
69
|
+
removed += 1;
|
|
70
|
+
}
|
|
71
|
+
return removed;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=artifact-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../src/files/artifact-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ArtifactStore } from './artifact-store.js';
|
|
2
|
+
import type { RootsProvider } from './roots-provider.js';
|
|
3
|
+
export interface FileReference {
|
|
4
|
+
readonly kind: 'local_path' | 'artifact' | 'upload_id';
|
|
5
|
+
readonly value: string;
|
|
6
|
+
}
|
|
7
|
+
export interface InspectedFileContent {
|
|
8
|
+
readonly fileName: string;
|
|
9
|
+
readonly size: number;
|
|
10
|
+
readonly extension: '.csv' | '.xls' | '.xlsx';
|
|
11
|
+
readonly mimeType: string;
|
|
12
|
+
readonly sha256: string;
|
|
13
|
+
}
|
|
14
|
+
export interface InspectedFile extends InspectedFileContent {
|
|
15
|
+
readonly path: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class InputFilePolicy {
|
|
18
|
+
#private;
|
|
19
|
+
constructor(options: {
|
|
20
|
+
allowedDirectories: readonly string[];
|
|
21
|
+
maxBytes: number;
|
|
22
|
+
roots: RootsProvider;
|
|
23
|
+
artifacts: ArtifactStore;
|
|
24
|
+
});
|
|
25
|
+
inspect(reference: FileReference): Promise<InspectedFile>;
|
|
26
|
+
inspectBytes(bytes: Uint8Array, fileName: string): InspectedFileContent;
|
|
27
|
+
}
|
|
28
|
+
export declare function inspectImportContent(bytes: Uint8Array, fileName: string, maxBytes: number): InspectedFileContent;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { realpath, stat } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { FinTaxError } from '../errors/fintax-error.js';
|
|
5
|
+
function contains(parent, child) {
|
|
6
|
+
const relative = path.relative(parent, child);
|
|
7
|
+
return (relative === '' ||
|
|
8
|
+
(!relative.startsWith('..') && !path.isAbsolute(relative)));
|
|
9
|
+
}
|
|
10
|
+
export class InputFilePolicy {
|
|
11
|
+
#allowedDirectories;
|
|
12
|
+
#maxBytes;
|
|
13
|
+
#roots;
|
|
14
|
+
#artifacts;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.#allowedDirectories = options.allowedDirectories;
|
|
17
|
+
this.#maxBytes = options.maxBytes;
|
|
18
|
+
this.#roots = options.roots;
|
|
19
|
+
this.#artifacts = options.artifacts;
|
|
20
|
+
}
|
|
21
|
+
async inspect(reference) {
|
|
22
|
+
if (reference.kind === 'artifact') {
|
|
23
|
+
const artifact = await this.#artifacts.resolve(reference.value);
|
|
24
|
+
return this.#inspectFile(artifact.path, artifact.fileName);
|
|
25
|
+
}
|
|
26
|
+
if (reference.kind === 'upload_id') {
|
|
27
|
+
throw new FinTaxError('VALIDATION_FAILED', 'upload_id cannot be resolved by the current file-input policy');
|
|
28
|
+
}
|
|
29
|
+
const clientRoots = await this.#roots.getRoots();
|
|
30
|
+
if (clientRoots.length === 0) {
|
|
31
|
+
throw new FinTaxError('PERMISSION_DENIED', 'The MCP client did not declare roots, so local paths cannot be read');
|
|
32
|
+
}
|
|
33
|
+
if (this.#allowedDirectories.length === 0) {
|
|
34
|
+
throw new FinTaxError('PERMISSION_DENIED', 'No allowed import directory is configured on the server');
|
|
35
|
+
}
|
|
36
|
+
const resolved = await realpath(reference.value).catch((error) => {
|
|
37
|
+
throw new FinTaxError('NOT_FOUND', 'Import file does not exist', {
|
|
38
|
+
cause: error,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
const [allowed, roots] = await Promise.all([
|
|
42
|
+
Promise.all(this.#allowedDirectories.map((entry) => realpath(entry))),
|
|
43
|
+
Promise.all(clientRoots.map((entry) => realpath(entry))),
|
|
44
|
+
]);
|
|
45
|
+
if (!allowed.some((directory) => contains(directory, resolved))) {
|
|
46
|
+
throw new FinTaxError('PERMISSION_DENIED', 'File is outside the server allowlist');
|
|
47
|
+
}
|
|
48
|
+
if (!roots.some((directory) => contains(directory, resolved))) {
|
|
49
|
+
throw new FinTaxError('PERMISSION_DENIED', 'File is outside the MCP root');
|
|
50
|
+
}
|
|
51
|
+
return this.#inspectFile(resolved);
|
|
52
|
+
}
|
|
53
|
+
inspectBytes(bytes, fileName) {
|
|
54
|
+
return inspectImportContent(bytes, fileName, this.#maxBytes);
|
|
55
|
+
}
|
|
56
|
+
async #inspectFile(filePath, displayFileName = path.basename(filePath)) {
|
|
57
|
+
const info = await stat(filePath);
|
|
58
|
+
if (!info.isFile()) {
|
|
59
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Import target must be a regular file');
|
|
60
|
+
}
|
|
61
|
+
const bytes = await import('node:fs/promises').then(({ readFile }) => readFile(filePath));
|
|
62
|
+
return {
|
|
63
|
+
path: filePath,
|
|
64
|
+
...inspectImportContent(bytes, displayFileName, this.#maxBytes),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function inspectImportContent(bytes, fileName, maxBytes) {
|
|
69
|
+
if (bytes.byteLength === 0) {
|
|
70
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Import file must not be empty');
|
|
71
|
+
}
|
|
72
|
+
if (bytes.byteLength > maxBytes) {
|
|
73
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Import file exceeds the size limit');
|
|
74
|
+
}
|
|
75
|
+
const normalizedFileName = path.basename(fileName);
|
|
76
|
+
const extension = path.extname(normalizedFileName).toLowerCase();
|
|
77
|
+
if (!['.csv', '.xls', '.xlsx'].includes(extension)) {
|
|
78
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Only CSV, XLS, and XLSX files are supported');
|
|
79
|
+
}
|
|
80
|
+
const header = Buffer.from(bytes.subarray(0, 8));
|
|
81
|
+
let mimeType;
|
|
82
|
+
if (extension === '.xlsx') {
|
|
83
|
+
if (header[0] !== 0x50 || header[1] !== 0x4b) {
|
|
84
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Invalid XLSX file signature');
|
|
85
|
+
}
|
|
86
|
+
mimeType =
|
|
87
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
|
|
88
|
+
}
|
|
89
|
+
else if (extension === '.xls') {
|
|
90
|
+
if (header.subarray(0, 4).toString('hex') !== 'd0cf11e0') {
|
|
91
|
+
throw new FinTaxError('VALIDATION_FAILED', 'Invalid XLS file signature');
|
|
92
|
+
}
|
|
93
|
+
mimeType = 'application/vnd.ms-excel';
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
if (header.includes(0)) {
|
|
97
|
+
throw new FinTaxError('VALIDATION_FAILED', 'CSV file contains binary content');
|
|
98
|
+
}
|
|
99
|
+
mimeType = 'text/csv';
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
fileName: normalizedFileName,
|
|
103
|
+
size: bytes.byteLength,
|
|
104
|
+
extension: extension,
|
|
105
|
+
mimeType,
|
|
106
|
+
sha256: createHash('sha256').update(bytes).digest('hex'),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=input-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-policy.js","sourceRoot":"","sources":["../../src/files/input-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
export interface RootsProvider {
|
|
3
|
+
getRoots(): Promise<readonly string[]>;
|
|
4
|
+
}
|
|
5
|
+
export declare class StaticRootsProvider implements RootsProvider {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(roots: readonly string[]);
|
|
8
|
+
getRoots(): Promise<readonly string[]>;
|
|
9
|
+
}
|
|
10
|
+
export declare class McpRootsProvider implements RootsProvider {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(server: McpServer);
|
|
13
|
+
getRoots(): Promise<readonly string[]>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { RootsListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
export class StaticRootsProvider {
|
|
4
|
+
#roots;
|
|
5
|
+
constructor(roots) {
|
|
6
|
+
this.#roots = roots;
|
|
7
|
+
}
|
|
8
|
+
getRoots() {
|
|
9
|
+
return Promise.resolve(this.#roots);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class McpRootsProvider {
|
|
13
|
+
#server;
|
|
14
|
+
#roots;
|
|
15
|
+
constructor(server) {
|
|
16
|
+
this.#server = server;
|
|
17
|
+
server.server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {
|
|
18
|
+
this.#roots = undefined;
|
|
19
|
+
await this.getRoots();
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async getRoots() {
|
|
23
|
+
if (this.#roots !== undefined)
|
|
24
|
+
return this.#roots;
|
|
25
|
+
if (this.#server.server.getClientCapabilities()?.roots === undefined) {
|
|
26
|
+
this.#roots = [];
|
|
27
|
+
return this.#roots;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const result = await this.#server.server.listRoots();
|
|
31
|
+
this.#roots = result.roots.flatMap((root) => {
|
|
32
|
+
try {
|
|
33
|
+
const url = new URL(root.uri);
|
|
34
|
+
return url.protocol === 'file:' ? [fileURLToPath(url)] : [];
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
this.#roots = [];
|
|
43
|
+
}
|
|
44
|
+
return this.#roots;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=roots-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roots-provider.js","sourceRoot":"","sources":["../../src/files/roots-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,EAAE,kCAAkC,EAAE,MAAM,oCAAoC,CAAC;AAMxF,MAAM,OAAO,mBAAmB;IACrB,MAAM,CAAoB;IAEnC,YAAY,KAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,QAAQ;QACN,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,gBAAgB;IAClB,OAAO,CAAY;IAC5B,MAAM,CAAgC;IAEtC,YAAY,MAAiB;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAClC,kCAAkC,EAClC,KAAK,IAAI,EAAE;YACT,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAClD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1C,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createApplication } from './app/create-server.js';
|
|
3
|
+
import { loadConfig } from './config/load-config.js';
|
|
4
|
+
import { createStdioTransport } from './transport/stdio.js';
|
|
5
|
+
async function main() {
|
|
6
|
+
const config = loadConfig();
|
|
7
|
+
const application = createApplication({ config });
|
|
8
|
+
const server = application.server;
|
|
9
|
+
const transport = createStdioTransport();
|
|
10
|
+
let closing;
|
|
11
|
+
const close = () => {
|
|
12
|
+
if (closing !== undefined)
|
|
13
|
+
return closing;
|
|
14
|
+
closing = (async () => {
|
|
15
|
+
const timeout = setTimeout(() => {
|
|
16
|
+
process.stderr.write(`FinTax MCP shutdown timed out after ${config.FINTAX_SHUTDOWN_TIMEOUT_MS}ms\n`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}, config.FINTAX_SHUTDOWN_TIMEOUT_MS);
|
|
19
|
+
try {
|
|
20
|
+
await application.close();
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
24
|
+
process.stderr.write(`Failed to close fintax-mcp: ${message}\n`);
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
clearTimeout(timeout);
|
|
29
|
+
}
|
|
30
|
+
})();
|
|
31
|
+
return closing;
|
|
32
|
+
};
|
|
33
|
+
for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
|
|
34
|
+
process.once(signal, () => {
|
|
35
|
+
void close();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
process.stdin.once('end', () => {
|
|
39
|
+
void close();
|
|
40
|
+
});
|
|
41
|
+
await server.connect(transport);
|
|
42
|
+
await closing;
|
|
43
|
+
}
|
|
44
|
+
main().catch((error) => {
|
|
45
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
46
|
+
process.stderr.write(`Failed to start fintax-mcp: ${message}\n`);
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAClC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;IACzC,IAAI,OAAkC,CAAC;IAEvC,MAAM,KAAK,GAAG,GAAkB,EAAE;QAChC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;QAC1C,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,MAAM,CAAC,0BAA0B,MAAM,CAC/E,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,EAAE,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,OAAO,IAAI,CAAC,CAAC;gBACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,EAAE,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACxB,KAAK,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;QAC7B,KAAK,KAAK,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,OAAO,CAAC;AAChB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,OAAO,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import pino, {} from 'pino';
|
|
2
|
+
import { redact } from '../policies/redaction.js';
|
|
3
|
+
export function createLogger(config) {
|
|
4
|
+
return pino({
|
|
5
|
+
level: config.FINTAX_LOG_LEVEL,
|
|
6
|
+
base: null,
|
|
7
|
+
timestamp: pino.stdTimeFunctions.isoTime,
|
|
8
|
+
serializers: {
|
|
9
|
+
err: (error) => redact(error),
|
|
10
|
+
},
|
|
11
|
+
}, { write: (line) => process.stderr.write(line) });
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAe,MAAM,MAAM,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO,IAAI,CACT;QACE,KAAK,EAAE,MAAM,CAAC,gBAAgB;QAC9B,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;QACxC,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;SACvC;KACF,EACD,EAAE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CACxD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { LockManager } from '../concurrency/lock-manager.js';
|
|
2
|
+
import { FinTaxError } from '../errors/fintax-error.js';
|
|
3
|
+
export interface IdempotencyBinding {
|
|
4
|
+
readonly tool: string;
|
|
5
|
+
readonly key: string;
|
|
6
|
+
readonly fingerprint: string;
|
|
7
|
+
readonly userId: string;
|
|
8
|
+
readonly tenantId: string;
|
|
9
|
+
readonly orgId?: string;
|
|
10
|
+
readonly recovery?: {
|
|
11
|
+
readonly tool: string;
|
|
12
|
+
readonly input: Readonly<Record<string, unknown>>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export type IdempotencyClaim = {
|
|
16
|
+
readonly kind: 'started';
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: 'replayed';
|
|
19
|
+
readonly result: unknown;
|
|
20
|
+
};
|
|
21
|
+
export declare class IdempotencyManager {
|
|
22
|
+
#private;
|
|
23
|
+
constructor(locks: LockManager, options?: {
|
|
24
|
+
ttlMs?: number;
|
|
25
|
+
maxEntries?: number;
|
|
26
|
+
now?: () => number;
|
|
27
|
+
});
|
|
28
|
+
begin(binding: IdempotencyBinding): Promise<IdempotencyClaim>;
|
|
29
|
+
complete(binding: IdempotencyBinding, result: unknown): Promise<void>;
|
|
30
|
+
fail(binding: IdempotencyBinding, error: FinTaxError): Promise<void>;
|
|
31
|
+
abandon(binding: IdempotencyBinding): Promise<void>;
|
|
32
|
+
}
|