@raytio/mcp-server 9.2.1 → 9.4.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 (102) hide show
  1. package/README.md +12 -7
  2. package/config.env.example +10 -3
  3. package/dist/authorization.d.ts +12 -0
  4. package/dist/authorization.d.ts.map +1 -1
  5. package/dist/authorization.js +30 -0
  6. package/dist/authorization.js.map +1 -1
  7. package/dist/config.d.ts +21 -17
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +21 -6
  10. package/dist/config.js.map +1 -1
  11. package/dist/index.js +9 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/tools/_shared/finance-idempotency.d.ts +52 -0
  14. package/dist/tools/_shared/finance-idempotency.d.ts.map +1 -0
  15. package/dist/tools/_shared/finance-idempotency.js +79 -0
  16. package/dist/tools/_shared/finance-idempotency.js.map +1 -0
  17. package/dist/tools/_shared/money.d.ts +10 -0
  18. package/dist/tools/_shared/money.d.ts.map +1 -0
  19. package/dist/tools/_shared/money.js +90 -0
  20. package/dist/tools/_shared/money.js.map +1 -0
  21. package/dist/tools/_shared/soft-deactivate.d.ts +2 -1
  22. package/dist/tools/_shared/soft-deactivate.d.ts.map +1 -1
  23. package/dist/tools/_shared/soft-deactivate.js +2 -1
  24. package/dist/tools/_shared/soft-deactivate.js.map +1 -1
  25. package/dist/tools/domains.d.ts.map +1 -1
  26. package/dist/tools/domains.js +18 -0
  27. package/dist/tools/domains.js.map +1 -1
  28. package/dist/tools/dsm/index.d.ts.map +1 -1
  29. package/dist/tools/dsm/index.js +10 -2
  30. package/dist/tools/dsm/index.js.map +1 -1
  31. package/dist/tools/fap/fap-invoice-hold-place.d.ts +14 -0
  32. package/dist/tools/fap/fap-invoice-hold-place.d.ts.map +1 -0
  33. package/dist/tools/fap/fap-invoice-hold-place.js +62 -0
  34. package/dist/tools/fap/fap-invoice-hold-place.js.map +1 -0
  35. package/dist/tools/fap/fap-invoice-hold-release.d.ts +19 -0
  36. package/dist/tools/fap/fap-invoice-hold-release.d.ts.map +1 -0
  37. package/dist/tools/fap/fap-invoice-hold-release.js +65 -0
  38. package/dist/tools/fap/fap-invoice-hold-release.js.map +1 -0
  39. package/dist/tools/fap/fap-supplier-bill-create.d.ts +14 -0
  40. package/dist/tools/fap/fap-supplier-bill-create.d.ts.map +1 -0
  41. package/dist/tools/fap/fap-supplier-bill-create.js +90 -0
  42. package/dist/tools/fap/fap-supplier-bill-create.js.map +1 -0
  43. package/dist/tools/fap/fap-supplier-bill-line-add.d.ts +8 -0
  44. package/dist/tools/fap/fap-supplier-bill-line-add.d.ts.map +1 -0
  45. package/dist/tools/fap/fap-supplier-bill-line-add.js +75 -0
  46. package/dist/tools/fap/fap-supplier-bill-line-add.js.map +1 -0
  47. package/dist/tools/fap/fap-supplier-create.d.ts +9 -0
  48. package/dist/tools/fap/fap-supplier-create.d.ts.map +1 -0
  49. package/dist/tools/fap/fap-supplier-create.js +53 -0
  50. package/dist/tools/fap/fap-supplier-create.js.map +1 -0
  51. package/dist/tools/fap/fap-supplier-status-set.d.ts +8 -0
  52. package/dist/tools/fap/fap-supplier-status-set.d.ts.map +1 -0
  53. package/dist/tools/fap/fap-supplier-status-set.js +62 -0
  54. package/dist/tools/fap/fap-supplier-status-set.js.map +1 -0
  55. package/dist/tools/fap/fap-supplier-update.d.ts +8 -0
  56. package/dist/tools/fap/fap-supplier-update.d.ts.map +1 -0
  57. package/dist/tools/fap/fap-supplier-update.js +51 -0
  58. package/dist/tools/fap/fap-supplier-update.js.map +1 -0
  59. package/dist/tools/fap/generated-reads.d.ts +5 -0
  60. package/dist/tools/fap/generated-reads.d.ts.map +1 -0
  61. package/dist/tools/fap/generated-reads.js +19 -0
  62. package/dist/tools/fap/generated-reads.js.map +1 -0
  63. package/dist/tools/fap/index.d.ts +5 -0
  64. package/dist/tools/fap/index.d.ts.map +1 -0
  65. package/dist/tools/fap/index.js +21 -0
  66. package/dist/tools/fap/index.js.map +1 -0
  67. package/dist/tools/far/far-cash-receipt-record.d.ts +27 -0
  68. package/dist/tools/far/far-cash-receipt-record.d.ts.map +1 -0
  69. package/dist/tools/far/far-cash-receipt-record.js +101 -0
  70. package/dist/tools/far/far-cash-receipt-record.js.map +1 -0
  71. package/dist/tools/far/far-customer-create.d.ts +12 -0
  72. package/dist/tools/far/far-customer-create.d.ts.map +1 -0
  73. package/dist/tools/far/far-customer-create.js +54 -0
  74. package/dist/tools/far/far-customer-create.js.map +1 -0
  75. package/dist/tools/far/far-customer-invoice-create.d.ts +13 -0
  76. package/dist/tools/far/far-customer-invoice-create.d.ts.map +1 -0
  77. package/dist/tools/far/far-customer-invoice-create.js +76 -0
  78. package/dist/tools/far/far-customer-invoice-create.js.map +1 -0
  79. package/dist/tools/far/far-customer-invoice-line-add.d.ts +10 -0
  80. package/dist/tools/far/far-customer-invoice-line-add.d.ts.map +1 -0
  81. package/dist/tools/far/far-customer-invoice-line-add.js +77 -0
  82. package/dist/tools/far/far-customer-invoice-line-add.js.map +1 -0
  83. package/dist/tools/far/far-customer-status-set.d.ts +15 -0
  84. package/dist/tools/far/far-customer-status-set.d.ts.map +1 -0
  85. package/dist/tools/far/far-customer-status-set.js +70 -0
  86. package/dist/tools/far/far-customer-status-set.js.map +1 -0
  87. package/dist/tools/far/far-customer-update.d.ts +10 -0
  88. package/dist/tools/far/far-customer-update.d.ts.map +1 -0
  89. package/dist/tools/far/far-customer-update.js +51 -0
  90. package/dist/tools/far/far-customer-update.js.map +1 -0
  91. package/dist/tools/far/generated-reads.d.ts +5 -0
  92. package/dist/tools/far/generated-reads.d.ts.map +1 -0
  93. package/dist/tools/far/generated-reads.js +25 -0
  94. package/dist/tools/far/generated-reads.js.map +1 -0
  95. package/dist/tools/far/index.d.ts +5 -0
  96. package/dist/tools/far/index.d.ts.map +1 -0
  97. package/dist/tools/far/index.js +19 -0
  98. package/dist/tools/far/index.js.map +1 -0
  99. package/dist/tools/role-mapping.d.ts.map +1 -1
  100. package/dist/tools/role-mapping.js +12 -0
  101. package/dist/tools/role-mapping.js.map +1 -1
  102. package/package.json +1 -1
