@venlyfinance/settlement-mcp 0.4.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +35 -0
- package/CHANGELOG.md +32 -2
- package/README.md +39 -4
- package/dist/client/sdk-client.d.ts +14 -1
- package/dist/client/sdk-client.js +39 -0
- package/dist/constants.d.ts +2 -2
- package/dist/constants.js +3 -3
- package/dist/frontend.d.ts +17 -1
- package/dist/frontend.js +339 -31
- package/dist/index.js +21 -4
- package/dist/resources.js +5 -3
- package/dist/review-cli.d.ts +4 -0
- package/dist/review-cli.js +131 -0
- package/dist/staging-smoke.d.ts +1 -1
- package/dist/staging-smoke.js +9 -0
- package/dist/tools/read-tools.js +79 -0
- package/dist/tools/write-tools.js +147 -0
- package/dist/types.d.ts +29 -8
- package/package.json +5 -3
package/dist/staging-smoke.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const EXPECTED_TOOLS: readonly ["list_ramp_requests", "get_ramp_request", "list_accounts", "get_account", "list_wallets", "list_virtual_bank_accounts", "get_virtual_bank_account", "reconcile_by_reference_code", "list_transfers", "get_transfer", "list_parties", "get_party", "get_reference_data", "create_party", "create_account", "create_virtual_bank_account", "create_fiat_transfer", "create_crypto_transfer", "approve_ramp_request", "reject_ramp_request", "create_payment_session", "quote_x402_payment", "get_journey_blueprint", "review_screen"];
|
|
1
|
+
export declare const EXPECTED_TOOLS: readonly ["list_ramp_requests", "get_ramp_request", "list_accounts", "get_account", "list_wallets", "list_virtual_bank_accounts", "get_virtual_bank_account", "reconcile_by_reference_code", "list_transfers", "get_transfer", "list_parties", "get_party", "get_reference_data", "create_party", "create_account", "create_virtual_bank_account", "create_fiat_transfer", "create_crypto_transfer", "approve_ramp_request", "reject_ramp_request", "create_payment_session", "list_payouts", "get_payout", "list_payout_routes", "list_payout_bank_accounts", "register_payout_bank_account", "create_payout_route", "prepare_payout_ownership_proof", "complete_payout_ownership_proof", "request_payout", "quote_x402_payment", "get_journey_blueprint", "review_screen"];
|
|
2
2
|
export declare const EXPECTED_RESOURCE_URIS: readonly ["venly://capabilities", "venly://safety", "venly://workflows/international-account", "venly://workflows/mock-to-staging", "venly://frontend/agents"];
|
|
3
3
|
export declare const EXPECTED_PROMPTS: readonly ["build_international_account"];
|
|
4
4
|
export interface DiscoveryNames {
|
package/dist/staging-smoke.js
CHANGED
|
@@ -25,6 +25,15 @@ export const EXPECTED_TOOLS = [
|
|
|
25
25
|
"approve_ramp_request",
|
|
26
26
|
"reject_ramp_request",
|
|
27
27
|
"create_payment_session",
|
|
28
|
+
"list_payouts",
|
|
29
|
+
"get_payout",
|
|
30
|
+
"list_payout_routes",
|
|
31
|
+
"list_payout_bank_accounts",
|
|
32
|
+
"register_payout_bank_account",
|
|
33
|
+
"create_payout_route",
|
|
34
|
+
"prepare_payout_ownership_proof",
|
|
35
|
+
"complete_payout_ownership_proof",
|
|
36
|
+
"request_payout",
|
|
28
37
|
"quote_x402_payment",
|
|
29
38
|
"get_journey_blueprint",
|
|
30
39
|
"review_screen",
|
package/dist/tools/read-tools.js
CHANGED
|
@@ -270,4 +270,83 @@ export function registerReadTools(server, client) {
|
|
|
270
270
|
return errorResult(e.message);
|
|
271
271
|
}
|
|
272
272
|
});
|
|
273
|
+
server.registerTool("list_payouts", {
|
|
274
|
+
title: "List payouts",
|
|
275
|
+
description: "List third-party payouts for an account (finance GET /v1/accounts/{accountId}/payouts). " +
|
|
276
|
+
"A payout moves crypto out of the account and settles fiat to a registered beneficiary " +
|
|
277
|
+
"bank account. Statuses: REQUESTED, SENDING, PROVIDER_PROCESSING, COMPLETED, REJECTED, " +
|
|
278
|
+
"FAILED, RETURNED. Read-only.",
|
|
279
|
+
inputSchema: {
|
|
280
|
+
accountId: z.string(),
|
|
281
|
+
status: z
|
|
282
|
+
.enum([
|
|
283
|
+
"REQUESTED",
|
|
284
|
+
"SENDING",
|
|
285
|
+
"PROVIDER_PROCESSING",
|
|
286
|
+
"COMPLETED",
|
|
287
|
+
"REJECTED",
|
|
288
|
+
"FAILED",
|
|
289
|
+
"RETURNED",
|
|
290
|
+
])
|
|
291
|
+
.optional(),
|
|
292
|
+
page: z.number().int().min(1).optional(),
|
|
293
|
+
size: z.number().int().min(1).max(200).optional(),
|
|
294
|
+
},
|
|
295
|
+
annotations: READ_ONLY,
|
|
296
|
+
}, async ({ accountId, ...params }) => {
|
|
297
|
+
try {
|
|
298
|
+
const result = await client.listPayouts(accountId, params);
|
|
299
|
+
return jsonResult({ count: result.length, payouts: result });
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
return errorResult(e.message);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
server.registerTool("get_payout", {
|
|
306
|
+
title: "Get one payout",
|
|
307
|
+
description: "Fetch one payout by id (finance GET /v1/accounts/{accountId}/payouts/{payoutId}). " +
|
|
308
|
+
"COMPLETED payouts carry settledFiatAmount and completedAt; REJECTED/FAILED/RETURNED " +
|
|
309
|
+
"carry a failureReason. Read-only.",
|
|
310
|
+
inputSchema: { accountId: z.string(), payoutId: z.string() },
|
|
311
|
+
annotations: READ_ONLY,
|
|
312
|
+
}, async ({ accountId, payoutId }) => {
|
|
313
|
+
try {
|
|
314
|
+
return jsonResult(await client.getPayout(accountId, payoutId));
|
|
315
|
+
}
|
|
316
|
+
catch (e) {
|
|
317
|
+
return errorResult(e.message);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
server.registerTool("list_payout_routes", {
|
|
321
|
+
title: "List payout routes",
|
|
322
|
+
description: "List an account's payout routes (finance GET /v1/accounts/{accountId}/payout-routes). " +
|
|
323
|
+
"A route binds a beneficiary bank account to this account and a deposit asset; only an " +
|
|
324
|
+
"ACTIVE route (ownership proof completed) can carry payouts. Read-only.",
|
|
325
|
+
inputSchema: { accountId: z.string() },
|
|
326
|
+
annotations: READ_ONLY,
|
|
327
|
+
}, async ({ accountId }) => {
|
|
328
|
+
try {
|
|
329
|
+
const result = await client.listPayoutRoutes(accountId);
|
|
330
|
+
return jsonResult({ count: result.length, payoutRoutes: result });
|
|
331
|
+
}
|
|
332
|
+
catch (e) {
|
|
333
|
+
return errorResult(e.message);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
server.registerTool("list_payout_bank_accounts", {
|
|
337
|
+
title: "List beneficiary bank accounts",
|
|
338
|
+
description: "List the payout (beneficiary) bank accounts registered on a party " +
|
|
339
|
+
"(finance GET /v1/parties/{partyId}/payout-bank-accounts). Rail details come back " +
|
|
340
|
+
"masked. Only ACTIVE accounts can back a payout route. Read-only.",
|
|
341
|
+
inputSchema: { partyId: z.string() },
|
|
342
|
+
annotations: READ_ONLY,
|
|
343
|
+
}, async ({ partyId }) => {
|
|
344
|
+
try {
|
|
345
|
+
const result = await client.listPayoutBankAccounts(partyId);
|
|
346
|
+
return jsonResult({ count: result.length, payoutBankAccounts: result });
|
|
347
|
+
}
|
|
348
|
+
catch (e) {
|
|
349
|
+
return errorResult(e.message);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
273
352
|
}
|
|
@@ -332,4 +332,151 @@ export function registerWriteTools(server, client, env) {
|
|
|
332
332
|
return errorResult(e.message);
|
|
333
333
|
}
|
|
334
334
|
});
|
|
335
|
+
server.registerTool("register_payout_bank_account", {
|
|
336
|
+
title: "Register a beneficiary bank account",
|
|
337
|
+
description: "Register a payout (beneficiary) bank account on a party (finance POST " +
|
|
338
|
+
"/v1/parties/{partyId}/payout-bank-accounts). The account starts PENDING; an operator " +
|
|
339
|
+
"activates it before it can back a payout route. Rail details come back masked. " +
|
|
340
|
+
"Dry-run by default.",
|
|
341
|
+
inputSchema: {
|
|
342
|
+
partyId: z.string(),
|
|
343
|
+
rail: z.enum(["SEPA", "US_ACH"]),
|
|
344
|
+
fiatCurrency: z.string().min(3).max(3),
|
|
345
|
+
label: z.string().optional(),
|
|
346
|
+
accountHolderName: z.string().min(1),
|
|
347
|
+
iban: z.string().optional().describe("SEPA rail"),
|
|
348
|
+
bic: z.string().optional().describe("SEPA rail"),
|
|
349
|
+
accountNumber: z.string().optional().describe("US_ACH rail"),
|
|
350
|
+
abaRoutingNumber: z.string().optional().describe("US_ACH rail"),
|
|
351
|
+
accountType: z.enum(["CHECKING", "SAVINGS"]).optional().describe("US_ACH rail"),
|
|
352
|
+
bankName: z.string().optional(),
|
|
353
|
+
confirm: confirmField,
|
|
354
|
+
},
|
|
355
|
+
annotations: WRITE_ANNOTATIONS,
|
|
356
|
+
}, async ({ partyId, confirm, iban, bic, accountNumber, abaRoutingNumber, accountType, ...rest }) => {
|
|
357
|
+
const body = {
|
|
358
|
+
...rest,
|
|
359
|
+
railDetails: { iban, bic, accountNumber, abaRoutingNumber, accountType },
|
|
360
|
+
};
|
|
361
|
+
const gate = evaluateWriteGate(confirm, env);
|
|
362
|
+
if (!gate.armed) {
|
|
363
|
+
return jsonResult(buildDryRun("register_payout_bank_account", "POST", "finance", `/parties/${partyId}/payout-bank-accounts`, body, gate));
|
|
364
|
+
}
|
|
365
|
+
try {
|
|
366
|
+
return executionResult(gate, await client.registerPayoutBankAccount(partyId, body));
|
|
367
|
+
}
|
|
368
|
+
catch (e) {
|
|
369
|
+
return errorResult(e.message);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
server.registerTool("create_payout_route", {
|
|
373
|
+
title: "Create a payout route",
|
|
374
|
+
description: "Bind an ACTIVE beneficiary bank account to an account and a deposit asset (finance " +
|
|
375
|
+
"POST /v1/accounts/{accountId}/payout-routes). The route starts AWAITING_OWNERSHIP_PROOF; " +
|
|
376
|
+
"complete_payout_ownership_proof activates it. Dry-run by default.",
|
|
377
|
+
inputSchema: {
|
|
378
|
+
accountId: z.string(),
|
|
379
|
+
payoutBankAccountId: z.string(),
|
|
380
|
+
chain: z.enum(["AVALANCHE", "BASE", "ETHEREUM", "POLYGON", "SOLANA"]),
|
|
381
|
+
asset: z.string().min(1).describe("Deposit asset name, e.g. USDC"),
|
|
382
|
+
confirm: confirmField,
|
|
383
|
+
},
|
|
384
|
+
annotations: WRITE_ANNOTATIONS,
|
|
385
|
+
}, async ({ accountId, payoutBankAccountId, chain, asset, confirm }) => {
|
|
386
|
+
const body = { payoutBankAccountId, depositAsset: { chain, name: asset } };
|
|
387
|
+
const gate = evaluateWriteGate(confirm, env);
|
|
388
|
+
if (!gate.armed) {
|
|
389
|
+
return jsonResult(buildDryRun("create_payout_route", "POST", "finance", `/accounts/${accountId}/payout-routes`, body, gate));
|
|
390
|
+
}
|
|
391
|
+
try {
|
|
392
|
+
return executionResult(gate, await client.createPayoutRoute(accountId, body));
|
|
393
|
+
}
|
|
394
|
+
catch (e) {
|
|
395
|
+
return errorResult(e.message);
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
server.registerTool("prepare_payout_ownership_proof", {
|
|
399
|
+
title: "Prepare route ownership proof",
|
|
400
|
+
description: "Get the message the route's funding wallet must sign (finance POST " +
|
|
401
|
+
"/v1/accounts/{accountId}/payout-routes/{routeId}/ownership-proof/prepare). Takes no " +
|
|
402
|
+
"body: the server derives the wallet and chain from the route. The signature itself " +
|
|
403
|
+
"is produced by the wallet owner, never by this server. Dry-run by default.",
|
|
404
|
+
inputSchema: {
|
|
405
|
+
accountId: z.string(),
|
|
406
|
+
routeId: z.string(),
|
|
407
|
+
confirm: confirmField,
|
|
408
|
+
},
|
|
409
|
+
annotations: WRITE_ANNOTATIONS,
|
|
410
|
+
}, async ({ accountId, routeId, confirm }) => {
|
|
411
|
+
const gate = evaluateWriteGate(confirm, env);
|
|
412
|
+
if (!gate.armed) {
|
|
413
|
+
return jsonResult(buildDryRun("prepare_payout_ownership_proof", "POST", "finance", `/accounts/${accountId}/payout-routes/${routeId}/ownership-proof/prepare`, {}, gate));
|
|
414
|
+
}
|
|
415
|
+
try {
|
|
416
|
+
return executionResult(gate, await client.preparePayoutOwnershipProof(accountId, routeId));
|
|
417
|
+
}
|
|
418
|
+
catch (e) {
|
|
419
|
+
return errorResult(e.message);
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
server.registerTool("complete_payout_ownership_proof", {
|
|
423
|
+
title: "Complete route ownership proof",
|
|
424
|
+
description: "Submit the signed ownership-proof message; on success the route becomes ACTIVE " +
|
|
425
|
+
"(finance POST /v1/accounts/{accountId}/payout-routes/{routeId}/ownership-proof/complete). " +
|
|
426
|
+
"Dry-run by default.",
|
|
427
|
+
inputSchema: {
|
|
428
|
+
accountId: z.string(),
|
|
429
|
+
routeId: z.string(),
|
|
430
|
+
message: z.string().min(1),
|
|
431
|
+
signature: z.string().min(1),
|
|
432
|
+
confirm: confirmField,
|
|
433
|
+
},
|
|
434
|
+
annotations: WRITE_ANNOTATIONS,
|
|
435
|
+
}, async ({ accountId, routeId, confirm, ...body }) => {
|
|
436
|
+
const gate = evaluateWriteGate(confirm, env);
|
|
437
|
+
if (!gate.armed) {
|
|
438
|
+
return jsonResult(buildDryRun("complete_payout_ownership_proof", "POST", "finance", `/accounts/${accountId}/payout-routes/${routeId}/ownership-proof/complete`, body, gate));
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
return executionResult(gate, await client.completePayoutOwnershipProof(accountId, routeId, body));
|
|
442
|
+
}
|
|
443
|
+
catch (e) {
|
|
444
|
+
return errorResult(e.message);
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
server.registerTool("request_payout", {
|
|
448
|
+
title: "Request a payout",
|
|
449
|
+
description: "Move crypto out of the account and settle fiat to the route's beneficiary bank " +
|
|
450
|
+
"account (finance POST /v1/accounts/{accountId}/payouts). Requires an ACTIVE payout " +
|
|
451
|
+
"route. This is money leaving the platform. Dry-run by default.",
|
|
452
|
+
inputSchema: {
|
|
453
|
+
accountId: z.string(),
|
|
454
|
+
payoutRouteId: z.string(),
|
|
455
|
+
cryptoAmount: z.number().positive(),
|
|
456
|
+
idempotencyKey: z
|
|
457
|
+
.string()
|
|
458
|
+
.optional()
|
|
459
|
+
.describe("UUID; generated when omitted"),
|
|
460
|
+
confirm: confirmField,
|
|
461
|
+
},
|
|
462
|
+
annotations: WRITE_ANNOTATIONS,
|
|
463
|
+
}, async ({ accountId, confirm, ...rest }) => {
|
|
464
|
+
const body = {
|
|
465
|
+
payoutRouteId: rest.payoutRouteId,
|
|
466
|
+
cryptoAmount: rest.cryptoAmount,
|
|
467
|
+
idempotencyKey: rest.idempotencyKey ?? crypto.randomUUID(),
|
|
468
|
+
};
|
|
469
|
+
const gate = evaluateWriteGate(confirm, env);
|
|
470
|
+
if (!gate.armed) {
|
|
471
|
+
const dryRun = buildDryRun("request_payout", "POST", "finance", `/accounts/${accountId}/payouts`, body, gate);
|
|
472
|
+
dryRun.note += " Payouts are outbound money movement; the route must be ACTIVE.";
|
|
473
|
+
return jsonResult(dryRun);
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
return executionResult(gate, await client.requestPayout(accountId, body));
|
|
477
|
+
}
|
|
478
|
+
catch (e) {
|
|
479
|
+
return errorResult(e.message);
|
|
480
|
+
}
|
|
481
|
+
});
|
|
335
482
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -10,19 +10,27 @@ import type { FinanceComponents, FundflowComponents } from "@venlyfinance/sdk";
|
|
|
10
10
|
import type { VenlyEnvironment } from "./constants.js";
|
|
11
11
|
type FinanceSchemas = FinanceComponents["schemas"];
|
|
12
12
|
type FundflowSchemas = FundflowComponents["schemas"];
|
|
13
|
-
export type AddressInput = FinanceSchemas["
|
|
14
|
-
export type Party = FinanceSchemas["
|
|
13
|
+
export type AddressInput = FinanceSchemas["AddressDto"];
|
|
14
|
+
export type Party = FinanceSchemas["PartyDto"];
|
|
15
15
|
export type CreatePartyInput = FinanceSchemas["CreatePartyRequest"];
|
|
16
|
-
export type Account = FinanceSchemas["
|
|
16
|
+
export type Account = FinanceSchemas["AccountListItemDto"];
|
|
17
17
|
export type CreateAccountInput = FinanceSchemas["CreateAccountRequest"];
|
|
18
|
-
export type Wallet = FinanceSchemas["
|
|
19
|
-
export type VirtualBankAccount = FinanceSchemas["
|
|
18
|
+
export type Wallet = FinanceSchemas["WalletBalanceDto"];
|
|
19
|
+
export type VirtualBankAccount = FinanceSchemas["VirtualBankAccountResponse"];
|
|
20
20
|
export type CreateVirtualBankAccountInput = FinanceSchemas["CreateVirtualBankAccountRequest"];
|
|
21
|
-
export type PaymentSession = FinanceSchemas["
|
|
22
|
-
export type CreatePayInSessionRequest = FinanceSchemas["
|
|
23
|
-
export type Transfer = FinanceSchemas["
|
|
21
|
+
export type PaymentSession = FinanceSchemas["PayInSessionDto"];
|
|
22
|
+
export type CreatePayInSessionRequest = FinanceSchemas["CreatePayInSessionInput"];
|
|
23
|
+
export type Transfer = FinanceSchemas["TransferRequestDto"];
|
|
24
24
|
export type CurrentCreateFiatTransferInput = FinanceSchemas["CreateFiatTransferInput"];
|
|
25
25
|
export type CreateCryptoTransferInput = FinanceSchemas["CreateCryptoTransferInput"];
|
|
26
|
+
export type Payout = FinanceSchemas["PayoutDto"];
|
|
27
|
+
export type CreatePayoutInput = FinanceSchemas["CreatePayoutRequest"];
|
|
28
|
+
export type PayoutRoute = FinanceSchemas["PayoutRouteDto"];
|
|
29
|
+
export type CreatePayoutRouteInput = FinanceSchemas["CreatePayoutRouteRequest"];
|
|
30
|
+
export type PayoutBankAccount = FinanceSchemas["PayoutBankAccountDto"];
|
|
31
|
+
export type RegisterPayoutBankAccountInput = FinanceSchemas["RegisterPayoutBankAccountRequest"];
|
|
32
|
+
export type PayoutOwnershipProof = FinanceSchemas["PayoutOwnershipProofDto"];
|
|
33
|
+
export type CompleteOwnershipProofInput = FinanceSchemas["CompletePayoutOwnershipProofRequest"];
|
|
26
34
|
export type RampRequestDto = FundflowSchemas["RampRequestDto"];
|
|
27
35
|
export type RampRequestListItem = FundflowSchemas["RampRequestListItem"];
|
|
28
36
|
export type OptimisticLockingBody = FundflowSchemas["UpdateWithOptimisticLockingRequest"];
|
|
@@ -118,5 +126,18 @@ export interface VenlyClient {
|
|
|
118
126
|
approveRampRequest(id: string, body: OptimisticLockingBody): Promise<RampRequestDto>;
|
|
119
127
|
rejectRampRequest(id: string, body: OptimisticLockingBody): Promise<RampRequestDto>;
|
|
120
128
|
createPayInSession(accountId: string, body: CreatePayInSessionRequest): Promise<PaymentSession>;
|
|
129
|
+
listPayouts(accountId: string, params?: {
|
|
130
|
+
page?: number;
|
|
131
|
+
size?: number;
|
|
132
|
+
status?: string;
|
|
133
|
+
}): Promise<Payout[]>;
|
|
134
|
+
getPayout(accountId: string, payoutId: string): Promise<Payout>;
|
|
135
|
+
requestPayout(accountId: string, body: CreatePayoutInput): Promise<Payout>;
|
|
136
|
+
listPayoutRoutes(accountId: string): Promise<PayoutRoute[]>;
|
|
137
|
+
createPayoutRoute(accountId: string, body: CreatePayoutRouteInput): Promise<PayoutRoute>;
|
|
138
|
+
preparePayoutOwnershipProof(accountId: string, routeId: string): Promise<PayoutOwnershipProof>;
|
|
139
|
+
completePayoutOwnershipProof(accountId: string, routeId: string, body: CompleteOwnershipProofInput): Promise<PayoutRoute>;
|
|
140
|
+
listPayoutBankAccounts(partyId: string): Promise<PayoutBankAccount[]>;
|
|
141
|
+
registerPayoutBankAccount(partyId: string, body: RegisterPayoutBankAccountInput): Promise<PayoutBankAccount>;
|
|
121
142
|
}
|
|
122
143
|
export {};
|
package/package.json
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venlyfinance/settlement-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Venly Finance MCP: SDK-backed tools, resources and prompts for building international money products safely.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"venly-finance-mcp": "dist/index.js",
|
|
8
|
-
"venly-settlement-mcp": "dist/index.js"
|
|
8
|
+
"venly-settlement-mcp": "dist/index.js",
|
|
9
|
+
"settlement-mcp": "dist/index.js"
|
|
9
10
|
},
|
|
10
11
|
"main": "dist/index.js",
|
|
11
12
|
"files": [
|
|
12
13
|
"dist",
|
|
13
14
|
"scripts",
|
|
14
15
|
"skills",
|
|
16
|
+
"AGENTS.md",
|
|
15
17
|
"README.md",
|
|
16
18
|
"CHANGELOG.md"
|
|
17
19
|
],
|
|
@@ -27,7 +29,7 @@
|
|
|
27
29
|
"node": ">=20"
|
|
28
30
|
},
|
|
29
31
|
"dependencies": {
|
|
30
|
-
"@venlyfinance/sdk": "^0.
|
|
32
|
+
"@venlyfinance/sdk": "^0.4.0",
|
|
31
33
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
32
34
|
"zod": "^3.23.8"
|
|
33
35
|
},
|