@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.
Files changed (341) hide show
  1. package/README.md +220 -0
  2. package/dist/app/create-server.d.ts +18 -0
  3. package/dist/app/create-server.js +80 -0
  4. package/dist/app/create-server.js.map +1 -0
  5. package/dist/app/register-tools.d.ts +4 -0
  6. package/dist/app/register-tools.js +18 -0
  7. package/dist/app/register-tools.js.map +1 -0
  8. package/dist/audit/audit-context.d.ts +38 -0
  9. package/dist/audit/audit-context.js +167 -0
  10. package/dist/audit/audit-context.js.map +1 -0
  11. package/dist/audit/audit-sink.d.ts +20 -0
  12. package/dist/audit/audit-sink.js +6 -0
  13. package/dist/audit/audit-sink.js.map +1 -0
  14. package/dist/audit/file-audit-sink.d.ts +6 -0
  15. package/dist/audit/file-audit-sink.js +18 -0
  16. package/dist/audit/file-audit-sink.js.map +1 -0
  17. package/dist/auth/auth-session.d.ts +63 -0
  18. package/dist/auth/auth-session.js +226 -0
  19. package/dist/auth/auth-session.js.map +1 -0
  20. package/dist/auth/credentials.d.ts +6 -0
  21. package/dist/auth/credentials.js +12 -0
  22. package/dist/auth/credentials.js.map +1 -0
  23. package/dist/auth/org-token-provider.d.ts +15 -0
  24. package/dist/auth/org-token-provider.js +62 -0
  25. package/dist/auth/org-token-provider.js.map +1 -0
  26. package/dist/capabilities/capability.d.ts +100 -0
  27. package/dist/capabilities/capability.js +26 -0
  28. package/dist/capabilities/capability.js.map +1 -0
  29. package/dist/capabilities/create-capabilities.d.ts +2 -0
  30. package/dist/capabilities/create-capabilities.js +37 -0
  31. package/dist/capabilities/create-capabilities.js.map +1 -0
  32. package/dist/capabilities/define-capability.d.ts +39 -0
  33. package/dist/capabilities/define-capability.js +64 -0
  34. package/dist/capabilities/define-capability.js.map +1 -0
  35. package/dist/capabilities/definitions/accounting-balances.d.ts +4 -0
  36. package/dist/capabilities/definitions/accounting-balances.js +98 -0
  37. package/dist/capabilities/definitions/accounting-balances.js.map +1 -0
  38. package/dist/capabilities/definitions/accounting-context.d.ts +2 -0
  39. package/dist/capabilities/definitions/accounting-context.js +17 -0
  40. package/dist/capabilities/definitions/accounting-context.js.map +1 -0
  41. package/dist/capabilities/definitions/assets.d.ts +2 -0
  42. package/dist/capabilities/definitions/assets.js +367 -0
  43. package/dist/capabilities/definitions/assets.js.map +1 -0
  44. package/dist/capabilities/definitions/business-documents.d.ts +9 -0
  45. package/dist/capabilities/definitions/business-documents.js +386 -0
  46. package/dist/capabilities/definitions/business-documents.js.map +1 -0
  47. package/dist/capabilities/definitions/dashboard.d.ts +2 -0
  48. package/dist/capabilities/definitions/dashboard.js +153 -0
  49. package/dist/capabilities/definitions/dashboard.js.map +1 -0
  50. package/dist/capabilities/definitions/extended-operation-contracts.d.ts +597 -0
  51. package/dist/capabilities/definitions/extended-operation-contracts.js +1180 -0
  52. package/dist/capabilities/definitions/extended-operation-contracts.js.map +1 -0
  53. package/dist/capabilities/definitions/extended-operations.d.ts +2 -0
  54. package/dist/capabilities/definitions/extended-operations.js +699 -0
  55. package/dist/capabilities/definitions/extended-operations.js.map +1 -0
  56. package/dist/capabilities/definitions/financial-reports.d.ts +2 -0
  57. package/dist/capabilities/definitions/financial-reports.js +100 -0
  58. package/dist/capabilities/definitions/financial-reports.js.map +1 -0
  59. package/dist/capabilities/definitions/fnd-import.d.ts +34 -0
  60. package/dist/capabilities/definitions/fnd-import.js +282 -0
  61. package/dist/capabilities/definitions/fnd-import.js.map +1 -0
  62. package/dist/capabilities/definitions/fund-accounts.d.ts +2 -0
  63. package/dist/capabilities/definitions/fund-accounts.js +188 -0
  64. package/dist/capabilities/definitions/fund-accounts.js.map +1 -0
  65. package/dist/capabilities/definitions/fund-balances.d.ts +2 -0
  66. package/dist/capabilities/definitions/fund-balances.js +84 -0
  67. package/dist/capabilities/definitions/fund-balances.js.map +1 -0
  68. package/dist/capabilities/definitions/journals.d.ts +10 -0
  69. package/dist/capabilities/definitions/journals.js +224 -0
  70. package/dist/capabilities/definitions/journals.js.map +1 -0
  71. package/dist/capabilities/definitions/master-data.d.ts +2 -0
  72. package/dist/capabilities/definitions/master-data.js +451 -0
  73. package/dist/capabilities/definitions/master-data.js.map +1 -0
  74. package/dist/capabilities/definitions/pnl.d.ts +2 -0
  75. package/dist/capabilities/definitions/pnl.js +139 -0
  76. package/dist/capabilities/definitions/pnl.js.map +1 -0
  77. package/dist/capabilities/definitions/reference-data.d.ts +2 -0
  78. package/dist/capabilities/definitions/reference-data.js +169 -0
  79. package/dist/capabilities/definitions/reference-data.js.map +1 -0
  80. package/dist/capabilities/definitions/transaction-drafts.d.ts +2 -0
  81. package/dist/capabilities/definitions/transaction-drafts.js +157 -0
  82. package/dist/capabilities/definitions/transaction-drafts.js.map +1 -0
  83. package/dist/capabilities/definitions/transactions.d.ts +168 -0
  84. package/dist/capabilities/definitions/transactions.js +79 -0
  85. package/dist/capabilities/definitions/transactions.js.map +1 -0
  86. package/dist/capabilities/executor.d.ts +19 -0
  87. package/dist/capabilities/executor.js +134 -0
  88. package/dist/capabilities/executor.js.map +1 -0
  89. package/dist/capabilities/registry.d.ts +7 -0
  90. package/dist/capabilities/registry.js +51 -0
  91. package/dist/capabilities/registry.js.map +1 -0
  92. package/dist/clients/base-client.d.ts +5 -0
  93. package/dist/clients/base-client.js +13 -0
  94. package/dist/clients/base-client.js.map +1 -0
  95. package/dist/clients/http-client.d.ts +29 -0
  96. package/dist/clients/http-client.js +167 -0
  97. package/dist/clients/http-client.js.map +1 -0
  98. package/dist/clients/suite-client.d.ts +5 -0
  99. package/dist/clients/suite-client.js +5 -0
  100. package/dist/clients/suite-client.js.map +1 -0
  101. package/dist/concurrency/lock-manager.d.ts +4 -0
  102. package/dist/concurrency/lock-manager.js +23 -0
  103. package/dist/concurrency/lock-manager.js.map +1 -0
  104. package/dist/config/load-config.d.ts +2 -0
  105. package/dist/config/load-config.js +18 -0
  106. package/dist/config/load-config.js.map +1 -0
  107. package/dist/config/schema.d.ts +24 -0
  108. package/dist/config/schema.js +85 -0
  109. package/dist/config/schema.js.map +1 -0
  110. package/dist/errors/fintax-error.d.ts +24 -0
  111. package/dist/errors/fintax-error.js +21 -0
  112. package/dist/errors/fintax-error.js.map +1 -0
  113. package/dist/errors/normalize-error.d.ts +3 -0
  114. package/dist/errors/normalize-error.js +67 -0
  115. package/dist/errors/normalize-error.js.map +1 -0
  116. package/dist/files/artifact-store.d.ts +17 -0
  117. package/dist/files/artifact-store.js +74 -0
  118. package/dist/files/artifact-store.js.map +1 -0
  119. package/dist/files/input-policy.d.ts +28 -0
  120. package/dist/files/input-policy.js +109 -0
  121. package/dist/files/input-policy.js.map +1 -0
  122. package/dist/files/roots-provider.d.ts +14 -0
  123. package/dist/files/roots-provider.js +47 -0
  124. package/dist/files/roots-provider.js.map +1 -0
  125. package/dist/index.d.ts +2 -0
  126. package/dist/index.js +49 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/logging/logger.d.ts +3 -0
  129. package/dist/logging/logger.js +13 -0
  130. package/dist/logging/logger.js.map +1 -0
  131. package/dist/policies/idempotency.d.ts +32 -0
  132. package/dist/policies/idempotency.js +155 -0
  133. package/dist/policies/idempotency.js.map +1 -0
  134. package/dist/policies/job-reference.d.ts +16 -0
  135. package/dist/policies/job-reference.js +62 -0
  136. package/dist/policies/job-reference.js.map +1 -0
  137. package/dist/policies/operation-plan.d.ts +27 -0
  138. package/dist/policies/operation-plan.js +99 -0
  139. package/dist/policies/operation-plan.js.map +1 -0
  140. package/dist/policies/redaction.d.ts +2 -0
  141. package/dist/policies/redaction.js +29 -0
  142. package/dist/policies/redaction.js.map +1 -0
  143. package/dist/policies/retry.d.ts +8 -0
  144. package/dist/policies/retry.js +19 -0
  145. package/dist/policies/retry.js.map +1 -0
  146. package/dist/responses/tool-response.d.ts +4 -0
  147. package/dist/responses/tool-response.js +24 -0
  148. package/dist/responses/tool-response.js.map +1 -0
  149. package/dist/schemas/common.d.ts +226 -0
  150. package/dist/schemas/common.js +133 -0
  151. package/dist/schemas/common.js.map +1 -0
  152. package/dist/schemas/domains/accounting-balances.d.ts +497 -0
  153. package/dist/schemas/domains/accounting-balances.js +226 -0
  154. package/dist/schemas/domains/accounting-balances.js.map +1 -0
  155. package/dist/schemas/domains/accounting-context.d.ts +118 -0
  156. package/dist/schemas/domains/accounting-context.js +54 -0
  157. package/dist/schemas/domains/accounting-context.js.map +1 -0
  158. package/dist/schemas/domains/assets.d.ts +2508 -0
  159. package/dist/schemas/domains/assets.js +960 -0
  160. package/dist/schemas/domains/assets.js.map +1 -0
  161. package/dist/schemas/domains/business-documents.d.ts +4406 -0
  162. package/dist/schemas/domains/business-documents.js +1153 -0
  163. package/dist/schemas/domains/business-documents.js.map +1 -0
  164. package/dist/schemas/domains/configuration.d.ts +518 -0
  165. package/dist/schemas/domains/configuration.js +504 -0
  166. package/dist/schemas/domains/configuration.js.map +1 -0
  167. package/dist/schemas/domains/dashboard.d.ts +339 -0
  168. package/dist/schemas/domains/dashboard.js +211 -0
  169. package/dist/schemas/domains/dashboard.js.map +1 -0
  170. package/dist/schemas/domains/extended-operation-results.d.ts +1588 -0
  171. package/dist/schemas/domains/extended-operation-results.js +275 -0
  172. package/dist/schemas/domains/extended-operation-results.js.map +1 -0
  173. package/dist/schemas/domains/extended-operations.d.ts +1061 -0
  174. package/dist/schemas/domains/extended-operations.js +567 -0
  175. package/dist/schemas/domains/extended-operations.js.map +1 -0
  176. package/dist/schemas/domains/extended-query-results.d.ts +1688 -0
  177. package/dist/schemas/domains/extended-query-results.js +337 -0
  178. package/dist/schemas/domains/extended-query-results.js.map +1 -0
  179. package/dist/schemas/domains/financial-reports.d.ts +540 -0
  180. package/dist/schemas/domains/financial-reports.js +206 -0
  181. package/dist/schemas/domains/financial-reports.js.map +1 -0
  182. package/dist/schemas/domains/fnd-import.d.ts +912 -0
  183. package/dist/schemas/domains/fnd-import.js +396 -0
  184. package/dist/schemas/domains/fnd-import.js.map +1 -0
  185. package/dist/schemas/domains/fund-accounts.d.ts +1092 -0
  186. package/dist/schemas/domains/fund-accounts.js +410 -0
  187. package/dist/schemas/domains/fund-accounts.js.map +1 -0
  188. package/dist/schemas/domains/fund-balances.d.ts +476 -0
  189. package/dist/schemas/domains/fund-balances.js +233 -0
  190. package/dist/schemas/domains/fund-balances.js.map +1 -0
  191. package/dist/schemas/domains/journals.d.ts +1619 -0
  192. package/dist/schemas/domains/journals.js +615 -0
  193. package/dist/schemas/domains/journals.js.map +1 -0
  194. package/dist/schemas/domains/master-data.d.ts +2010 -0
  195. package/dist/schemas/domains/master-data.js +799 -0
  196. package/dist/schemas/domains/master-data.js.map +1 -0
  197. package/dist/schemas/domains/pnl.d.ts +837 -0
  198. package/dist/schemas/domains/pnl.js +469 -0
  199. package/dist/schemas/domains/pnl.js.map +1 -0
  200. package/dist/schemas/domains/reference-data.d.ts +227 -0
  201. package/dist/schemas/domains/reference-data.js +144 -0
  202. package/dist/schemas/domains/reference-data.js.map +1 -0
  203. package/dist/schemas/domains/transaction-drafts.d.ts +903 -0
  204. package/dist/schemas/domains/transaction-drafts.js +242 -0
  205. package/dist/schemas/domains/transaction-drafts.js.map +1 -0
  206. package/dist/schemas/domains/transactions.d.ts +910 -0
  207. package/dist/schemas/domains/transactions.js +266 -0
  208. package/dist/schemas/domains/transactions.js.map +1 -0
  209. package/dist/schemas/primitives.d.ts +6 -0
  210. package/dist/schemas/primitives.js +11 -0
  211. package/dist/schemas/primitives.js.map +1 -0
  212. package/dist/schemas/public-input.d.ts +3 -0
  213. package/dist/schemas/public-input.js +524 -0
  214. package/dist/schemas/public-input.js.map +1 -0
  215. package/dist/tools/core-edit/idempotent-write.d.ts +23 -0
  216. package/dist/tools/core-edit/idempotent-write.js +58 -0
  217. package/dist/tools/core-edit/idempotent-write.js.map +1 -0
  218. package/dist/tools/core-edit/save-asset.d.ts +5 -0
  219. package/dist/tools/core-edit/save-asset.js +334 -0
  220. package/dist/tools/core-edit/save-asset.js.map +1 -0
  221. package/dist/tools/core-edit/save-business-document-draft.d.ts +2 -0
  222. package/dist/tools/core-edit/save-business-document-draft.js +128 -0
  223. package/dist/tools/core-edit/save-business-document-draft.js.map +1 -0
  224. package/dist/tools/core-edit/save-fund-account.d.ts +2 -0
  225. package/dist/tools/core-edit/save-fund-account.js +138 -0
  226. package/dist/tools/core-edit/save-fund-account.js.map +1 -0
  227. package/dist/tools/core-edit/save-journal-draft.d.ts +2 -0
  228. package/dist/tools/core-edit/save-journal-draft.js +122 -0
  229. package/dist/tools/core-edit/save-journal-draft.js.map +1 -0
  230. package/dist/tools/core-edit/save-master-data.d.ts +2 -0
  231. package/dist/tools/core-edit/save-master-data.js +153 -0
  232. package/dist/tools/core-edit/save-master-data.js.map +1 -0
  233. package/dist/tools/core-edit/save-transaction-draft.d.ts +2 -0
  234. package/dist/tools/core-edit/save-transaction-draft.js +128 -0
  235. package/dist/tools/core-edit/save-transaction-draft.js.map +1 -0
  236. package/dist/tools/core-read/export-business-documents.d.ts +2 -0
  237. package/dist/tools/core-read/export-business-documents.js +67 -0
  238. package/dist/tools/core-read/export-business-documents.js.map +1 -0
  239. package/dist/tools/core-read/export-journals.d.ts +2 -0
  240. package/dist/tools/core-read/export-journals.js +56 -0
  241. package/dist/tools/core-read/export-journals.js.map +1 -0
  242. package/dist/tools/core-read/export-transactions.d.ts +2 -0
  243. package/dist/tools/core-read/export-transactions.js +67 -0
  244. package/dist/tools/core-read/export-transactions.js.map +1 -0
  245. package/dist/tools/core-read/query-accounting-balances.d.ts +2 -0
  246. package/dist/tools/core-read/query-accounting-balances.js +135 -0
  247. package/dist/tools/core-read/query-accounting-balances.js.map +1 -0
  248. package/dist/tools/core-read/query-accounting-context.d.ts +2 -0
  249. package/dist/tools/core-read/query-accounting-context.js +76 -0
  250. package/dist/tools/core-read/query-accounting-context.js.map +1 -0
  251. package/dist/tools/core-read/query-assets.d.ts +2 -0
  252. package/dist/tools/core-read/query-assets.js +425 -0
  253. package/dist/tools/core-read/query-assets.js.map +1 -0
  254. package/dist/tools/core-read/query-business-documents.d.ts +9 -0
  255. package/dist/tools/core-read/query-business-documents.js +620 -0
  256. package/dist/tools/core-read/query-business-documents.js.map +1 -0
  257. package/dist/tools/core-read/query-dashboard.d.ts +2 -0
  258. package/dist/tools/core-read/query-dashboard.js +144 -0
  259. package/dist/tools/core-read/query-dashboard.js.map +1 -0
  260. package/dist/tools/core-read/query-financial-reports.d.ts +2 -0
  261. package/dist/tools/core-read/query-financial-reports.js +171 -0
  262. package/dist/tools/core-read/query-financial-reports.js.map +1 -0
  263. package/dist/tools/core-read/query-fund-accounts.d.ts +2 -0
  264. package/dist/tools/core-read/query-fund-accounts.js +140 -0
  265. package/dist/tools/core-read/query-fund-accounts.js.map +1 -0
  266. package/dist/tools/core-read/query-fund-balances.d.ts +2 -0
  267. package/dist/tools/core-read/query-fund-balances.js +150 -0
  268. package/dist/tools/core-read/query-fund-balances.js.map +1 -0
  269. package/dist/tools/core-read/query-journals.d.ts +2 -0
  270. package/dist/tools/core-read/query-journals.js +277 -0
  271. package/dist/tools/core-read/query-journals.js.map +1 -0
  272. package/dist/tools/core-read/query-master-data.d.ts +2 -0
  273. package/dist/tools/core-read/query-master-data.js +363 -0
  274. package/dist/tools/core-read/query-master-data.js.map +1 -0
  275. package/dist/tools/core-read/query-pnl.d.ts +2 -0
  276. package/dist/tools/core-read/query-pnl.js +244 -0
  277. package/dist/tools/core-read/query-pnl.js.map +1 -0
  278. package/dist/tools/core-read/query-reference-data.d.ts +2 -0
  279. package/dist/tools/core-read/query-reference-data.js +293 -0
  280. package/dist/tools/core-read/query-reference-data.js.map +1 -0
  281. package/dist/tools/core-read/query-transactions.d.ts +2 -0
  282. package/dist/tools/core-read/query-transactions.js +58 -0
  283. package/dist/tools/core-read/query-transactions.js.map +1 -0
  284. package/dist/tools/create-tools.d.ts +3 -0
  285. package/dist/tools/create-tools.js +88 -0
  286. package/dist/tools/create-tools.js.map +1 -0
  287. package/dist/tools/extended/asset-operation-tools.d.ts +9 -0
  288. package/dist/tools/extended/asset-operation-tools.js +419 -0
  289. package/dist/tools/extended/asset-operation-tools.js.map +1 -0
  290. package/dist/tools/extended/automation-tools.d.ts +7 -0
  291. package/dist/tools/extended/automation-tools.js +333 -0
  292. package/dist/tools/extended/automation-tools.js.map +1 -0
  293. package/dist/tools/extended/configuration-tools.d.ts +14 -0
  294. package/dist/tools/extended/configuration-tools.js +871 -0
  295. package/dist/tools/extended/configuration-tools.js.map +1 -0
  296. package/dist/tools/extended/period-end-tools.d.ts +11 -0
  297. package/dist/tools/extended/period-end-tools.js +480 -0
  298. package/dist/tools/extended/period-end-tools.js.map +1 -0
  299. package/dist/tools/extended/query-output.d.ts +2589 -0
  300. package/dist/tools/extended/query-output.js +610 -0
  301. package/dist/tools/extended/query-output.js.map +1 -0
  302. package/dist/tools/extended/tool-support.d.ts +56 -0
  303. package/dist/tools/extended/tool-support.js +198 -0
  304. package/dist/tools/extended/tool-support.js.map +1 -0
  305. package/dist/tools/extended/workflow-tools.d.ts +10 -0
  306. package/dist/tools/extended/workflow-tools.js +678 -0
  307. package/dist/tools/extended/workflow-tools.js.map +1 -0
  308. package/dist/tools/fnd-import/execute-import.d.ts +2 -0
  309. package/dist/tools/fnd-import/execute-import.js +201 -0
  310. package/dist/tools/fnd-import/execute-import.js.map +1 -0
  311. package/dist/tools/fnd-import/get-import-template.d.ts +2 -0
  312. package/dist/tools/fnd-import/get-import-template.js +66 -0
  313. package/dist/tools/fnd-import/get-import-template.js.map +1 -0
  314. package/dist/tools/fnd-import/get-job-status.d.ts +8 -0
  315. package/dist/tools/fnd-import/get-job-status.js +201 -0
  316. package/dist/tools/fnd-import/get-job-status.js.map +1 -0
  317. package/dist/tools/fnd-import/prepare-import.d.ts +31 -0
  318. package/dist/tools/fnd-import/prepare-import.js +214 -0
  319. package/dist/tools/fnd-import/prepare-import.js.map +1 -0
  320. package/dist/tools/fnd-import/public-import-result.d.ts +18 -0
  321. package/dist/tools/fnd-import/public-import-result.js +35 -0
  322. package/dist/tools/fnd-import/public-import-result.js.map +1 -0
  323. package/dist/tools/tool-definition.d.ts +45 -0
  324. package/dist/tools/tool-definition.js +11 -0
  325. package/dist/tools/tool-definition.js.map +1 -0
  326. package/dist/tools/tool-handler.d.ts +27 -0
  327. package/dist/tools/tool-handler.js +196 -0
  328. package/dist/tools/tool-handler.js.map +1 -0
  329. package/dist/tools/transaction-item.d.ts +225 -0
  330. package/dist/tools/transaction-item.js +109 -0
  331. package/dist/tools/transaction-item.js.map +1 -0
  332. package/dist/transport/draining-transport.d.ts +14 -0
  333. package/dist/transport/draining-transport.js +36 -0
  334. package/dist/transport/draining-transport.js.map +1 -0
  335. package/dist/transport/stdio.d.ts +2 -0
  336. package/dist/transport/stdio.js +5 -0
  337. package/dist/transport/stdio.js.map +1 -0
  338. package/dist/version.d.ts +2 -0
  339. package/dist/version.js +3 -0
  340. package/dist/version.js.map +1 -0
  341. 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,3 @@