package/README.md CHANGED
@@ -43,15 +43,12 @@ RAYTIO_COGNITO_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxx
43
43
  RAYTIO_COGNITO_REGION=us-east-1
44
44
  RAYTIO_AGENT_USERNAME=agent@example.com
45
45
  RAYTIO_AGENT_PASSWORD=...
46
- RAYTIO_AGENT_ENCRYPTION_PASSWORD=...
47
- RAYTIO_AGENT_CUSTOMER_ID=00000000-0000-0000-0000-000000000000
48
- RAYTIO_TARGET_USER_EMAIL=user@example.com
49
- # Optional: static override for tool domains (see "Tool domain selection" below).
50
- # If unset, domains are resolved dynamically from the user's backend roles.
51
- # RAYTIO_TOOL_DOMAINS=ppm-readonly
46
+ RAYTIO_TOOL_DOMAINS=ppm,wrm
52
47
  EOF
53
48
  ```
54
49
 
50
+ This is a minimal PPM/WRM-only configuration; the account must still have the corresponding backend permissions. To enable DSM, include `dsm` in the domain selection and supply both `RAYTIO_AGENT_CUSTOMER_ID` (UUID) and `RAYTIO_AGENT_ENCRYPTION_PASSWORD`. After role/domain resolution, startup fails if a selected DSM tool needs either missing variable, naming only the missing env vars. This also applies when domains are resolved dynamically. `RAYTIO_TARGET_USER_EMAIL` is optional and retained for compatibility; no tool uses it.
51
+
55
52
  Then register the MCP server, passing only the pointer:
56
53
 
57
54
  ```bash
@@ -181,6 +178,14 @@ Set `RAYTIO_TOOL_DOMAINS` (comma-separated) to bypass dynamic resolution entirel
181
178
  - **Restrict** an agent below its actual role (e.g. force `ppm-readonly` even though the account has `PROJECT_USER`).
182
179
  - **Lock in** a known domain set regardless of backend role changes.
183
180
 
181
+ #### Tool allow-list with `RAYTIO_ENABLED_TOOLS`
182
+
183
+ Domains are the narrowest built-in filter, and `ppm` and `wrm` each hold many write tools. To expose specific tools, set `RAYTIO_ENABLED_TOOLS` to a comma-separated list of tool names, for example `RAYTIO_ENABLED_TOOLS=ppm_work_item_get,wrm_role_memory_list`.
184
+
185
+ The list is applied after the role-domain and capability filters, so it can only narrow what the user may access. A tool outside it is neither listed nor callable. If the variable is unset, there is no extra restriction. If it is set but blank, the server exposes no tools. Names the user can't access are skipped and logged to stderr.
186
+
187
+ raytio-auto sets this for each run from the agent's WRM tool bindings, which enforces them even when the MCP client runs with its own permission checks bypassed.
188
+
184
189
  **Available domains** (source: `src/tools/domains.ts`, also listed at the top of `docs/tools.md`):
