@dexterai/x402 6.0.0-rc.5 → 6.0.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 (46) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +5 -1
  3. package/REFERENCE.md +33 -3
  4. package/dist/adapters/index.d.cts +3 -2
  5. package/dist/adapters/index.d.ts +3 -2
  6. package/dist/batch-settlement/index.cjs +1 -1
  7. package/dist/batch-settlement/index.d.cts +4 -3
  8. package/dist/batch-settlement/index.d.ts +4 -3
  9. package/dist/batch-settlement/index.js +1 -1
  10. package/dist/batch-settlement/seller/index.cjs +1 -1
  11. package/dist/batch-settlement/seller/index.d.cts +5 -4
  12. package/dist/batch-settlement/seller/index.d.ts +5 -4
  13. package/dist/batch-settlement/seller/index.js +1 -1
  14. package/dist/client/index.d.cts +5 -3
  15. package/dist/client/index.d.ts +5 -3
  16. package/dist/mcp/index.cjs +1 -0
  17. package/dist/mcp/index.d.cts +183 -0
  18. package/dist/mcp/index.d.ts +183 -0
  19. package/dist/mcp/index.js +1 -0
  20. package/dist/react/index.d.cts +2 -2
  21. package/dist/react/index.d.ts +2 -2
  22. package/dist/server/index.cjs +1 -1
  23. package/dist/server/index.d.cts +5 -4
  24. package/dist/server/index.d.ts +5 -4
  25. package/dist/server/index.js +1 -1
  26. package/dist/tab/adapters/solana/index.cjs +1 -1
  27. package/dist/tab/adapters/solana/index.js +1 -1
  28. package/dist/tab/index.cjs +4 -4
  29. package/dist/tab/index.d.cts +3 -2
  30. package/dist/tab/index.d.ts +3 -2
  31. package/dist/tab/index.js +1 -1
  32. package/dist/tab/seller/index.cjs +7 -7
  33. package/dist/tab/seller/index.js +1 -1
  34. package/dist/{types-CHQzNDR6.d.ts → types-BvK5UjA9.d.ts} +1 -1
  35. package/dist/{types-BvQpNtFw.d.cts → types-C08JT9MG.d.ts} +2 -236
  36. package/dist/{types-CkcNYx1Q.d.ts → types-C6IbRTpi.d.ts} +1 -1
  37. package/dist/{types-BvQpNtFw.d.ts → types-CRs5sEcb.d.cts} +2 -236
  38. package/dist/{types-CBQKKFxJ.d.cts → types-Cyyl3Cw_.d.cts} +1 -1
  39. package/dist/{types-DwVhPqOZ.d.ts → types-DGVtb7cl.d.cts} +4 -2
  40. package/dist/{types-BbvuPNXl.d.cts → types-DjDjuUc6.d.ts} +4 -2
  41. package/dist/types-DolSK-3d.d.cts +237 -0
  42. package/dist/types-DolSK-3d.d.ts +237 -0
  43. package/dist/{types-JpkrtFbZ.d.cts → types-RauRuMb7.d.cts} +1 -1
  44. package/docs/mcp.md +98 -0
  45. package/examples/mcp-paid-tool.ts +39 -0
  46. package/package.json +16 -10