1
+ import { FinTaxError } from './fintax-error.js';
2
+ export declare function httpError(status: number, cause?: unknown): FinTaxError;
3
+ export declare function normalizeError(error: unknown): FinTaxError;
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAqBxD,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAa;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CACL,QAAQ,KAAK,EAAE;QACf,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,eAAe;IACjB,mBAAmB,CAAoB;IACvC,SAAS,CAAS;IAClB,MAAM,CAAgB;IACtB,UAAU,CAAgB;IAEnC,YAAY,OAKX;QACC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAwB;QACpC,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,+DAA+D,CAChE,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,4BAA4B,EAAE;gBAC/D,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;SACzD,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,sCAAsC,CACvC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,8BAA8B,CAC/B,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,YAAY,CAAC,KAAiB,EAAE,QAAgB;QAC9C,OAAO,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAEzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,sCAAsC,CACvC,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CACnE,QAAQ,CAAC,QAAQ,CAAC,CACnB,CAAC;QACF,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,GAAG,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC;SAChE,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAiB,EACjB,QAAgB,EAChB,QAAgB;IAEhB,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,+BAA+B,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,GAAG,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,oCAAoC,CACrC,CAAC;IACJ,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjD,IAAI,QAAgB,CAAC;IACrB,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,CAAC;QAC5E,CAAC;QACD,QAAQ;YACN,mEAAmE,CAAC;IACxE,CAAC;SAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,UAAU,EAAE,CAAC;YACzD,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,4BAA4B,CAAC,CAAC;QAC3E,CAAC;QACD,QAAQ,GAAG,0BAA0B,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,WAAW,CACnB,mBAAmB,EACnB,kCAAkC,CACnC,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,KAAK,CAAC,UAAU;QACtB,SAAS,EAAE,SAA8C;QACzD,QAAQ;QACR,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KACzD,CAAC;AACJ,CAAC"}
@@ -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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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,3 @@
1
+ import { type Logger } from 'pino';
2
+ import type { RuntimeConfig } from '../config/schema.js';
3
+ export declare function createLogger(config: RuntimeConfig): Logger;
@@ -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
+ }