@moovio/sdk 25.12.0 → 25.12.1

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 (245) hide show
  1. package/README.md +82 -78
  2. package/bin/mcp-server.js +554 -319
  3. package/bin/mcp-server.js.map +55 -56
  4. package/funcs/accountsCreate.d.ts +8 -10
  5. package/funcs/accountsCreate.d.ts.map +1 -1
  6. package/funcs/accountsCreate.js +8 -10
  7. package/funcs/accountsCreate.js.map +1 -1
  8. package/funcs/capabilitiesDisable.d.ts +1 -1
  9. package/funcs/capabilitiesDisable.js +1 -1
  10. package/funcs/capabilitiesGet.d.ts +1 -1
  11. package/funcs/capabilitiesGet.js +1 -1
  12. package/funcs/capabilitiesList.d.ts +1 -1
  13. package/funcs/capabilitiesList.js +1 -1
  14. package/funcs/capabilitiesRequest.d.ts +1 -1
  15. package/funcs/capabilitiesRequest.js +1 -1
  16. package/funcs/cardIssuingGet.js +1 -1
  17. package/funcs/cardIssuingGet.js.map +1 -1
  18. package/funcs/cardIssuingGetFull.js +1 -1
  19. package/funcs/cardIssuingGetFull.js.map +1 -1
  20. package/funcs/cardIssuingList.js +1 -1
  21. package/funcs/cardIssuingList.js.map +1 -1
  22. package/funcs/cardIssuingRequest.js +1 -1
  23. package/funcs/cardIssuingRequest.js.map +1 -1
  24. package/funcs/cardIssuingUpdate.js +1 -1
  25. package/funcs/cardIssuingUpdate.js.map +1 -1
  26. package/funcs/transfersListCancellations.d.ts +17 -0
  27. package/funcs/transfersListCancellations.d.ts.map +1 -0
  28. package/funcs/transfersListCancellations.js +129 -0
  29. package/funcs/transfersListCancellations.js.map +1 -0
  30. package/hooks/types.d.ts +1 -0
  31. package/hooks/types.d.ts.map +1 -1
  32. package/jsr.json +1 -1
  33. package/lib/config.d.ts +3 -3
  34. package/lib/config.js +3 -3
  35. package/lib/encodings.js +12 -12
  36. package/lib/encodings.js.map +1 -1
  37. package/lib/matchers.js +3 -3
  38. package/lib/matchers.js.map +1 -1
  39. package/lib/primitives.d.ts +1 -0
  40. package/lib/primitives.d.ts.map +1 -1
  41. package/lib/primitives.js +18 -0
  42. package/lib/primitives.js.map +1 -1
  43. package/lib/retries.js +7 -0
  44. package/lib/retries.js.map +1 -1
  45. package/lib/sdks.d.ts.map +1 -1
  46. package/lib/sdks.js +50 -16
  47. package/lib/sdks.js.map +1 -1
  48. package/mcp-server/mcp-server.js +1 -1
  49. package/mcp-server/server.d.ts.map +1 -1
  50. package/mcp-server/server.js +3 -1
  51. package/mcp-server/server.js.map +1 -1
  52. package/mcp-server/tools/accountsCreate.d.ts.map +1 -1
  53. package/mcp-server/tools/accountsCreate.js +8 -10
  54. package/mcp-server/tools/accountsCreate.js.map +1 -1
  55. package/mcp-server/tools/capabilitiesDisable.js +1 -1
  56. package/mcp-server/tools/capabilitiesGet.js +1 -1
  57. package/mcp-server/tools/capabilitiesList.js +1 -1
  58. package/mcp-server/tools/capabilitiesRequest.js +1 -1
  59. package/mcp-server/tools/transfersListCancellations.d.ts +8 -0
  60. package/mcp-server/tools/transfersListCancellations.d.ts.map +1 -0
  61. package/{models/components/authorizeduser.js → mcp-server/tools/transfersListCancellations.js} +27 -22
  62. package/mcp-server/tools/transfersListCancellations.js.map +1 -0
  63. package/models/components/addcapabilities.d.ts +9 -0
  64. package/models/components/addcapabilities.d.ts.map +1 -1
  65. package/models/components/addcapabilities.js.map +1 -1
  66. package/models/components/capability.d.ts +7 -1
  67. package/models/components/capability.d.ts.map +1 -1
  68. package/models/components/capability.js.map +1 -1
  69. package/models/components/capabilityid.d.ts +14 -2
  70. package/models/components/capabilityid.d.ts.map +1 -1
  71. package/models/components/capabilityid.js +7 -1
  72. package/models/components/capabilityid.js.map +1 -1
  73. package/models/components/createaccount.d.ts +9 -0
  74. package/models/components/createaccount.d.ts.map +1 -1
  75. package/models/components/createaccount.js.map +1 -1
  76. package/models/components/createpaymentlink.d.ts +3 -3
  77. package/models/components/fullissuedcard.d.ts +25 -9
  78. package/models/components/fullissuedcard.d.ts.map +1 -1
  79. package/models/components/fullissuedcard.js +11 -5
  80. package/models/components/fullissuedcard.js.map +1 -1
  81. package/models/components/index.d.ts +1 -4
  82. package/models/components/index.d.ts.map +1 -1
  83. package/models/components/index.js +1 -4
  84. package/models/components/index.js.map +1 -1
  85. package/models/components/issuedcard.d.ts +25 -9
  86. package/models/components/issuedcard.d.ts.map +1 -1
  87. package/models/components/issuedcard.js +11 -5
  88. package/models/components/issuedcard.js.map +1 -1
  89. package/models/components/onboardinginvite.d.ts +1 -1
  90. package/models/components/onboardinginviterequest.d.ts +1 -1
  91. package/models/components/paymentlink.d.ts +2 -2
  92. package/models/components/requestcard.d.ts +14 -17
  93. package/models/components/requestcard.d.ts.map +1 -1
  94. package/models/components/requestcard.js +9 -10
  95. package/models/components/requestcard.js.map +1 -1
  96. package/models/components/updateissuedcard.d.ts +33 -8
  97. package/models/components/updateissuedcard.d.ts.map +1 -1
  98. package/models/components/updateissuedcard.js +35 -6
  99. package/models/components/updateissuedcard.js.map +1 -1
  100. package/models/components/webhookdata.d.ts +3 -2
  101. package/models/components/webhookdata.d.ts.map +1 -1
  102. package/models/components/webhookdata.js +7 -4
  103. package/models/components/webhookdata.js.map +1 -1
  104. package/models/components/webhookdataauthorizationexpiring.d.ts +23 -0
  105. package/models/components/webhookdataauthorizationexpiring.d.ts.map +1 -0
  106. package/models/components/{createauthorizedusererror.js → webhookdataauthorizationexpiring.js} +18 -17
  107. package/models/components/webhookdataauthorizationexpiring.js.map +1 -0
  108. package/models/components/webhookdatacapabilityrequested.d.ts +7 -1
  109. package/models/components/webhookdatacapabilityrequested.d.ts.map +1 -1
  110. package/models/components/webhookdatacapabilityrequested.js.map +1 -1
  111. package/models/components/webhookdatacapabilityupdated.d.ts +7 -1
  112. package/models/components/webhookdatacapabilityupdated.d.ts.map +1 -1
  113. package/models/components/webhookdatacapabilityupdated.js.map +1 -1
  114. package/models/components/webhookdatasweepcreated.d.ts +5 -0
  115. package/models/components/webhookdatasweepcreated.d.ts.map +1 -1
  116. package/models/components/webhookdatasweepcreated.js +2 -0
  117. package/models/components/webhookdatasweepcreated.js.map +1 -1
  118. package/models/components/webhookdatasweepupdated.d.ts +5 -0
  119. package/models/components/webhookdatasweepupdated.d.ts.map +1 -1
  120. package/models/components/webhookdatasweepupdated.js +2 -0
  121. package/models/components/webhookdatasweepupdated.js.map +1 -1
  122. package/models/components/webhookeventtype.d.ts +1 -0
  123. package/models/components/webhookeventtype.d.ts.map +1 -1
  124. package/models/components/webhookeventtype.js +1 -0
  125. package/models/components/webhookeventtype.js.map +1 -1
  126. package/models/errors/requestcarderror.d.ts +12 -12
  127. package/models/errors/requestcarderror.d.ts.map +1 -1
  128. package/models/errors/requestcarderror.js +17 -17
  129. package/models/errors/requestcarderror.js.map +1 -1
  130. package/models/errors/updateissuedcarderror.d.ts +9 -6
  131. package/models/errors/updateissuedcarderror.d.ts.map +1 -1
  132. package/models/errors/updateissuedcarderror.js +12 -9
  133. package/models/errors/updateissuedcarderror.js.map +1 -1
  134. package/models/operations/disablecapability.d.ts +7 -1
  135. package/models/operations/disablecapability.d.ts.map +1 -1
  136. package/models/operations/disablecapability.js.map +1 -1
  137. package/models/operations/getcapability.d.ts +7 -1
  138. package/models/operations/getcapability.d.ts.map +1 -1
  139. package/models/operations/getcapability.js.map +1 -1
  140. package/models/operations/index.d.ts +1 -0
  141. package/models/operations/index.d.ts.map +1 -1
  142. package/models/operations/index.js +1 -0
  143. package/models/operations/index.js.map +1 -1
  144. package/models/operations/listcancellations.d.ts +45 -0
  145. package/models/operations/listcancellations.d.ts.map +1 -0
  146. package/models/operations/listcancellations.js +90 -0
  147. package/models/operations/listcancellations.js.map +1 -0
  148. package/package.json +1 -1
  149. package/sdk/accounts.d.ts +8 -10
  150. package/sdk/accounts.d.ts.map +1 -1
  151. package/sdk/accounts.js +8 -10
  152. package/sdk/accounts.js.map +1 -1
  153. package/sdk/capabilities.d.ts +4 -4
  154. package/sdk/capabilities.js +4 -4
  155. package/sdk/transfers.d.ts +7 -0
  156. package/sdk/transfers.d.ts.map +1 -1
  157. package/sdk/transfers.js +10 -0
  158. package/sdk/transfers.js.map +1 -1
  159. package/src/funcs/accountsCreate.ts +8 -10
  160. package/src/funcs/capabilitiesDisable.ts +1 -1
  161. package/src/funcs/capabilitiesGet.ts +1 -1
  162. package/src/funcs/capabilitiesList.ts +1 -1
  163. package/src/funcs/capabilitiesRequest.ts +1 -1
  164. package/src/funcs/cardIssuingGet.ts +1 -1
  165. package/src/funcs/cardIssuingGetFull.ts +3 -3
  166. package/src/funcs/cardIssuingList.ts +1 -1
  167. package/src/funcs/cardIssuingRequest.ts +1 -1
  168. package/src/funcs/cardIssuingUpdate.ts +1 -1
  169. package/src/funcs/transfersListCancellations.ts +181 -0
  170. package/src/hooks/types.ts +1 -0
  171. package/src/lib/config.ts +3 -3
  172. package/src/lib/encodings.ts +1 -1
  173. package/src/lib/matchers.ts +1 -1
  174. package/src/lib/primitives.ts +16 -0
  175. package/src/lib/retries.ts +8 -0
  176. package/src/lib/sdks.ts +54 -17
  177. package/src/mcp-server/mcp-server.ts +1 -1
  178. package/src/mcp-server/server.ts +3 -1
  179. package/src/mcp-server/tools/accountsCreate.ts +8 -10
  180. package/src/mcp-server/tools/capabilitiesDisable.ts +1 -1
  181. package/src/mcp-server/tools/capabilitiesGet.ts +1 -1
  182. package/src/mcp-server/tools/capabilitiesList.ts +1 -1
  183. package/src/mcp-server/tools/capabilitiesRequest.ts +1 -1
  184. package/src/mcp-server/tools/transfersListCancellations.ts +38 -0
  185. package/src/models/components/addcapabilities.ts +9 -0
  186. package/src/models/components/capability.ts +7 -1
  187. package/src/models/components/capabilityid.ts +14 -2
  188. package/src/models/components/createaccount.ts +9 -0
  189. package/src/models/components/createpaymentlink.ts +3 -3
  190. package/src/models/components/fullissuedcard.ts +35 -17
  191. package/src/models/components/index.ts +1 -4
  192. package/src/models/components/issuedcard.ts +35 -17
  193. package/src/models/components/onboardinginvite.ts +1 -1
  194. package/src/models/components/onboardinginviterequest.ts +1 -1
  195. package/src/models/components/paymentlink.ts +2 -2
  196. package/src/models/components/requestcard.ts +23 -34
  197. package/src/models/components/updateissuedcard.ts +73 -17
  198. package/src/models/components/webhookdata.ts +18 -8
  199. package/src/models/components/webhookdataauthorizationexpiring.ts +65 -0
  200. package/src/models/components/webhookdatacapabilityrequested.ts +7 -1
  201. package/src/models/components/webhookdatacapabilityupdated.ts +7 -1
  202. package/src/models/components/webhookdatasweepcreated.ts +7 -0
  203. package/src/models/components/webhookdatasweepupdated.ts +7 -0
  204. package/src/models/components/webhookeventtype.ts +1 -0
  205. package/src/models/errors/requestcarderror.ts +26 -25
  206. package/src/models/errors/updateissuedcarderror.ts +18 -13
  207. package/src/models/operations/disablecapability.ts +7 -1
  208. package/src/models/operations/getcapability.ts +7 -1
  209. package/src/models/operations/index.ts +1 -0
  210. package/src/models/operations/listcancellations.ts +120 -0
  211. package/src/sdk/accounts.ts +8 -10
  212. package/src/sdk/capabilities.ts +4 -4
  213. package/src/sdk/transfers.ts +18 -0
  214. package/src/types/async.ts +8 -7
  215. package/types/async.d.ts.map +1 -1
  216. package/types/async.js +8 -7
  217. package/types/async.js.map +1 -1
  218. package/lib/dlv.d.ts +0 -14
  219. package/lib/dlv.d.ts.map +0 -1
  220. package/lib/dlv.js +0 -49
  221. package/lib/dlv.js.map +0 -1
  222. package/lib/is-plain-object.d.ts +0 -2
  223. package/lib/is-plain-object.d.ts.map +0 -1
  224. package/lib/is-plain-object.js +0 -41
  225. package/lib/is-plain-object.js.map +0 -1
  226. package/models/components/authorizeduser.d.ts +0 -22
  227. package/models/components/authorizeduser.d.ts.map +0 -1
  228. package/models/components/authorizeduser.js.map +0 -1
  229. package/models/components/createauthorizeduser.d.ts +0 -25
  230. package/models/components/createauthorizeduser.d.ts.map +0 -1
  231. package/models/components/createauthorizeduser.js +0 -63
  232. package/models/components/createauthorizeduser.js.map +0 -1
  233. package/models/components/createauthorizedusererror.d.ts +0 -22
  234. package/models/components/createauthorizedusererror.d.ts.map +0 -1
  235. package/models/components/createauthorizedusererror.js.map +0 -1
  236. package/models/components/createauthorizeduserupdate.d.ts +0 -25
  237. package/models/components/createauthorizeduserupdate.d.ts.map +0 -1
  238. package/models/components/createauthorizeduserupdate.js +0 -63
  239. package/models/components/createauthorizeduserupdate.js.map +0 -1
  240. package/src/lib/dlv.ts +0 -53
  241. package/src/lib/is-plain-object.ts +0 -43
  242. package/src/models/components/authorizeduser.ts +0 -54
  243. package/src/models/components/createauthorizeduser.ts +0 -68
  244. package/src/models/components/createauthorizedusererror.ts +0 -65
  245. package/src/models/components/createauthorizeduserupdate.ts +0 -68