@@ -0,0 +1,237 @@
1
+ /**
2
+ * x402 v2 SDK — Shared Types
3
+ *
4
+ * Chain-agnostic types for x402 v2 payments.
5
+ * Works with Solana, Base, and any future x402-compatible networks.
6
+ */
7
+
8
+ /**
9
+ * Context passed to a PayToProvider function.
10
+ * Contains request-scoped information for dynamic address resolution.
11
+ */
12
+ interface PayToContext {
13
+ /** The PAYMENT-SIGNATURE header value (present on retry/verify, undefined on initial 402) */
14
+ paymentHeader?: string;
15
+ /** Amount in atomic units (e.g., '10000' for 0.01 USDC) */
16
+ amountAtomic?: string;
17
+ /** The resource URL being accessed */
18
+ resourceUrl?: string;
19
+ }
20
+ /**
21
+ * Optional defaults a PayToProvider can advertise for auto-configuration.
22
+ * Attached as `_x402Defaults` on the provider function.
23
+ */
24
+ interface PayToProviderDefaults {
25
+ /** Default CAIP-2 network (e.g., 'eip155:8453' for Base) */
26
+ network?: string;
27
+ /** Default facilitator URL */
28
+ facilitatorUrl?: string;
29
+ }
30
+ /**
31
+ * A function that dynamically resolves a payment address.
32
+ * Used for providers like Stripe that generate per-request deposit addresses.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * import { stripePayTo } from '@dexterai/x402/server';
37
+ *
38
+ * const provider = stripePayTo(process.env.STRIPE_SECRET_KEY);
39
+ * const address = await provider({ amountAtomic: '10000' });
40
+ * ```
41
+ */
42
+ type PayToProvider = ((context: PayToContext) => Promise<string>) & {
43
+ /** Auto-configuration defaults (set by provider factories like stripePayTo) */
44
+ _x402Defaults?: PayToProviderDefaults;
45
+ };
46
+ /**
47
+ * Resource info included in payment requirements
48
+ */
49
+ interface ResourceInfo {
50
+ /** Resource URL */
51
+ url: string;
52
+ /** Human-readable description */
53
+ description?: string;
54
+ /** MIME type of the resource */
55
+ mimeType?: string;
56
+ }
57
+ /**
58
+ * Extra fields in payment requirements
59
+ * Chain-specific fields may vary
60
+ */
61
+ interface AcceptsExtra {
62
+ /** Facilitator address that pays tx fees (required for Solana) */
63
+ feePayer?: string;
64
+ /** Token decimals (optional - defaults to 6 for USDC) */
65
+ decimals?: number;
66
+ /** EIP-712: Token name (EVM only) */
67
+ name?: string;
68
+ /** EIP-712: Token version (EVM only) */
69
+ version?: string;
70
+ /**
71
+ * batch-settlement: on-chain authorizer that the escrow channel pays into.
72
+ * Provided by the facilitator's batch-settlement kind. EVM only.
73
+ */
74
+ receiverAuthorizer?: string;
75
+ /** Tab seller-wire header advertised by the default hosted scheme. */
76
+ voucherHeader?: string;
77
+ /** Tab registration encoding carried inside each seller voucher. */
78
+ registrationEncoding?: string;
79
+ /** Immutable commercial-terms version for this Tab offer. */
80
+ termsVersion?: string;
81
+ /** Event that makes usage accepted under the advertised terms version. */
82
+ acceptanceRule?: string;
83
+ /** Additional chain-specific fields */
84
+ [key: string]: unknown;
85
+ }
86
+ /**
87
+ * A single payment option in the accepts array
88
+ */
89
+ interface PaymentAccept {
90
+ /** x402 version (1 or 2, defaults to 2 if not specified) */
91
+ x402Version?: 1 | 2;
92
+ /**
93
+ * Payment scheme: 'exact' for EIP-3009 chains, 'exact-approval' for
94
+ * approval-based chains like BSC, 'batch-settlement' for the EVM
95
+ * escrow-channel batching scheme (discrete API purchases, gas-amortized),
96
+ * 'tab' (SVM only) for streaming session-key vouchers against an
97
+ * on-chain vault.
98
+ */
99
+ scheme: 'exact' | 'exact-approval' | 'batch-settlement' | 'tab';
100
+ /** CAIP-2 network identifier (v1: 'solana', v2: 'solana:5eykt...') */
101
+ network: string;
102
+ /** Payment amount in atomic units (x402 v2 spec field) */
103
+ amount: string;
104
+ /** @deprecated v1 field — use `amount` instead. Kept for backwards compatibility with v1 data. */
105
+ maxAmountRequired?: string;
106
+ /** Token address */
107
+ asset: string;
108
+ /** Seller's address to receive payment */
109
+ payTo: string;
110
+ /** Maximum seconds until payment expires */
111
+ maxTimeoutSeconds: number;
112
+ /** Chain-specific extra data */
113
+ extra?: AcceptsExtra;
114
+ }
115
+ /**
116
+ * Full PaymentRequired structure (sent in PAYMENT-REQUIRED header)
117
+ */
118
+ interface PaymentRequired {
119
+ /** x402 version (always 2) */
120
+ x402Version: 2;
121
+ /** Resource being accessed */
122
+ resource: ResourceInfo;
123
+ /** Available payment options */
124
+ accepts: PaymentAccept[];
125
+ /** Optional error message */
126
+ error?: string;
127
+ /** Protocol extensions */
128
+ extensions?: Record<string, unknown>;
129
+ }
130
+ /**
131
+ * Response from /verify endpoint
132
+ */
133
+ interface VerifyResponse {
134
+ /** Whether the payment is valid */
135
+ isValid: boolean;
136
+ /** Reason for invalidity (if invalid) */
137
+ invalidReason?: string;
138
+ /** Payer address */
139
+ payer?: string;
140
+ }
141
+ /**
142
+ * Response from /settle endpoint
143
+ */
144
+ interface SettleResponse {
145
+ /** Whether settlement succeeded */
146
+ success: boolean;
147
+ /** Transaction signature/hash */
148
+ transaction?: string;
149
+ /** Network the payment was made on */
150
+ network: string;
151
+ /** Error reason (if failed) */
152
+ errorReason?: string;
153
+ /** Error code (if failed) */
154
+ errorCode?: string;
155
+ /** Payer address */
156
+ payer?: string;
157
+ /** Protocol extensions returned by the facilitator (e.g., sponsored-access recommendations) */
158
+ extensions?: Record<string, unknown>;
159
+ }
160
+ /**
161
+ * A single access pass tier offered by a seller
162
+ */
163
+ interface AccessPassTier {
164
+ /** Tier ID (e.g., '1h', '24h') */
165
+ id: string;
166
+ /** Human-readable label (e.g., '1 hour') */
167
+ label: string;
168
+ /** Duration in seconds */
169
+ seconds: number;
170
+ /** Price in USD (e.g., '0.50') */
171
+ price: string;
172
+ /** Price in atomic units (e.g., '500000') */
173
+ priceAtomic: string;
174
+ }
175
+ /**
176
+ * Access pass info returned in X-ACCESS-PASS-TIERS header
177
+ */
178
+ interface AccessPassInfo {
179
+ /** Available tiers (if tier-based pricing) */
180
+ tiers?: AccessPassTier[];
181
+ /** Rate per hour in USD (if custom duration pricing) */
182
+ ratePerHour?: string;
183
+ /** Pass issuer identifier */
184
+ issuer?: string;
185
+ }
186
+ /**
187
+ * JWT claims inside an access pass token
188
+ */
189
+ interface AccessPassClaims {
190
+ /** Subject — always 'x402-access-pass' */
191
+ sub: string;
192
+ /** Tier ID or 'custom' */
193
+ tier: string;
194
+ /** Duration in seconds */
195
+ duration: number;
196
+ /** Issued at (unix seconds) */
197
+ iat: number;
198
+ /** Expires at (unix seconds) */
199
+ exp: number;
200
+ /** Payer wallet address */
201
+ payer: string;
202
+ /** Network used for payment */
203
+ network: string;
204
+ /** Issuer identifier */
205
+ iss: string;
206
+ }
207
+ /**
208
+ * Client-side access pass configuration
209
+ */
210
+ interface AccessPassClientConfig {
211
+ /** Enable access pass mode (default: true when this config is present) */
212
+ enabled?: boolean;
213
+ /** Preferred tier ID (e.g., '1h') — pick this tier if available */
214
+ preferTier?: string;
215
+ /** Preferred custom duration in seconds (e.g., 3600) */
216
+ preferDuration?: number;
217
+ /** Maximum amount willing to spend in USD (e.g., '2.00') */
218
+ maxSpend?: string;
219
+ /** Auto-renew expired passes (default: true) */
220
+ autoRenew?: boolean;
221
+ }
222
+ /**
223
+ * SDK error codes
224
+ */
225
+ type X402ErrorCode = 'missing_payment_required_header' | 'invalid_payment_required' | 'unsupported_network' | 'no_matching_payment_option' | 'missing_fee_payer' | 'missing_decimals' | 'missing_amount' | 'amount_exceeds_max' | 'insufficient_balance' | 'wallet_missing_sign_transaction' | 'wallet_not_connected' | 'wallet_disconnected' | 'user_rejected_signature' | 'transaction_build_failed' | 'payment_rejected' | 'rpc_timeout' | 'facilitator_timeout' | 'invalid_payment_signature' | 'facilitator_verify_failed' | 'facilitator_settle_failed' | 'facilitator_request_failed' | 'no_matching_requirement' | 'access_pass_expired' | 'access_pass_invalid' | 'access_pass_tier_not_found' | 'access_pass_exceeds_max_spend';
226
+ /**
227
+ * Custom error class for x402 operations
228
+ */
229
+ declare class X402Error extends Error {
230
+ /** Error code for programmatic handling */
231
+ code: X402ErrorCode;
232
+ /** Additional error details */
233
+ details?: unknown;
234
+ constructor(code: X402ErrorCode, message: string, details?: unknown);
235
+ }
236
+
237
+ export { type AccessPassClientConfig as A, type PaymentAccept as P, type ResourceInfo as R, type SettleResponse as S, type VerifyResponse as V, X402Error as X, type AccessPassInfo as a, type AccessPassTier as b, type PaymentRequired as c, type PayToProvider as d, type AccessPassClaims as e, type PayToContext as f, type PayToProviderDefaults as g };
@@ -1,6 +1,6 @@
1
1
  import { RequestHandler } from 'express';