185
190
 
186
191
  | Domain ID | Notes |
@@ -258,7 +263,7 @@ RAYTIO_AGENT_PASSWORD=your-agent-password
258
263
  RAYTIO_AGENT_ENCRYPTION_PASSWORD=your-encryption-password
259
264
  RAYTIO_AGENT_CUSTOMER_ID=00000000-0000-0000-0000-000000000000
260
265
 
261
- # Target User
266
+ # Optional legacy target user (unused by tools)
262
267
  RAYTIO_TARGET_USER_EMAIL=user@example.com
263
268
 
264
269
  # Optional: Embedding Settings for semantic memory tools. The API URL accepts
@@ -7,20 +7,27 @@ RAYTIO_COGNITO_REGION=us-east-1
7
7
  # Agent User Credentials
8
8
  RAYTIO_AGENT_USERNAME=agent-assistant@example.com
9
9
  RAYTIO_AGENT_PASSWORD=your-agent-password-here
10
+ # DSM only: required when the resolved DSM tools need them; otherwise omit.
10
11
  RAYTIO_AGENT_ENCRYPTION_PASSWORD=your-encryption-password-here
11
12
  RAYTIO_AGENT_CUSTOMER_ID=00000000-0000-0000-0000-000000000000
12
13
 
13
- # Target User
14
+ # Optional legacy target user (unused by tools; may be omitted)
14
15
  RAYTIO_TARGET_USER_EMAIL=user@example.com
15
16
 
16
17
  # Optional: static override for which tool domains are exposed (comma-separated).
17
- # If set, bypasses dynamic role-based resolution entirely.
18
+ # If set, restricts the domains allowed by the user's backend roles.
18
19
  # If unset, the server queries the user's backend roles at startup and exposes
19
20
  # only the domains the user has permissions for.
20
21
  # Run `npm run docs:tools` to see available domain IDs.
21
- # Example: RAYTIO_TOOL_DOMAINS=ppm-readonly
22
+ # Minimal PPM/WRM setup: omit both DSM-only variables and target email.
23
+ # RAYTIO_TOOL_DOMAINS=ppm,wrm
22
24
  # RAYTIO_TOOL_DOMAINS=dsm,ppm
23
25
 
26
+ # Optional: expose only these tools (comma-separated tool names). Applied after
27
+ # the domain and capability filters, so it can only narrow access. Unset means
28
+ # no extra restriction; set but blank exposes no tools.
29
+ # RAYTIO_ENABLED_TOOLS=ppm_work_item_get,wrm_role_memory_list
30
+
24
31
  # Optional: Embedding Settings for semantic memory tools. The URL may be an
25
32
  # API base (with or without /v1) or the full /v1/embeddings endpoint.
26
33
  RAYTIO_EMBEDDING_API_KEY=your-embedding-api-key-here
@@ -50,5 +50,17 @@ export declare function resolveToolDomains(apiClient: RaytioApiClient, envSpec:
50
50
  * explicit affirmation, not a fallthrough.
51
51
  */
52
52
  export declare function filterToolsByCapabilities(tools: readonly Tool[], capabilities: EffectiveCapabilityIndex, logger?: StderrLogger): Tool[];
53
+ /**
54
+ * Restrict the tool surface to an explicit allow-list (`RAYTIO_ENABLED_TOOLS`,
55
+ * comma-separated wire tool names). Runners pass a role's WRM tool bindings
56
+ * here so the limit holds even for clients that bypass their own permission
57
+ * checks.
58
+ *
59
+ * Applied after the role-domain and capability filters, so it can only narrow
60
+ * the surface: a named tool those filters removed stays hidden. Unset means no
61
+ * restriction. Set but blank exposes nothing, because a caller that asked for
62
+ * a limit must not silently receive every tool.
63
+ */
64
+ export declare function filterToolsByAllowlist(tools: readonly Tool[], spec: string | undefined, logger?: StderrLogger): Tool[];
53
65
  export {};
54
66
  //# sourceMappingURL=authorization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,EAEzB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAG3C;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,mHAAmH;IACnH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACzC;AAED,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAoD3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,GAAE,YAAsB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAqE9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,YAAY,EAAE,wBAAwB,EACtC,MAAM,GAAE,YAAsB,GAC7B,IAAI,EAAE,CA8BR"}
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,EAEzB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAG3C;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,mHAAmH;IACnH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACzC;AAED,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAsD3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,GAAE,YAAsB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAqE9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,YAAY,EAAE,wBAAwB,EACtC,MAAM,GAAE,YAAsB,GAC7B,IAAI,EAAE,CA8BR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,GAAE,YAAsB,GAC7B,IAAI,EAAE,CAkBR"}
@@ -14,6 +14,8 @@ const READONLY_PARENTS = {
14
14
  'fnd-readonly': 'fnd',
15
15
  'fxm-readonly': 'fxm',
16
16
  'cmm-readonly': 'cmm',
17
+ 'far-readonly': 'far',
18
+ 'fap-readonly': 'fap',
17
19
  };
18
20
  function parseSpec(spec) {
19
21
  if (!spec)
@@ -151,4 +153,32 @@ export function filterToolsByCapabilities(tools, capabilities, logger = console)
151
153
  }
152
154
  return allowed;
153
155
  }