@@ -0,0 +1,181 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { MoovCore } from "../core.js";
6
+ import { encodeSimple } from "../lib/encodings.js";
7
+ import { matchStatusCode } from "../lib/http.js";
8
+ import * as M from "../lib/matchers.js";
9
+ import { compactMap } from "../lib/primitives.js";
10
+ import { safeParse } from "../lib/schemas.js";
11
+ import { RequestOptions } from "../lib/sdks.js";
12
+ import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js";
13
+ import { pathToFunc } from "../lib/url.js";
14
+ import {
15
+ ConnectionError,
16
+ InvalidRequestError,
17
+ RequestAbortedError,
18
+ RequestTimeoutError,
19
+ UnexpectedClientError,
20
+ } from "../models/errors/httpclienterrors.js";
21
+ import { MoovError } from "../models/errors/mooverror.js";
22
+ import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";
23
+ import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
24
+ import * as operations from "../models/operations/index.js";
25
+ import { APICall, APIPromise } from "../types/async.js";
26
+ import { Result } from "../types/fp.js";
27
+
28
+ /**
29
+ * Get a list of cancellations for a transfer.
30
+ *
31
+ * To access this endpoint using a [token](https://docs.moov.io/api/authentication/access-tokens/) you'll need
32
+ * to specify the `/accounts/{accountID}/transfers.read` scope.
33
+ */
34
+ export function transfersListCancellations(
35
+ client: MoovCore,
36
+ request: operations.ListCancellationsRequest,
37
+ options?: RequestOptions,
38
+ ): APIPromise<
39
+ Result<
40
+ operations.ListCancellationsResponse,
41
+ | MoovError
42
+ | ResponseValidationError
43
+ | ConnectionError
44
+ | RequestAbortedError
45
+ | RequestTimeoutError
46
+ | InvalidRequestError
47
+ | UnexpectedClientError
48
+ | SDKValidationError
49
+ >
50
+ > {
51
+ return new APIPromise($do(
52
+ client,
53
+ request,
54
+ options,
55
+ ));
56
+ }
57
+
58
+ async function $do(
59
+ client: MoovCore,
60
+ request: operations.ListCancellationsRequest,
61
+ options?: RequestOptions,
62
+ ): Promise<
63
+ [
64
+ Result<
65
+ operations.ListCancellationsResponse,
66
+ | MoovError
67
+ | ResponseValidationError
68
+ | ConnectionError
69
+ | RequestAbortedError
70
+ | RequestTimeoutError
71
+ | InvalidRequestError
72
+ | UnexpectedClientError
73
+ | SDKValidationError
74
+ >,
75
+ APICall,
76
+ ]
77
+ > {
78
+ const parsed = safeParse(
79
+ request,
80
+ (value) => operations.ListCancellationsRequest$outboundSchema.parse(value),
81
+ "Input validation failed",
82
+ );
83
+ if (!parsed.ok) {
84
+ return [parsed, { status: "invalid" }];
85
+ }
86
+ const payload = parsed.value;
87
+ const body = null;
88
+
89
+ const pathParams = {
90
+ accountID: encodeSimple("accountID", payload.accountID, {
91
+ explode: false,
92
+ charEncoding: "percent",
93
+ }),
94
+ transferID: encodeSimple("transferID", payload.transferID, {
95
+ explode: false,
96
+ charEncoding: "percent",
97
+ }),
98
+ };
99
+ const path = pathToFunc(
100
+ "/accounts/{accountID}/transfers/{transferID}/cancellations",
101
+ )(pathParams);
102
+
103
+ const headers = new Headers(compactMap({
104
+ Accept: "application/json",
105
+ }));
106
+
107
+ const securityInput = await extractSecurity(client._options.security);
108
+ const requestSecurity = resolveGlobalSecurity(securityInput);
109
+
110
+ const context = {
111
+ options: client._options,
112
+ baseURL: options?.serverURL ?? client._baseURL ?? "",
113
+ operationID: "listCancellations",
114
+ oAuth2Scopes: null,
115
+
116
+ resolvedSecurity: requestSecurity,
117
+
118
+ securitySource: client._options.security,
119
+ retryConfig: options?.retries
120
+ || client._options.retryConfig
121
+ || { strategy: "none" },
122
+ retryCodes: options?.retryCodes || ["429", "500", "502", "503", "504"],
123
+ };
124
+
125
+ const requestRes = client._createRequest(context, {
126
+ security: requestSecurity,
127
+ method: "GET",
128
+ baseURL: options?.serverURL,
129
+ path: path,
130
+ headers: headers,
131
+ body: body,
132
+ userAgent: client._options.userAgent,
133
+ timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
134
+ }, options);
135
+ if (!requestRes.ok) {
136
+ return [requestRes, { status: "invalid" }];
137
+ }
138
+ const req = requestRes.value;
139
+
140
+ const doResult = await client._do(req, {
141
+ context,
142
+ isErrorStatusCode: (statusCode: number) =>
143
+ matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]),
144
+ retryConfig: context.retryConfig,
145
+ retryCodes: context.retryCodes,
146
+ });
147
+ if (!doResult.ok) {
148
+ return [doResult, { status: "request-error", request: req }];
149
+ }
150
+ const response = doResult.value;
151
+
152
+ const responseFields = {
153
+ HttpMeta: { Response: response, Request: req },
154
+ };
155
+
156
+ const [result] = await M.match<
157
+ operations.ListCancellationsResponse,
158
+ | MoovError
159
+ | ResponseValidationError
160
+ | ConnectionError
161
+ | RequestAbortedError
162
+ | RequestTimeoutError
163
+ | InvalidRequestError
164
+ | UnexpectedClientError
165
+ | SDKValidationError
166
+ >(
167
+ M.json(200, operations.ListCancellationsResponse$inboundSchema, {
168
+ hdrs: true,
169
+ key: "Result",
170
+ }),
171
+ M.fail([401, 403, 429]),
172
+ M.fail([500, 504]),
173
+ M.fail("4XX"),
174
+ M.fail("5XX"),
175
+ )(response, req, { extraFields: responseFields });
176
+ if (!result.ok) {
177
+ return [result, { status: "complete", request: req, response }];
178
+ }
179
+
180
+ return [result, { status: "complete", request: req, response }];
181
+ }
@@ -15,6 +15,7 @@ export type HookContext = {
15
15
  retryConfig: RetryConfig;
16
16
  resolvedSecurity: SecurityState | null;
17
17
  options: SDKOptions;
18
+ timeoutMs?: number;
18
19
  };