2
2
  import { ChannelStorage } from '@x402/evm/batch-settlement/server';
3
- import { b as CloseReceipt } from './types-BbvuPNXl.cjs';
3
+ import { b as CloseReceipt } from './types-DGVtb7cl.cjs';
4
4
 
5
5
  /**
6
6
  * Result of closing one channel from the seller side. Either a settlement
package/docs/mcp.md ADDED
@@ -0,0 +1,98 @@
1
+ # Paid MCP tools
2
+
3
+ `@dexterai/x402/mcp` implements the published [x402 v2 MCP exchange](https://github.com/x402-foundation/x402/blob/main/specs/transports-v2/mcp.md). A seller returns payment requirements as a tool error, the buyer sends an object under `params._meta["x402/payment"]`, and the seller returns the receipt under `result._meta["x402/payment-response"]`.
4
+
5
+ The adapters accept ordinary `tools/call` parameters and return complete tool results. Connect them to your MCP server or client through the transport you already use. Structured content, resources and unrelated metadata are retained.
6
+
7
+ ## Supported combinations
8
+
9
+ | Component | Supported behavior |
10
+ | --- | --- |
11
+ | Wire helpers and buyer dispatch | x402 v2 object metadata binding; caller supplies an approved, signed payment |
12
+ | Default facilitator processor | `exact` on explicitly configured EVM or Solana networks |
13
+ | EVM proof forms | EIP-3009, or Permit2 with `extra.assetTransferMethod: "permit2"`; mixed forms are rejected |
14
+ | Solana proof | Signed transaction with omitted `assetTransferMethod` or `"default"`, using the SPL transfer implementation |
15
+ | Payment flow | Authorization followed by completed tool execution and settlement; omit `paymentFlow` or set it to `"authorization"` |
16
+ | MCP lifecycle | Ordinary completed tool results, including July's `resultType: "complete"` when supplied by your transport |
17
+
18
+ Other payment schemes need an explicit `McpPaymentProcessor` with a stable authorization identity and tested settlement behavior. Tabs, channel payments, upfront payments and escrow require their own lifecycle integration. The wrapper rejects task handles as completed delivery. MCP Tasks support belongs in the application that runs and stores the work.
19
+
20
+ The maintained conformance tests exercise the published `@x402/mcp` 2.26.0 client over an MCP SDK in-memory transport. A second independently written peer tests complete result preservation. Those tests stub payment verification and settlement; deployment still needs a funded test for each advertised network and scheme.
21
+
22
+ ## Seller
23
+
24
+ ```ts
25
+ import { createPaidMcpTool, createMcpFacilitatorProcessor } from '@dexterai/x402/mcp';
26
+
27
+ const paidReport = createPaidMcpTool({
28
+ name: 'report',
29
+ serviceScope: 'reports.example/customer-reports',
30
+ requirements: {
31
+ x402Version: 2,
32
+ resource: { url: 'mcp://reports.example/tools/report' },
33
+ accepts: [{
34
+ scheme: 'exact', network: 'eip155:8453', amount: '10000',
35
+ asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
36
+ payTo: sellerAddress, maxTimeoutSeconds: 60,
37
+ extra: { name: 'USD Coin', version: '2' },
38
+ }],
39
+ },
40
+ payments: createMcpFacilitatorProcessor({ networks: ['eip155:8453'] }),
41
+ store: durablePaymentStore,
42
+ authorize: async (_request, context) => requireCustomerAccount(context),
43
+ execute: async (request, { paymentId }) => {
44
+ const report = await buildReport(request.arguments, paymentId);
45
+ return { content: [{ type: 'text', text: report.summary }], structuredContent: report };
46
+ },
47
+ });
48
+
49
+ // In your server's tools/call handler, pass the complete params and auth context.
50
+ return paidReport(call.params, authenticatedContext);
51
+ ```
52
+
53
+ `durablePaymentStore`, authentication and `buildReport` are application dependencies. [The typed example](../examples/mcp-paid-tool.ts) makes those dependencies explicit. Your service owns its hosting, delivery and customer accounts.
54
+
55
+ `authorize` runs before both execution and cached retrieval. Return a stable customer identity, and reject revoked access there. A deliberately public service can return a fixed access scope; this makes possession of the original payment proof sufficient to retrieve its cached result. Keep private services tied to authenticated accounts.
56
+
57
+ All charge-affecting inputs belong in the tool arguments and advertised requirements. The first verified admission binds the payment to the service, arguments and caller. The x402 signature itself does not automatically sign arbitrary tool arguments.
58
+
59
+ ## Durable storage and recovery
60
+
61
+ Implement `McpPaymentStore` against your database:
62
+
63
+ - `claim` inserts the payment ID once atomically across every worker and paid tool sharing these payments. Use a uniqueness constraint; duplicate callers receive the existing record.
64
+ - `compareAndSwap` updates only the expected revision and acknowledges success after durable commit. Persist output before settlement and the receipt before returning completion.
65
+ - Protect records as private data. They contain payment proofs and outputs. Retain them for the payment's validity and your promised result-access period. Keep unresolved records until reconciliation completes.
66
+
67
+ The package intentionally requires this store; it supplies no default memory store. Database outages stop new work before execution. An interrupted execution remains admitted. A settlement timeout, pending transaction or uncertain database acknowledgement requires reconciliation of that same operation. The wrapper avoids repeating execution or settlement automatically.
68
+
69
+ After admission, errors return a recovery state under `dexter/payment-state`. They do not issue a fresh payment challenge, which could prompt another authorization. Pending receipts retain their transaction and extensions. A definite settlement failure also withholds the service output. Application recovery can inspect the saved result and original proof, reconcile the chain or provider, then commit the recovered result using the store's revision check.
70
+
71
+ Successful duplicate requests return the saved result. The adapter rechecks authorization and binding, so another caller or changed arguments cannot retrieve it. Current price changes do not invalidate a completed purchase. The application can expose authenticated result retrieval using the same stored record without demanding another payment.
72
+
73
+ Tool errors are saved without settlement. If the handler throws after making an external change, the operation remains unresolved for application recovery. Use the supplied payment ID to connect those external effects to the admitted work.
74
+
75
+ ## Buyer
76
+
77
+ ```ts
78
+ import { probeMcpTool, callMcpToolWithPayment } from '@dexterai/x402/mcp';
79
+
80
+ const request = { name: 'report', arguments: { ticker: 'ABC' } };
81
+ const transport = params => connectedMcpClient.callTool(params);
82
+ const probe = await probeMcpTool(transport, request);
83
+ if (!probe.paymentRequired) return probe.result;
84
+
85
+ const payment = await approveAndSign(probe.paymentRequired, request);
86
+ const outcome = await callMcpToolWithPayment({
87
+ transport, request, paymentRequired: probe.paymentRequired, payment,
88
+ beforeDispatch: exactPaidRequest => journal.recordDispatch({
89
+ serverIdentity, exactPaidRequest, requirements: probe.paymentRequired,
90
+ }),
91
+ });
92
+ ```
93
+
94
+ The transport must remain connected to the selected server. The caller owns authorization, spend limits, signing, connection security and recording the server identity. An unpaid probe can execute a free tool; check the tool's semantics before probing.
95
+
96
+ `callMcpToolWithPayment` waits for the durable hook and then makes one paid call. It reports payment and delivery separately. `seller_reported_settled` records the seller's receipt; independent chain verification remains the caller's responsibility. Missing receipts, malformed responses and `settlement_pending` remain unknown. Preserve the original operation for recovery rather than creating another authorization.
97
+
98
+ Lower-level integrations can use `getMcpPaymentRequired`, `attachMcpPayment` and `getMcpPaymentReceipt` while retaining their own dispatch and recovery code. Resource information in a v2 proof is optional; when present, it must match the approved resource. The server always stores its authoritative resource and request binding.
@@ -0,0 +1,39 @@
1
+ import {
2
+ createMcpFacilitatorProcessor, createPaidMcpTool,
3
+ type McpPaymentStore,
4
+ } from '@dexterai/x402/mcp';
5
+
6
+ interface CustomerContext { accountId?: string }
7
+
8
+ /** Supply the application's existing durable store and report execution. */
9
+ export function createReportTool(dependencies: {
10
+ sellerAddress: string;
11
+ store: McpPaymentStore;
12
+ requireAccount(context: CustomerContext): Promise<string>;
13
+ buildReport(arguments_: Record<string, unknown>, paymentId: string): Promise<{
14
+ summary: string;
15
+ sources: string[];
16
+ }>;
17
+ }) {
18
+ return createPaidMcpTool<CustomerContext>({
19
+ name: 'report',
20
+ serviceScope: 'reports.example/customer-reports',
21
+ requirements: {
22
+ x402Version: 2,
23
+ resource: { url: 'mcp://reports.example/tools/report', mimeType: 'application/json' },
24
+ accepts: [{
25
+ scheme: 'exact', network: 'eip155:8453', amount: '10000',
26
+ asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
27
+ payTo: dependencies.sellerAddress, maxTimeoutSeconds: 60,
28
+ extra: { name: 'USD Coin', version: '2' },
29
+ }],
30
+ },
31
+ payments: createMcpFacilitatorProcessor({ networks: ['eip155:8453'] }),
32
+ store: dependencies.store,
33
+ authorize: (_request, context) => dependencies.requireAccount(context),
34
+ execute: async (request, { paymentId }) => {
35
+ const report = await dependencies.buildReport(request.arguments ?? {}, paymentId);
36
+ return { content: [{ type: 'text', text: report.summary }], structuredContent: report };
37
+ },
38
+ });
39
+ }
package/package.json CHANGED
@@ -1,11 +1,16 @@
1
1
  {
2
2
  "name": "@dexterai/x402",
3
- "version": "6.0.0-rc.5",
3
+ "version": "6.0.0",
4
4
  "description": "Full-stack x402 SDK - add paid API monetization to any endpoint. Express middleware, React hooks, Access Pass, dynamic pricing. Solana, Base, Polygon, Arbitrum, Optimism, Avalanche, World Chain, Monad, Robinhood Chain, SKALE.",
5
5
  "author": "Dexter",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "exports": {
9
+ "./mcp": {
10
+ "types": "./dist/mcp/index.d.ts",
11
+ "import": "./dist/mcp/index.js",
12
+ "require": "./dist/mcp/index.cjs"
13
+ },
9
14
  "./client": {
10
15
  "types": "./dist/client/index.d.ts",
11
16
  "import": "./dist/client/index.js",
@@ -62,6 +67,8 @@
62
67
  "README.md",
63
68
  "REFERENCE.md",
64
69
  "CHANGELOG.md",
70
+ "docs/mcp.md",
71
+ "examples/mcp-paid-tool.ts",
65
72
  "LICENSE",
66
73
  "assets/*.svg"
67
74
  ],
@@ -73,10 +80,7 @@
73
80
  "test:watch": "vitest",
74
81
  "test:real": "echo 'Real payment tests require funded wallets. Run: npx tsx test/real-payment-solana.ts'",
75
82
  "prepublishOnly": "npm run build",
76
- "release": "npm version patch && npm publish --access public",
77
- "release:minor": "npm version minor && npm publish --access public",
78
- "release:major": "npm version major && npm publish --access public",
79
- "release:next": "npm publish --access public --tag next"
83
+ "verify:tab:package": "node scripts/verify-packed-tab.mjs"
80
84
  },
81
85
  "dependencies": {
82
86
  "@dexterai/x402-ads-types": "^0.2.0",
@@ -85,18 +89,20 @@
85
89
  "@noble/hashes": "^1.8.0",
86
90
  "@solana/spl-token": "^0.4.9",
87
91
  "@solana/web3.js": "^1.98.0",
88
- "@x402/core": "2.12.0",
89
- "@x402/evm": "2.12.0",
90
- "@x402/extensions": "2.12.0",
92
+ "@x402/core": "2.26.0",
93
+ "@x402/evm": "2.26.0",
94
+ "@x402/extensions": "2.26.0",
91
95
  "bs58": "^6.0.0",
92
96
  "tweetnacl": "^1.0.3"
93
97
  },
94
98
  "devDependencies": {
95
- "@dexterai/vault": "0.43.3-rc.1",
99
+ "@dexterai/vault": "0.43.4",
100
+ "@modelcontextprotocol/sdk": "1.30.0",
96
101
  "@types/aws-lambda": "^8.10.161",
97
102
  "@types/express": "^5.0.6",
98
103
  "@types/node": "^22.10.0",
99
104
  "@types/react": "^18.0.0",
105
+ "@x402/mcp": "2.26.0",
100
106
  "ethers": "^6.13.0",
101
107
  "express": "^5.2.1",
102
108
  "react": "^18.0.0",
@@ -106,7 +112,7 @@
106
112
  "vitest": "^2.1.8"
107
113
  },
108
114
  "peerDependencies": {
109
- "@dexterai/vault": "0.43.3-rc.1",
115
+ "@dexterai/vault": "0.43.4",
110
116
  "@solana/wallet-adapter-base": "^0.9.0",
111
117
  "react": "^18.0.0 || ^19.0.0",
112
118
  "stripe": "^20.0.0",