156
+ /**
157
+ * Restrict the tool surface to an explicit allow-list (`RAYTIO_ENABLED_TOOLS`,
158
+ * comma-separated wire tool names). Runners pass a role's WRM tool bindings
159
+ * here so the limit holds even for clients that bypass their own permission
160
+ * checks.
161
+ *
162
+ * Applied after the role-domain and capability filters, so it can only narrow
163
+ * the surface: a named tool those filters removed stays hidden. Unset means no
164
+ * restriction. Set but blank exposes nothing, because a caller that asked for
165
+ * a limit must not silently receive every tool.
166
+ */
167
+ export function filterToolsByAllowlist(tools, spec, logger = console) {
168
+ if (spec === undefined) {
169
+ return [...tools];
170
+ }
171
+ const names = new Set(spec.split(',').map((s) => s.trim()).filter(Boolean));
172
+ if (names.size === 0) {
173
+ logger.error('Raytio MCP: RAYTIO_ENABLED_TOOLS is set but empty — exposing no tools');
174
+ return [];
175
+ }
176
+ const allowed = tools.filter((tool) => names.has(tool.name));
177
+ const exposed = new Set(allowed.map((tool) => tool.name));
178
+ const unavailable = [...names].filter((name) => !exposed.has(name));
179
+ if (unavailable.length > 0) {
180
+ logger.error(`Raytio MCP: RAYTIO_ENABLED_TOOLS names ${unavailable.length} tool(s) not available to this user: ${unavailable.join(', ')}`);
181
+ }
182
+ return allowed;
183
+ }
154
184
  //# sourceMappingURL=authorization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -33,26 +33,26 @@ declare const ConfigSchema: z.ZodObject<{
33
33
  agentUser: z.ZodObject<{
34
34
  username: z.ZodString;
35
35
  password: z.ZodString;
36
- encryptionPassword: z.ZodString;
37
- customerId: z.ZodString;
36
+ encryptionPassword: z.ZodOptional<z.ZodString>;
37
+ customerId: z.ZodOptional<z.ZodString>;
38
38
  }, "strip", z.ZodTypeAny, {
39
39
  username: string;
40
40
  password: string;
41
- encryptionPassword: string;
42
- customerId: string;
41
+ encryptionPassword?: string | undefined;
42
+ customerId?: string | undefined;
43
43
  }, {
44
44
  username: string;
45
45
  password: string;
46
- encryptionPassword: string;
47
- customerId: string;
46
+ encryptionPassword?: string | undefined;
47
+ customerId?: string | undefined;
48
48
  }>;