19
20
 
20
21
  export type Awaitable<T> = T | Promise<T>;
package/src/lib/config.ts CHANGED
@@ -73,7 +73,7 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
73
73
  export const SDK_METADATA = {
74
74
  language: "typescript",
75
75
  openapiDocVersion: "v2025.10.00",
76
- sdkVersion: "25.12.0",
77
- genVersion: "2.884.4",
78
- userAgent: "speakeasy-sdk/typescript 25.12.0 2.884.4 v2025.10.00 @moovio/sdk",
76
+ sdkVersion: "25.12.1",
77
+ genVersion: "2.910.1",
78
+ userAgent: "speakeasy-sdk/typescript 25.12.1 2.910.1 v2025.10.00 @moovio/sdk",
79
79
  } as const;
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { bytesToBase64 } from "./base64.js";
6
- import { isPlainObject } from "./is-plain-object.js";
6
+ import { isPlainObject } from "./primitives.js";
7
7
 
8
8
  export class EncodingError extends Error {
9
9
  constructor(message: string) {
@@ -6,7 +6,7 @@ import { APIError } from "../models/errors/apierror.js";
6
6
  import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";
7
7
  import { ERR, OK, Result } from "../types/fp.js";
8
8
  import { matchResponse, matchStatusCode, StatusCodePredicate } from "./http.js";
9
- import { isPlainObject } from "./is-plain-object.js";
9
+ import { isPlainObject } from "./primitives.js";
10
10
 
11
11
  export type Encoding =
12
12
  | "jsonl"
@@ -148,3 +148,19 @@ export function allRequired<V extends Record<string, unknown>>(
148
148
 
149
149
  return v as ReturnType<typeof allRequired<V>>;
150
150
  }
151
+
152
+ export function isPlainObject(
153
+ value: unknown,
154
+ ): value is Record<string, unknown> {
155
+ if (value === null || typeof value !== "object") return false;
156
+ if (Object.prototype.toString.call(value) !== "[object Object]") return false;
157
+ const proto = Object.getPrototypeOf(value);
158
+ if (proto === null || proto === Object.prototype) return true;
159
+ // cross-realm plain objects (vm contexts, iframes) inherit from a
160
+ // different realm's Object.prototype, which itself has a null prototype
161
+ try {
162
+ return Object.getPrototypeOf(proto) === null;
163
+ } catch {
164
+ return false;
165
+ }
166
+ }
@@ -194,6 +194,14 @@ async function retryBackoff(
194
194
  }
195
195
 
196
196
  function retryIntervalFromResponse(res: Response): number {
197
+ const retryAfterMsVal = res.headers.get("retry-after-ms");
198
+ if (retryAfterMsVal) {
199
+ const parsedMs = Number(retryAfterMsVal);
200
+ if (Number.isFinite(parsedMs) && parsedMs >= 0) {
201
+ return parsedMs;
202
+ }
203
+ }
204
+
197
205
  const retryVal = res.headers.get("retry-after") || "";
198
206
  if (!retryVal) {
199
207
  return 0;
package/src/lib/sdks.ts CHANGED
@@ -23,6 +23,7 @@ import {
23
23
  matchContentType,
24
24
  } from "./http.js";
25
25
  import { Logger } from "./logger.js";
26
+ import { combineSignals } from "./primitives.js";
26
27
  import { retry, RetryConfig } from "./retries.js";
27
28
  import { SecurityState } from "./security.js";
28
29
 
@@ -127,27 +128,55 @@ export class ClientSDK {
127
128
  if (path) {
128
129
  baseURL.pathname = baseURL.pathname.replace(/\/+$/, "") + "/";
129
130
  reqURL = new URL(path, baseURL);
131
+ if (!reqURL.search && baseURL.search) {
132
+ reqURL.search = baseURL.search;
133
+ }
130
134
  } else {
131
135
  reqURL = baseURL;
132
136
  }
133
137
  reqURL.hash = "";
134
138
 
135
- let finalQuery = query || "";
136
-
137
- const secQuery: string[] = [];
138
- for (const [k, v] of Object.entries(security?.queryParams || {})) {
139
- const q = encodeForm(k, v, { charEncoding: "percent" });
140
- if (typeof q !== "undefined") {
141
- secQuery.push(q);
139
+ // Appends already-encoded query pairs to a query string, replacing any
140
+ // existing pairs with the same key so later sources take precedence.
141
+ const mergeQuery = (current: string, additions: string): string => {
142
+ if (!additions) {
143
+ return current;
142
144
  }
143
- }
144
- if (secQuery.length) {
145
- finalQuery += `&${secQuery.join("&")}`;
146
- }
145
+ const additionKeys = new Set(
146
+ additions
147
+ .split("&")
148
+ .filter((pair) => pair !== "")
149
+ .map((pair) => pair.split("=")[0] ?? ""),
150
+ );
151
+ const kept = current.split("&").filter((pair) => {
152
+ return pair !== "" && !additionKeys.has(pair.split("=")[0] ?? "");
153
+ });
154
+ return [...kept, additions].join("&");
155
+ };
156
+
157
+ const encodeQueryRecord = (record: Record<string, unknown>): string => {
158
+ return Object.entries(record)
159
+ .map(([k, v]) => {
160
+ if (v == null) {
161
+ return undefined;
162
+ }
163
+ const value = v;
164
+ return encodeForm(k, value, {
165
+ explode: Array.isArray(value),
166
+ charEncoding: "percent",
167
+ });
168
+ })
169
+ .filter((pair): pair is string => typeof pair !== "undefined")
170
+ .join("&");
171
+ };
172
+
173
+ const finalQuery = [
174
+ query || "",
175
+ encodeQueryRecord(security?.queryParams || {}),
176
+ ].reduce(mergeQuery, reqURL.search.slice(1));
147
177
 
148
178
  if (finalQuery) {
149
- const q = finalQuery.startsWith("&") ? finalQuery.slice(1) : finalQuery;
150
- reqURL.search = `?${q}`;
179
+ reqURL.search = `?${finalQuery}`;
151
180
  }
152
181
 
153
182
  const headers = new Headers(opHeaders);
@@ -193,9 +222,8 @@ export class ClientSDK {
193
222
  ...options?.fetchOptions,
194
223
  ...options,
195
224
  };
196
- if (!fetchOptions?.signal && conf.timeoutMs && conf.timeoutMs > 0) {
197
- const timeoutSignal = AbortSignal.timeout(conf.timeoutMs);
198
- fetchOptions.signal = timeoutSignal;
225
+ if (!fetchOptions?.signal && conf.timeoutMs != null && conf.timeoutMs > 0) {
226
+ context.timeoutMs = conf.timeoutMs;
199
227
  }
200
228
 
201
229
  if (conf.body instanceof ReadableStream) {
@@ -242,10 +270,19 @@ export class ClientSDK {
242
270
  >
243
271
  > {
244
272
  const { context, isErrorStatusCode } = options;
273
+ const timeoutMs = context.timeoutMs;
245
274
 
246
275
  return retry(
247
276
  async () => {
248
- const req = await this.#hooks.beforeRequest(context, request.clone());
277
+ const cloned = request.clone();
278
+ let attempt = cloned;
279
+ if (timeoutMs != null && timeoutMs > 0) {
280
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
281
+ const combined = combineSignals(cloned.signal, timeoutSignal)
282
+ ?? timeoutSignal;
283
+ attempt = new Request(cloned, { signal: combined });
284
+ }
285
+ const req = await this.#hooks.beforeRequest(context, attempt);
249
286
  await logRequest(this.#logger, req).catch((e) =>
250
287
  this.#logger?.log("Failed to log request:", e)
251
288
  );
@@ -19,7 +19,7 @@ const routes = buildRouteMap({
19
19
  export const app = buildApplication(routes, {
20
20
  name: "mcp",
21
21
  versionInfo: {
22
- currentVersion: "25.12.0",
22
+ currentVersion: "25.12.1",
23
23
  },
24
24
  });
25
25
 
@@ -166,6 +166,7 @@ import { tool$transfersGetCancellation } from "./tools/transfersGetCancellation.
166
166
  import { tool$transfersGetRefund } from "./tools/transfersGetRefund.js";
167
167
  import { tool$transfersInitiateRefund } from "./tools/transfersInitiateRefund.js";
168
168
  import { tool$transfersList } from "./tools/transfersList.js";
169
+ import { tool$transfersListCancellations } from "./tools/transfersListCancellations.js";
169
170
  import { tool$transfersListRefunds } from "./tools/transfersListRefunds.js";
170
171
  import { tool$transfersUpdate } from "./tools/transfersUpdate.js";
171
172
  import { tool$underwritingGet } from "./tools/underwritingGet.js";
@@ -197,7 +198,7 @@ export function createMCPServer(deps: {
197
198
  }) {
198
199
  const server = new McpServer({
199
200
  name: "Moov",
200
- version: "25.12.0",
201
+ version: "25.12.1",
201
202
  });
202
203
 
203
204
  const client = new MoovCore({
@@ -346,6 +347,7 @@ export function createMCPServer(deps: {
346
347
  tool(tool$transfersGet);
347
348
  tool(tool$transfersUpdate);
348
349
  tool(tool$transfersCreateCancellation);
350
+ tool(tool$transfersListCancellations);
349
351
  tool(tool$transfersGetCancellation);
350
352
  tool(tool$transfersInitiateRefund);
351
353
  tool(tool$transfersListRefunds);
@@ -13,21 +13,19 @@ const args = {
13
13
  export const tool$accountsCreate: ToolDefinition<typeof args> = {
14
14
  name: "accounts-create",
15
15
  description:
16
- `You can create **business** or **individual** accounts for your users (i.e., customers, merchants) by passing the required
17
- information to Moov. Requirements differ per account type and requested [capabilities](https://docs.moov.io/guides/accounts/capabilities/requirements/).
16
+ `You can create business or individual accounts for your users (i.e., customers, merchants) by passing the required information to Moov. Requirements differ per account type and requested [capabilities](https://docs.moov.io/guides/accounts/capabilities/reference/).
18
17
 
19
- If you're requesting the \`wallet\`, \`send-funds\`, \`collect-funds\`, or \`card-issuing\` capabilities, you'll need to:
20
- + Send Moov the user [platform terms of service agreement](https://docs.moov.io/guides/accounts/requirements/platform-agreement/) acceptance.
21
- This can be done upon account creation, or by [patching](https://docs.moov.io/api/moov-accounts/accounts/patch/) the account using the \`termsOfService\` field.
22
- If you're creating a business account with the business type \`llc\`, \`partnership\`, or \`privateCorporation\`, you'll need to:
18
+ The \`transfers\` capability is automatically requested for every account. If you request any capability beyond \`transfers\` (for example, \`send-funds.ach\`, \`collect-funds.card-payments\`), you'll need to:
19
+ + Send Moov the user's [platform terms of service agreement](https://docs.moov.io/guides/accounts/requirements/platform-agreement/) acceptance. This can be done at account creation, or by [patching](https://docs.moov.io/api/moov-accounts/accounts/patch/) the account using the \`termsOfService\` field.
20
+ + Fulfill the [verification and underwriting requirements](https://docs.moov.io/guides/accounts/requirements/) for each requested capability. A capability isn't enabled until its requirements pass — check the capability's status to see what's still outstanding.
21
+
22
+ If you're creating a business account, depending on the business type, you'll also need to:
23
23
  + Provide [business representatives](https://docs.moov.io/api/moov-accounts/representatives/) after creating the account.
24
24
  + [Patch](https://docs.moov.io/api/moov-accounts/accounts/patch/) the account to indicate that business representative ownership information is complete.
25
25
 
26
- Visit our documentation to read more about [creating accounts](https://docs.moov.io/guides/accounts/create-accounts/) and [verification requirements](https://docs.moov.io/guides/accounts/requirements/identity-verification/).
27
- Note that the \`mode\` field (for production or sandbox) is only required when creating a _facilitator_ account. All non-facilitator account requests will ignore the mode field and be set to the calling facilitator's mode.
26
+ Visit our documentation to read more about [creating accounts](https://docs.moov.io/guides/accounts/create-accounts/) and [verification requirements](https://docs.moov.io/guides/accounts/requirements/identity-verification/). Note that the \`mode\` field (for production or sandbox) is only required when creating a Partner account. All other account requests will ignore the mode field and be set to the calling Partner account's mode.
28
27
 
29
- To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/) you'll need
30
- to specify the \`/accounts.write\` scope.`,
28
+ To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/) you'll need to specify the \`/accounts.write\` scope.`,
31
29
  args,
32
30
  tool: async (client, args, ctx) => {
33
31
  const [result, apiCall] = await accountsCreate(
@@ -13,7 +13,7 @@ const args = {
13
13
  export const tool$capabilitiesDisable: ToolDefinition<typeof args> = {
14
14
  name: "capabilities-disable",
15
15
  description:
16
- `Disable a specific capability that an account has requested. Read our [capabilities guide](https://docs.moov.io/guides/accounts/capabilities/) to learn more.
16
+ `Disable a specific capability that an account has requested. Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to learn more.
17
17
 
18
18
  To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/)
19
19
  you'll need to specify the \`/accounts/{accountID}/capabilities.write\` scope.`,
@@ -13,7 +13,7 @@ const args = {
13
13
  export const tool$capabilitiesGet: ToolDefinition<typeof args> = {
14
14
  name: "capabilities-get",
15
15
  description:
16
- `Retrieve a specific capability that an account has requested. Read our [capabilities guide](https://docs.moov.io/guides/accounts/capabilities/) to learn more.
16
+ `Retrieve a specific capability that an account has requested. Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to learn more.
17
17
 
18
18
  To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/)
19
19
  you'll need to specify the \`/accounts/{accountID}/capabilities.read\` scope.`,
@@ -14,7 +14,7 @@ export const tool$capabilitiesList: ToolDefinition<typeof args> = {
14
14
  name: "capabilities-list",
15
15
  description: `Retrieve all the capabilities an account has requested.
16
16
 
17
- Read our [capabilities guide](https://docs.moov.io/guides/accounts/capabilities/) to learn more.
17
+ Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to learn more.
18
18
 
19
19
  To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/)
20
20
  you'll need to specify the \`/accounts/{accountID}/capabilities.read\` scope.`,
@@ -13,7 +13,7 @@ const args = {
13
13
  export const tool$capabilitiesRequest: ToolDefinition<typeof args> = {
14
14
  name: "capabilities-request",
15
15
  description:
16
- `Request capabilities for a specific account. Read our [capabilities guide](https://docs.moov.io/guides/accounts/capabilities/) to learn more.
16
+ `Request capabilities for a specific account. Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to learn more.
17
17
 
18
18
  To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/)
19
19
  you'll need to specify the \`/accounts/{accountID}/capabilities.write\` scope.`,
@@ -0,0 +1,38 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { transfersListCancellations } from "../../funcs/transfersListCancellations.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.ListCancellationsRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$transfersListCancellations: ToolDefinition<typeof args> = {
14
+ name: "transfers-list-cancellations",
15
+ description: ` Get a list of cancellations for a transfer.
16
+
17
+ To access this endpoint using a [token](https://docs.moov.io/api/authentication/access-tokens/) you'll need
18
+ to specify the \`/accounts/{accountID}/transfers.read\` scope.`,
19
+ args,
20
+ tool: async (client, args, ctx) => {
21
+ const [result, apiCall] = await transfersListCancellations(
22
+ client,
23
+ args.request,
24
+ { fetchOptions: { signal: ctx.signal } },
25
+ ).$inspect();
26
+
27
+ if (!result.ok) {
28
+ return {
29
+ content: [{ type: "text", text: result.error.message }],
30
+ isError: true,
31
+ };
32
+ }
33
+
34
+ const value = result.value.result;
35
+
36
+ return formatResult(value, apiCall);
37
+ },
38
+ };
@@ -13,6 +13,15 @@ import {
13
13
  } from "./capabilityid.js";
14
14
 
15
15
  export type AddCapabilities = {
16
+ /**
17
+ * Capabilities to request for the account. Request granular capability IDs that match your use case.
18
+ *
19
+ * @remarks
20
+ *
21
+ * Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to choose the right capabilities for your integration.
22
+ *
23
+ * The `send-funds`, `collect-funds`, and `wallet` capability IDs are deprecated. Use granular values such as `send-funds.ach`, `collect-funds.card-payments`, or `wallet.balance` instead.
24
+ */
16
25
  capabilities: Array<CapabilityID>;
17
26
  };
18
27
 
@@ -29,7 +29,13 @@ export type Capability = {
29
29
  *
30
30
  * @remarks
31
31
  *
32
- * The `production-app`, `platform.production-app`, and / or `platform.wallet-transfers` capabilities might appear in your list. These are read-only capabilities that Moov requests and uses for account verification purposes. These capabilities remains active with your account and require no additional action.
32
+ * **Deprecated capabilities**
33
+ *
34
+ * The `send-funds`, `collect-funds`, and `wallet` capability IDs are deprecated. Request granular capabilities instead (for example, `send-funds.ach`, `collect-funds.card-payments`, or `wallet.balance`). Deprecated values will be removed in a future API version.
35
+ *
36
+ * Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to choose the right capabilities for your integration.
37
+ *
38
+ * The `production-app`, `platform.production-app`, and / or `platform.wallet-transfers` capabilities might appear in the list for your Partner account. These are read-only capabilities that Moov requests. These capabilities remain active with your account and require no additional action.
33
39
  */
34
40
  capability: CapabilityID;
35
41
  accountID: string;
@@ -10,7 +10,13 @@ import { ClosedEnum } from "../../types/enums.js";
10
10
  *
11
11
  * @remarks
12
12
  *
13
- * The `production-app`, `platform.production-app`, and / or `platform.wallet-transfers` capabilities might appear in your list. These are read-only capabilities that Moov requests and uses for account verification purposes. These capabilities remains active with your account and require no additional action.
13
+ * **Deprecated capabilities**
14
+ *
15
+ * The `send-funds`, `collect-funds`, and `wallet` capability IDs are deprecated. Request granular capabilities instead (for example, `send-funds.ach`, `collect-funds.card-payments`, or `wallet.balance`). Deprecated values will be removed in a future API version.
16
+ *
17
+ * Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to choose the right capabilities for your integration.
18
+ *
19
+ * The `production-app`, `platform.production-app`, and / or `platform.wallet-transfers` capabilities might appear in the list for your Partner account. These are read-only capabilities that Moov requests. These capabilities remain active with your account and require no additional action.
14
20
  */
15
21
  export const CapabilityID = {
16
22
  Transfers: "transfers",
@@ -36,7 +42,13 @@ export const CapabilityID = {
36
42
  *
37
43
  * @remarks
38
44
  *
39
- * The `production-app`, `platform.production-app`, and / or `platform.wallet-transfers` capabilities might appear in your list. These are read-only capabilities that Moov requests and uses for account verification purposes. These capabilities remains active with your account and require no additional action.
45
+ * **Deprecated capabilities**
46
+ *
47
+ * The `send-funds`, `collect-funds`, and `wallet` capability IDs are deprecated. Request granular capabilities instead (for example, `send-funds.ach`, `collect-funds.card-payments`, or `wallet.balance`). Deprecated values will be removed in a future API version.
48
+ *
49
+ * Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to choose the right capabilities for your integration.
50
+ *
51
+ * The `production-app`, `platform.production-app`, and / or `platform.wallet-transfers` capabilities might appear in the list for your Partner account. These are read-only capabilities that Moov requests. These capabilities remain active with your account and require no additional action.
40
52
  */
41
53
  export type CapabilityID = ClosedEnum<typeof CapabilityID>;
42
54
 
@@ -65,6 +65,15 @@ export type CreateAccount = {
65
65
  * User provided settings to manage an account.
66
66
  */
67
67
  settings?: Settings | undefined;
68
+ /**
69
+ * Capabilities to request when the account is created. Request granular capability IDs that match your use case.
70
+ *
71
+ * @remarks
72
+ *
73
+ * Read our [capabilities reference](https://docs.moov.io/guides/accounts/capabilities/reference/) to choose the right capabilities for your integration.
74
+ *
75
+ * The `send-funds`, `collect-funds`, and `wallet` capability IDs are deprecated. Use granular values such as `send-funds.ach`, `collect-funds.card-payments`, or `wallet.balance` instead.
76
+ */
68
77
  capabilities?: Array<CapabilityID> | undefined;
69
78
  /**
70
79
  * The operating mode for an account.
@@ -48,7 +48,7 @@ import {
48
48
  *
49
49
  * @remarks
50
50
  *
51
- * A payment link must include either `payment` or `payout` details, but not both. For payout payment links,
51
+ * A payment link must include exactly one of `payment`, `payout`, or `customAmountPayment` details. For payout payment links,
52
52
  * `maxUses` will automatically be set to 1, as these are intended for a one-time disbursement
53
53
  * to a specific recipient.
54
54
  */
@@ -68,8 +68,8 @@ export type CreatePaymentLink = {
68
68
  *
69
69
  * In API versions before `2026.07.00`, this was a required field.
70
70
  *
71
- * In API version `2026.07.00` and beyond, this field is required for `fixed` payment amount types and omitted
72
- * for `open` payment amount types.
71
+ * In API version `2026.07.00` and beyond, this field is required for `payment` and `payout` links and must be
72
+ * omitted for `customAmountPayment` links, where the payor chooses the amount.
73
73
  */
74
74
  amount: Amount;
75
75
  /**