49
- targetUser: z.ZodObject<{
49
+ targetUser: z.ZodOptional<z.ZodObject<{
50
50
  email: z.ZodString;
51
51
  }, "strip", z.ZodTypeAny, {
52
52
  email: string;
53
53
  }, {
54
54
  email: string;
55
- }>;
55
+ }>>;
56
56
  defaults: z.ZodDefault<z.ZodObject<{
57
57
  requestTimeoutSeconds: z.ZodDefault<z.ZodNumber>;
58
58
  pollIntervalSeconds: z.ZodDefault<z.ZodNumber>;
@@ -91,17 +91,17 @@ declare const ConfigSchema: z.ZodObject<{
91
91
  agentUser: {
92
92
  username: string;
93
93
  password: string;
94
- encryptionPassword: string;
95
- customerId: string;
96
- };
97
- targetUser: {
98
- email: string;
94
+ encryptionPassword?: string | undefined;
95
+ customerId?: string | undefined;
99
96
  };
100
97
  defaults: {
101
98
  requestTimeoutSeconds: number;
102
99
  pollIntervalSeconds: number;
103
100
  requestExpiryMinutes: number;
104
101
  };
102
+ targetUser?: {
103
+ email: string;
104
+ } | undefined;
105
105
  embedding?: {
106
106
  apiKey: string;
107
107
  apiUrl: string;
@@ -119,12 +119,12 @@ declare const ConfigSchema: z.ZodObject<{
119
119
  agentUser: {
120
120
  username: string;
121
121
  password: string;
122
- encryptionPassword: string;
123
- customerId: string;
122
+ encryptionPassword?: string | undefined;
123
+ customerId?: string | undefined;
124
124
  };
125
- targetUser: {
125
+ targetUser?: {
126
126
  email: string;
127
- };
127
+ } | undefined;
128
128
  defaults?: {
129
129
  requestTimeoutSeconds?: number | undefined;
130
130
  pollIntervalSeconds?: number | undefined;
@@ -138,5 +138,9 @@ declare const ConfigSchema: z.ZodObject<{
138
138
  }>;
139
139
  export type Config = z.infer<typeof ConfigSchema>;
140
140
  export declare function loadConfig(): Config;
141
+ /** Fail before advertising DSM tools that cannot run with this configuration. */
142
+ export declare function validateToolConfiguration(config: Config, tools: readonly {
143
+ name: string;
144
+ }[]): void;
141
145
  export {};
142
146
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,IAAI,MAAM,CA2CnC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,IAAI,MAAM,CA2CnC;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACjC,IAAI,CAYN"}
package/dist/config.js CHANGED
@@ -22,12 +22,13 @@ const ConfigSchema = z.object({
22
22
  agentUser: z.object({
23
23
  username: z.string().email(),
24
24
  password: z.string().min(1),
25
- encryptionPassword: z.string().min(1),
26
- customerId: z.string().uuid(),
25
+ encryptionPassword: z.string().min(1).optional(),
26
+ customerId: z.string().uuid().optional(),
27
27
  }),
28
+ // Retained for compatibility with existing config files; no tool uses it.
28
29
  targetUser: z.object({
29
30
  email: z.string().email(),
30
- }),
31
+ }).optional(),
31
32
  defaults: z.object({
32
33
  requestTimeoutSeconds: z.number().default(600),
33
34
  pollIntervalSeconds: z.number().default(5),
@@ -56,9 +57,9 @@ export function loadConfig() {
56
57
  encryptionPassword: process.env.RAYTIO_AGENT_ENCRYPTION_PASSWORD,
57
58
  customerId: process.env.RAYTIO_AGENT_CUSTOMER_ID,
58
59
  },
59
- targetUser: {
60
- email: process.env.RAYTIO_TARGET_USER_EMAIL,
61
- },
60
+ targetUser: process.env.RAYTIO_TARGET_USER_EMAIL !== undefined
61
+ ? { email: process.env.RAYTIO_TARGET_USER_EMAIL }
62
+ : undefined,
62
63
  defaults: {
63
64
  requestTimeoutSeconds: parseInt(process.env.RAYTIO_REQUEST_TIMEOUT_SECONDS || '600'),
64
65
  pollIntervalSeconds: parseInt(process.env.RAYTIO_POLL_INTERVAL_SECONDS || '5'),
@@ -83,4 +84,18 @@ export function loadConfig() {
83
84
  throw error;
84
85
  }
85
86
  }
87
+ /** Fail before advertising DSM tools that cannot run with this configuration. */
88
+ export function validateToolConfiguration(config, tools) {
89
+ const names = new Set(tools.map(tool => tool.name));
90
+ const missing = [];
91
+ if (names.has('create_access_application') && !config.agentUser.customerId) {
92
+ missing.push('RAYTIO_AGENT_CUSTOMER_ID');
93
+ }
94
+ if (names.has('poll_and_retrieve') && !config.agentUser.encryptionPassword) {
95
+ missing.push('RAYTIO_AGENT_ENCRYPTION_PASSWORD');
96
+ }
97
+ if (missing.length) {
98
+ throw new Error(`DSM tools require missing configuration: ${missing.join(', ')}`);
99
+ }
100
+ }
86
101
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
4
  import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
5
  import { zodToJsonSchema } from 'zod-to-json-schema';
6
- import { loadConfig } from './config.js';
6
+ import { loadConfig, validateToolConfiguration } from './config.js';
7
7
  import { PersistContractError, loadPersistResourceContract, } from './contracts/persist-resource-contract.js';
8
8
  import { CognitoAuth } from './raytio/auth.js';
9
9
  import { RaytioApiClient } from './raytio/api-client.js';
10
10
  import { resolveDomains } from './tools/domains.js';
11
- import { filterToolsByCapabilities, resolveToolDomains } from './authorization.js';
11
+ import { filterToolsByAllowlist, filterToolsByCapabilities, resolveToolDomains, } from './authorization.js';
12
12
  import { dispatchToolCall } from './tools/dispatch.js';
13
13
  import { PACKAGE_VERSION } from './version.js';
14
14
  // Load configuration
@@ -52,13 +52,19 @@ const authorization = await resolveToolDomains(apiClient, process.env.RAYTIO_TOO
52
52
  const domainTools = authorization.authorized
53
53
  ? resolveDomains(authorization.domainSpec)
54
54
  : [];
55
+ // Fail fast after domain resolution, before advertising any DSM tools.
56
+ validateToolConfiguration(config, domainTools);
55
57
  // Layer the effective-capability filter on top of the role-domain filter.
56
58
  // Tools without a declared `capabilities` field pass through unchanged —
57
59
  // they remain gated by the role-domain filter until they are migrated
58
60
  // onto the pinned Persist resource contract (WI-0003500 onward).
59
- const allTools = authorization.authorized && authorization.capabilities
61
+ const capabilityTools = authorization.authorized && authorization.capabilities
60
62
  ? filterToolsByCapabilities(domainTools, authorization.capabilities)
61
63
  : domainTools;
64
+ // Optional per-process allow-list, applied last so it can only narrow the
65
+ // surface. ListTools and CallTool both use allTools, so a tool outside the
66
+ // list can be neither discovered nor called.
67
+ const allTools = filterToolsByAllowlist(capabilityTools, process.env.RAYTIO_ENABLED_TOOLS);
62
68
  console.error(`Raytio MCP: exposing ${allTools.length} tools` +
63
69
  (authorization.domainSpec
64
70
  ? ` (domains: ${authorization.domainSpec})`
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,qBAAqB;AACrB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAE5B,2EAA2E;AAC3E,2EAA2E;AAC3E,uEAAuE;AACvE,IAAI,eAAe,CAAC;AACpB,IAAI,CAAC;IACH,eAAe,GAAG,2BAA2B,EAAE,CAAC;AAClD,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,KAAK,YAAY,oBAAoB;QAClD,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAE,KAAe,CAAC,OAAO,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,gDAAgD,MAAM,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,KAAK,CACX,6EAA6E;QAC3E,2DAA2D,CAC9D,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,OAAO,CAAC,KAAK,CACX,uCAAuC,eAAe,CAAC,gBAAgB,GAAG;IACxE,MAAM,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAClD,IAAI,eAAe,CAAC,cAAc,eAAe,eAAe,CAAC,cAAc,YAAY,CAC9F,CAAC;AAEF,2CAA2C;AAC3C,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU;IAC5C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;IACpC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ;IACnC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ;CACpC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAEtE,MAAM,GAAG,GAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAErD,wEAAwE;AACxE,uEAAuE;AACvE,wEAAwE;AACxE,sEAAsE;AACtE,sEAAsE;AACtE,WAAW;AACX,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAC5C,SAAS,EACT,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAChC,CAAC;AAEF,MAAM,WAAW,GAAW,aAAa,CAAC,UAAU;IAClD,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC;IAC1C,CAAC,CAAC,EAAE,CAAC;AAEP,0EAA0E;AAC1E,yEAAyE;AACzE,sEAAsE;AACtE,iEAAiE;AACjE,MAAM,QAAQ,GACZ,aAAa,CAAC,UAAU,IAAI,aAAa,CAAC,YAAY;IACpD,CAAC,CAAC,yBAAyB,CAAC,WAAW,EAAE,aAAa,CAAC,YAAY,CAAC;IACpE,CAAC,CAAC,WAAW,CAAC;AAElB,OAAO,CAAC,KAAK,CACX,wBAAwB,QAAQ,CAAC,MAAM,QAAQ;IAC7C,CAAC,aAAa,CAAC,UAAU;QACvB,CAAC,CAAC,cAAc,aAAa,CAAC,UAAU,GAAG;QAC3C,CAAC,CAAC,6BAA6B,CAAC,CACrC,CAAC;AAEF,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,eAAe;CACzB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAkB,CAAC;SACtD,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,0EAA0E;AAC1E,wEAAwE;AACxE,qEAAqE;AACrE,yEAAyE;AACzE,4BAA4B;AAC5B,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACrC,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,aAAa,CAAC,YAAY,CAC3B,CAAC;IACF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KAC/C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC7C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Shared idempotency plumbing for financial (FAR/FAP) mutation tools
4
+ * (WI-0003504).
5
+ *
6
+ * Financial mutations (invoice creation, receipt recording, hold
7
+ * placement) MUST be safe to retry — model callers routinely re-send
8
+ * on transient network errors, and a duplicated receipt is a
9
+ * production incident. We express this two ways:
10
+ *
11
+ * - Tools that have a natural key (a unique index such as
12
+ * organisation + transaction_code, organisation + receipt_number,
13
+ * open hold per bill + hold_code) require it, document it in the
14
+ * tool description, and inherit `idempotency: 'natural_key'`. A
15
+ * retry then fails with a duplicate-key error instead of creating
16
+ * a second row.
17
+ * - Every side-effecting tool also accepts an OPTIONAL
18
+ * `idempotency_key`, forwarded as an `Idempotency-Key` header.
19
+ * Persist (PostgREST) ignores that header today (WI-0008817), so
20
+ * the key does not make a retry safe on its own.
21
+ *
22
+ * The MCP server does not maintain its own dedupe cache — the
23
+ * canonical answer lives in Persist. This module keeps the input
24
+ * schema and header-injection logic in one place so every FAR/FAP
25
+ * mutation surfaces the same contract.
26
+ */
27
+ /**
28
+ * Zod schema for the optional idempotency key input. Keeps the shape
29
+ * consistent so callers passing the same key across tools do not need
30
+ * to remember tool-specific spellings.
31
+ */
32
+ export declare const idempotencyKeySchema: z.ZodOptional<z.ZodString>;
33
+ /**
34
+ * Build the request headers for a financial mutation. Passes through
35
+ * `Prefer: return=representation` (needed for PostgREST to echo the
36
+ * created/updated row) and adds `Idempotency-Key` when supplied.
37
+ */
38
+ export declare function financeWriteHeaders(idempotencyKey: string | undefined): Record<string, string>;
39
+ /**
40
+ * Zod schema for a caller-supplied confirmation flag. Used on
41
+ * consequential actions (cash receipt, hold release) where an
42
+ * explicit `confirm: true` is required in addition to the required
43
+ * business inputs.
44
+ */
45
+ export declare const confirmFlagSchema: z.ZodLiteral<true>;
46
+ /**
47
+ * Zod schema for a caller-supplied reason string. Used on lifecycle
48
+ * transitions (invoice status change, hold release) so the audit log
49
+ * carries a human-readable justification.
50
+ */
51
+ export declare const reasonSchema: z.ZodString;
52
+ //# sourceMappingURL=finance-idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finance-idempotency.d.ts","sourceRoot":"","sources":["../../../src/tools/_shared/finance-idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,4BAa9B,CAAC;AAEJ;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,oBAW3B,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,YAAY,aAG2B,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Shared idempotency plumbing for financial (FAR/FAP) mutation tools
4
+ * (WI-0003504).
5
+ *
6
+ * Financial mutations (invoice creation, receipt recording, hold
7
+ * placement) MUST be safe to retry — model callers routinely re-send
8
+ * on transient network errors, and a duplicated receipt is a
9
+ * production incident. We express this two ways:
10
+ *
11
+ * - Tools that have a natural key (a unique index such as
12
+ * organisation + transaction_code, organisation + receipt_number,
13
+ * open hold per bill + hold_code) require it, document it in the
14
+ * tool description, and inherit `idempotency: 'natural_key'`. A
15
+ * retry then fails with a duplicate-key error instead of creating
16
+ * a second row.
17
+ * - Every side-effecting tool also accepts an OPTIONAL
18
+ * `idempotency_key`, forwarded as an `Idempotency-Key` header.
19
+ * Persist (PostgREST) ignores that header today (WI-0008817), so
20
+ * the key does not make a retry safe on its own.
21
+ *
22
+ * The MCP server does not maintain its own dedupe cache — the
23
+ * canonical answer lives in Persist. This module keeps the input
24
+ * schema and header-injection logic in one place so every FAR/FAP
25
+ * mutation surfaces the same contract.
26
+ */
27
+ /**
28
+ * Zod schema for the optional idempotency key input. Keeps the shape
29
+ * consistent so callers passing the same key across tools do not need
30
+ * to remember tool-specific spellings.
31
+ */
32
+ export const idempotencyKeySchema = z
33
+ .string()
34
+ .min(8)
35
+ .max(128)
36
+ .regex(/^[A-Za-z0-9._~:-]+$/, 'idempotency_key must be a URL-safe token (letters, digits, `.`, `_`, `~`, `:`, `-`)')
37
+ .optional()
38
+ .describe('Optional idempotency key, forwarded as an Idempotency-Key header. Persist does not ' +
39
+ 'deduplicate on it yet, so it does not make a retry safe on its own; the unique key ' +
40
+ 'named in the tool description does. Must be a URL-safe token of 8–128 characters.');
41
+ /**
42
+ * Build the request headers for a financial mutation. Passes through
43
+ * `Prefer: return=representation` (needed for PostgREST to echo the
44
+ * created/updated row) and adds `Idempotency-Key` when supplied.
45
+ */
46
+ export function financeWriteHeaders(idempotencyKey) {
47
+ const headers = {
48
+ Prefer: 'return=representation',
49
+ };
50
+ if (idempotencyKey) {
51
+ headers['Idempotency-Key'] = idempotencyKey;
52
+ }
53
+ return headers;
54
+ }
55
+ /**
56
+ * Zod schema for a caller-supplied confirmation flag. Used on
57
+ * consequential actions (cash receipt, hold release) where an
58
+ * explicit `confirm: true` is required in addition to the required
59
+ * business inputs.
60
+ */
61
+ export const confirmFlagSchema = z
62
+ .literal(true, {
63
+ errorMap: () => ({
64
+ message: 'confirm must be set to `true` to acknowledge that this is a financial action ' +
65
+ 'affecting real balances.',
66
+ }),
67
+ })
68
+ .describe('Must be `true` to execute. Present so a model cannot accidentally record a receipt, ' +
69
+ 'release a hold, or move money without an explicit confirmation step.');
70
+ /**
71
+ * Zod schema for a caller-supplied reason string. Used on lifecycle
72
+ * transitions (invoice status change, hold release) so the audit log
73
+ * carries a human-readable justification.
74
+ */
75
+ export const reasonSchema = z
76
+ .string()
77
+ .min(4, 'reason must be at least 4 characters')
78
+ .max(500, 'reason must be at most 500 characters');
79
+ //# sourceMappingURL=finance-idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finance-idempotency.js","sourceRoot":"","sources":["../../../src/tools/_shared/finance-idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,GAAG,CAAC;KACR,KAAK,CACJ,qBAAqB,EACrB,qFAAqF,CACtF;KACA,QAAQ,EAAE;KACV,QAAQ,CACP,qFAAqF;IACnF,qFAAqF;IACrF,mFAAmF,CACtF,CAAC;AAEJ;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,cAAkC;IAElC,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,uBAAuB;KAChC,CAAC;IACF,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,iBAAiB,CAAC,GAAG,cAAc,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,OAAO,CAAC,IAAI,EAAE;IACb,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACf,OAAO,EACL,+EAA+E;YAC7E,0BAA0B;KAC/B,CAAC;CACH,CAAC;KACD,QAAQ,CACP,sFAAsF;IACpF,sEAAsE,CACzE,CAAC;AAEJ;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC;KAC9C,GAAG,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ /** ISO 4217 alphabetic currency code, uppercase — validated at the MCP boundary. */
3
+ export declare const currencyCodeSchema: z.ZodString;
4
+ /** Positive money amount (> 0, ≤ 4 dp, bounded magnitude). */
5
+ export declare const positiveMoneySchema: z.ZodEffects<z.ZodNumber, number, number>;
6
+ /** Non-negative money amount (≥ 0, ≤ 4 dp, bounded magnitude). */
7
+ export declare const nonNegativeMoneySchema: z.ZodEffects<z.ZodNumber, number, number>;
8
+ /** Signed money amount (any sign, ≤ 4 dp, bounded magnitude) — for adjustments. */
9
+ export declare const signedMoneySchema: z.ZodEffects<z.ZodNumber, number, number>;
10
+ //# sourceMappingURL=money.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../../../src/tools/_shared/money.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqBxB,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,aAK5B,CAAC;AAuCJ,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,2CAW5B,CAAC;AAEL,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,2CAW/B,CAAC;AAEL,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,2CAEoC,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Shared money and currency validators for financial (FAR/FAP) tools
4
+ * (WI-0003504). Kept in one place so amount/currency semantics stay
5
+ * consistent across every AR/AP mutation surface.
6
+ *
7
+ * Money validation rules:
8
+ * - Currency codes must be a 3-letter ISO 4217 alphabetic code
9
+ * (uppercase). We do not validate against a live currency list —
10
+ * Persist owns that lookup — but reject the obviously malformed
11
+ * (empty string, wrong length, non-alphabetic) at the MCP boundary.
12
+ * - Amounts must be finite JSON numbers with at most 4 decimal
13
+ * fractional places (banker precision limit) and a magnitude that
14
+ * fits inside PostgREST's numeric range without silent truncation.
15
+ * - `nonNegativeMoney` allows zero (e.g. an adjustment line); use
16
+ * `positiveMoney` for a receipt/payment amount that must move value.
17
+ */
18
+ const ISO_CURRENCY_RE = /^[A-Z]{3}$/;
19
+ /** ISO 4217 alphabetic currency code, uppercase — validated at the MCP boundary. */
20
+ export const currencyCodeSchema = z
21
+ .string()
22
+ .regex(ISO_CURRENCY_RE, 'currency_code must be a 3-letter uppercase ISO 4217 code (e.g. USD, EUR, AUD)');
23
+ // Max 4 decimal places, magnitude below 1e14 to stay well within Postgres
24
+ // numeric(20,4). Any amount larger is almost certainly a caller mistake.
25
+ const MAX_MAGNITUDE = 1e14;
26
+ const MAX_FRACTIONAL_DIGITS = 4;
27
+ function fractionalDigits(value) {
28
+ if (!Number.isFinite(value))
29
+ return Infinity;
30
+ const s = String(value);
31
+ const dot = s.indexOf('.');
32
+ if (dot < 0)
33
+ return 0;
34
+ const exp = s.toLowerCase().indexOf('e');
35
+ if (exp >= 0)
36
+ return Infinity;
37
+ return s.length - dot - 1;
38
+ }
39
+ function validateMoneyMagnitude(value, ctx) {
40
+ if (!Number.isFinite(value)) {
41
+ ctx.addIssue({
42
+ code: z.ZodIssueCode.custom,
43
+ message: 'amount must be a finite number',
44
+ });
45
+ return;
46
+ }
47
+ if (Math.abs(value) >= MAX_MAGNITUDE) {
48
+ ctx.addIssue({
49
+ code: z.ZodIssueCode.custom,
50
+ message: `amount magnitude must be less than ${MAX_MAGNITUDE}`,
51
+ });
52
+ }
53
+ if (fractionalDigits(value) > MAX_FRACTIONAL_DIGITS) {
54
+ ctx.addIssue({
55
+ code: z.ZodIssueCode.custom,
56
+ message: `amount must have at most ${MAX_FRACTIONAL_DIGITS} decimal places`,
57
+ });
58
+ }
59
+ }
60
+ /** Positive money amount (> 0, ≤ 4 dp, bounded magnitude). */
61
+ export const positiveMoneySchema = z
62
+ .number()
63
+ .superRefine((value, ctx) => {
64
+ if (value <= 0) {
65
+ ctx.addIssue({
66
+ code: z.ZodIssueCode.custom,
67
+ message: 'amount must be greater than 0',
68
+ });
69
+ return;
70
+ }
71
+ validateMoneyMagnitude(value, ctx);
72
+ });
73
+ /** Non-negative money amount (≥ 0, ≤ 4 dp, bounded magnitude). */
74
+ export const nonNegativeMoneySchema = z
75
+ .number()
76
+ .superRefine((value, ctx) => {
77
+ if (value < 0) {
78
+ ctx.addIssue({
79
+ code: z.ZodIssueCode.custom,
80
+ message: 'amount must be greater than or equal to 0',
81
+ });
82
+ return;
83
+ }
84
+ validateMoneyMagnitude(value, ctx);
85
+ });
86
+ /** Signed money amount (any sign, ≤ 4 dp, bounded magnitude) — for adjustments. */
87
+ export const signedMoneySchema = z
88
+ .number()
89
+ .superRefine((value, ctx) => validateMoneyMagnitude(value, ctx));
90
+ //# sourceMappingURL=money.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"money.js","sourceRoot":"","sources":["../../../src/tools/_shared/money.ts"],"names":[],"mappings":"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"}