@mcpaid/sdk 2.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 (111) hide show
  1. package/LICENSE +176 -0
  2. package/NPM_RESTRUCTURE.md +86 -0
  3. package/OPERATOR-LICENSE.md +18 -0
  4. package/README.md +380 -0
  5. package/SELF-HOSTING.md +108 -0
  6. package/dist/circuit-breaker/circuit-breaker.d.ts +26 -0
  7. package/dist/circuit-breaker/circuit-breaker.d.ts.map +1 -0
  8. package/dist/circuit-breaker/circuit-breaker.js +128 -0
  9. package/dist/circuit-breaker/circuit-breaker.js.map +1 -0
  10. package/dist/cli.d.ts +21 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +1560 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/contracts/ToolPayRouter.d.ts +288 -0
  15. package/dist/contracts/ToolPayRouter.d.ts.map +1 -0
  16. package/dist/contracts/ToolPayRouter.js +370 -0
  17. package/dist/contracts/ToolPayRouter.js.map +1 -0
  18. package/dist/contracts/router-registry.d.ts +19 -0
  19. package/dist/contracts/router-registry.d.ts.map +1 -0
  20. package/dist/contracts/router-registry.js +28 -0
  21. package/dist/contracts/router-registry.js.map +1 -0
  22. package/dist/fee/fee-calculator.d.ts +35 -0
  23. package/dist/fee/fee-calculator.d.ts.map +1 -0
  24. package/dist/fee/fee-calculator.js +57 -0
  25. package/dist/fee/fee-calculator.js.map +1 -0
  26. package/dist/fee/fee-ledger.d.ts +66 -0
  27. package/dist/fee/fee-ledger.d.ts.map +1 -0
  28. package/dist/fee/fee-ledger.js +181 -0
  29. package/dist/fee/fee-ledger.js.map +1 -0
  30. package/dist/gateway/config-loader.d.ts +38 -0
  31. package/dist/gateway/config-loader.d.ts.map +1 -0
  32. package/dist/gateway/config-loader.js +125 -0
  33. package/dist/gateway/config-loader.js.map +1 -0
  34. package/dist/gateway/server-registry.d.ts +25 -0
  35. package/dist/gateway/server-registry.d.ts.map +1 -0
  36. package/dist/gateway/server-registry.js +59 -0
  37. package/dist/gateway/server-registry.js.map +1 -0
  38. package/dist/gateway/toolpay-gateway.d.ts +57 -0
  39. package/dist/gateway/toolpay-gateway.d.ts.map +1 -0
  40. package/dist/gateway/toolpay-gateway.js +320 -0
  41. package/dist/gateway/toolpay-gateway.js.map +1 -0
  42. package/dist/index.d.ts +36 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +37 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/sdk/client-agent.d.ts +47 -0
  47. package/dist/sdk/client-agent.d.ts.map +1 -0
  48. package/dist/sdk/client-agent.js +158 -0
  49. package/dist/sdk/client-agent.js.map +1 -0
  50. package/dist/sdk/server-sdk.d.ts +51 -0
  51. package/dist/sdk/server-sdk.d.ts.map +1 -0
  52. package/dist/sdk/server-sdk.js +170 -0
  53. package/dist/sdk/server-sdk.js.map +1 -0
  54. package/dist/settlement/base-contract-client.d.ts +156 -0
  55. package/dist/settlement/base-contract-client.d.ts.map +1 -0
  56. package/dist/settlement/base-contract-client.js +156 -0
  57. package/dist/settlement/base-contract-client.js.map +1 -0
  58. package/dist/settlement/nonce-store.d.ts +54 -0
  59. package/dist/settlement/nonce-store.d.ts.map +1 -0
  60. package/dist/settlement/nonce-store.js +125 -0
  61. package/dist/settlement/nonce-store.js.map +1 -0
  62. package/dist/settlement/onchain-verifier.d.ts +41 -0
  63. package/dist/settlement/onchain-verifier.d.ts.map +1 -0
  64. package/dist/settlement/onchain-verifier.js +114 -0
  65. package/dist/settlement/onchain-verifier.js.map +1 -0
  66. package/dist/settlement/payment-orchestrator.d.ts +59 -0
  67. package/dist/settlement/payment-orchestrator.d.ts.map +1 -0
  68. package/dist/settlement/payment-orchestrator.js +282 -0
  69. package/dist/settlement/payment-orchestrator.js.map +1 -0
  70. package/dist/settlement/permit-verifier.d.ts +60 -0
  71. package/dist/settlement/permit-verifier.d.ts.map +1 -0
  72. package/dist/settlement/permit-verifier.js +80 -0
  73. package/dist/settlement/permit-verifier.js.map +1 -0
  74. package/dist/settlement/session-wallet.d.ts +60 -0
  75. package/dist/settlement/session-wallet.d.ts.map +1 -0
  76. package/dist/settlement/session-wallet.js +105 -0
  77. package/dist/settlement/session-wallet.js.map +1 -0
  78. package/dist/transports/sse-transport.d.ts +27 -0
  79. package/dist/transports/sse-transport.d.ts.map +1 -0
  80. package/dist/transports/sse-transport.js +65 -0
  81. package/dist/transports/sse-transport.js.map +1 -0
  82. package/dist/transports/stdio-bridge.d.ts +29 -0
  83. package/dist/transports/stdio-bridge.d.ts.map +1 -0
  84. package/dist/transports/stdio-bridge.js +133 -0
  85. package/dist/transports/stdio-bridge.js.map +1 -0
  86. package/dist/types/circuit-breaker.d.ts +22 -0
  87. package/dist/types/circuit-breaker.d.ts.map +1 -0
  88. package/dist/types/circuit-breaker.js +5 -0
  89. package/dist/types/circuit-breaker.js.map +1 -0
  90. package/dist/types/ledger.d.ts +57 -0
  91. package/dist/types/ledger.d.ts.map +1 -0
  92. package/dist/types/ledger.js +5 -0
  93. package/dist/types/ledger.js.map +1 -0
  94. package/dist/types/mcp.d.ts +67 -0
  95. package/dist/types/mcp.d.ts.map +1 -0
  96. package/dist/types/mcp.js +5 -0
  97. package/dist/types/mcp.js.map +1 -0
  98. package/dist/types/pricing.d.ts +68 -0
  99. package/dist/types/pricing.d.ts.map +1 -0
  100. package/dist/types/pricing.js +5 -0
  101. package/dist/types/pricing.js.map +1 -0
  102. package/dist/types/x402.d.ts +76 -0
  103. package/dist/types/x402.d.ts.map +1 -0
  104. package/dist/types/x402.js +5 -0
  105. package/dist/types/x402.js.map +1 -0
  106. package/dist/utils/units.d.ts +45 -0
  107. package/dist/utils/units.d.ts.map +1 -0
  108. package/dist/utils/units.js +141 -0
  109. package/dist/utils/units.js.map +1 -0
  110. package/package.json +72 -0
  111. package/src/contracts/ToolPayRouter.json +371 -0
@@ -0,0 +1,320 @@
1
+ /**
2
+ * ToolPay Gateway Engine
3
+ * Reverse proxy interceptor for Model Context Protocol (MCP) JSON-RPC requests.
4
+ */
5
+ import { usdToMicro, microToUsd } from '../utils/units.js';
6
+ import { canonicalJsonStringify } from '../utils/units.js';
7
+ export class ToolPayGateway {
8
+ registry;
9
+ orchestrator;
10
+ circuitBreaker;
11
+ upstreamHandler;
12
+ // Freemium usage tracking: `${serverId}:${toolName}:${agentWallet}:${periodBucket}` -> callCount
13
+ freemiumUsage = new Map();
14
+ // Scoped Idempotency cache: scopedKey -> cached GatewayResponse
15
+ idempotencyCache = new Map();
16
+ constructor(params) {
17
+ this.registry = params.registry;
18
+ this.orchestrator = params.orchestrator;
19
+ this.circuitBreaker = params.circuitBreaker;
20
+ this.upstreamHandler = params.upstreamHandler;
21
+ if (params.idempotencyCache) {
22
+ this.idempotencyCache = params.idempotencyCache;
23
+ }
24
+ if (params.freemiumUsage) {
25
+ this.freemiumUsage = params.freemiumUsage;
26
+ }
27
+ }
28
+ /**
29
+ * Main entry point to handle an incoming MCP JSON-RPC request.
30
+ */
31
+ async handleRequest(request, context) {
32
+ const serverConfig = this.registry.getServer(context.serverId);
33
+ if (!serverConfig) {
34
+ return {
35
+ statusCode: 404,
36
+ headers: { 'Content-Type': 'application/json' },
37
+ body: {
38
+ jsonrpc: '2.0',
39
+ id: request.id ?? null,
40
+ error: {
41
+ code: -32000,
42
+ message: `Server "${context.serverId}" not found in ToolPay registry`,
43
+ },
44
+ },
45
+ };
46
+ }
47
+ // Scoped idempotency key prevents cross-server / cross-tenant cache poisoning (Finding 7)
48
+ const scopedIdempotencyKey = context.idempotencyKey
49
+ ? `${context.serverId}:${context.agentWallet || 'anon'}:${request.method}:${canonicalJsonStringify(request.params || {})}:${context.idempotencyKey}`
50
+ : undefined;
51
+ if (scopedIdempotencyKey && this.idempotencyCache.has(scopedIdempotencyKey)) {
52
+ return this.idempotencyCache.get(scopedIdempotencyKey);
53
+ }
54
+ // 1. Intercept tools/list
55
+ if (request.method === 'tools/list') {
56
+ return this.handleToolsList(request, serverConfig);
57
+ }
58
+ // 2. Intercept tools/call
59
+ if (request.method === 'tools/call') {
60
+ const response = await this.handleToolsCall(request, serverConfig, context);
61
+ if (scopedIdempotencyKey && response.statusCode === 200) {
62
+ if (this.idempotencyCache.size >= 5_000) {
63
+ const iter = this.idempotencyCache.keys();
64
+ for (let i = 0; i < 50; i++) {
65
+ const next = iter.next();
66
+ if (next.done)
67
+ break;
68
+ this.idempotencyCache.delete(next.value);
69
+ }
70
+ }
71
+ this.idempotencyCache.set(scopedIdempotencyKey, response);
72
+ }
73
+ return response;
74
+ }
75
+ // 3. Transparently pass through all other MCP methods (initialize, ping, resources/*, prompts/*)
76
+ const upstreamRes = await this.upstreamHandler(request);
77
+ return {
78
+ statusCode: 200,
79
+ headers: { 'Content-Type': 'application/json' },
80
+ body: upstreamRes,
81
+ };
82
+ }
83
+ /**
84
+ * Handles `tools/list`, enriching tools with payment metadata annotations.
85
+ */
86
+ async handleToolsList(request, serverConfig) {
87
+ const upstreamRes = await this.upstreamHandler(request);
88
+ if (upstreamRes.result && Array.isArray(upstreamRes.result.tools)) {
89
+ const listResult = upstreamRes.result;
90
+ const enrichedTools = listResult.tools.map((tool) => {
91
+ const rule = this.registry.getToolRule(serverConfig.serverId, tool.name);
92
+ const isPaid = rule?.type === 'fixed' || rule?.type === 'dynamic';
93
+ return {
94
+ ...tool,
95
+ annotations: {
96
+ ...tool.annotations,
97
+ payment: {
98
+ required: isPaid,
99
+ costUsd: rule?.type === 'fixed' ? rule.priceUsd : undefined,
100
+ currency: serverConfig.currency,
101
+ networks: [serverConfig.network],
102
+ description: rule?.description || (isPaid ? `Pay-per-use tool ($${rule?.priceUsd || 'variable'})` : 'Free tool'),
103
+ },
104
+ },
105
+ };
106
+ });
107
+ return {
108
+ statusCode: 200,
109
+ headers: { 'Content-Type': 'application/json' },
110
+ body: {
111
+ jsonrpc: '2.0',
112
+ id: request.id ?? null,
113
+ result: {
114
+ ...listResult,
115
+ tools: enrichedTools,
116
+ },
117
+ },
118
+ };
119
+ }
120
+ return {
121
+ statusCode: 200,
122
+ headers: { 'Content-Type': 'application/json' },
123
+ body: upstreamRes,
124
+ };
125
+ }
126
+ /**
127
+ * Handles `tools/call`, checking pricing, circuit breakers, and payment verification.
128
+ */
129
+ async handleToolsCall(request, serverConfig, context) {
130
+ const toolName = request.params?.name;
131
+ if (!toolName) {
132
+ return {
133
+ statusCode: 400,
134
+ headers: { 'Content-Type': 'application/json' },
135
+ body: {
136
+ jsonrpc: '2.0',
137
+ id: request.id ?? null,
138
+ error: { code: -32602, message: 'Missing tool name in tools/call parameters' },
139
+ },
140
+ };
141
+ }
142
+ const toolRule = this.registry.getToolRule(serverConfig.serverId, toolName);
143
+ // If tool is explicitly free or unconfigured without default pricing
144
+ if (!toolRule || toolRule.type === 'free') {
145
+ const res = await this.upstreamHandler(request);
146
+ return {
147
+ statusCode: 200,
148
+ headers: { 'Content-Type': 'application/json' },
149
+ body: res,
150
+ };
151
+ }
152
+ const agentWallet = context.agentWallet || context.paymentProof?.signerWallet || '0x0000000000000000000000000000000000000000';
153
+ const nowSec = context.nowSec || Math.floor(Date.now() / 1000);
154
+ // Check freemium allowance if configured
155
+ if (toolRule.freemium && agentWallet !== '0x0000000000000000000000000000000000000000') {
156
+ const periodSec = toolRule.freemium.periodSeconds || 86400;
157
+ const periodBucket = Math.floor(nowSec / periodSec);
158
+ const usageKey = `${serverConfig.serverId}:${toolName}:${agentWallet.toLowerCase()}:${periodBucket}`;
159
+ const currentUsage = this.freemiumUsage.get(usageKey) || 0;
160
+ if (currentUsage < toolRule.freemium.freeCallsPerPeriod) {
161
+ this.freemiumUsage.set(usageKey, currentUsage + 1);
162
+ const res = await this.upstreamHandler(request);
163
+ return {
164
+ statusCode: 200,
165
+ headers: {
166
+ 'Content-Type': 'application/json',
167
+ 'X-Freemium-Remaining': (toolRule.freemium.freeCallsPerPeriod - currentUsage - 1).toString(),
168
+ },
169
+ body: res,
170
+ };
171
+ }
172
+ }
173
+ // Resolve cost
174
+ let grossMicro;
175
+ if (toolRule.type === 'fixed') {
176
+ if (!toolRule.priceUsd) {
177
+ throw new Error(`Tool "${toolName}" configured as fixed price but missing priceUsd`);
178
+ }
179
+ grossMicro = usdToMicro(toolRule.priceUsd);
180
+ }
181
+ else if (toolRule.type === 'dynamic') {
182
+ if (!toolRule.dynamicPricing) {
183
+ throw new Error(`Tool "${toolName}" configured as dynamic price but missing dynamicPricing function`);
184
+ }
185
+ const dynamicPriceUsd = toolRule.dynamicPricing(request.params?.arguments || {});
186
+ grossMicro = usdToMicro(dynamicPriceUsd);
187
+ }
188
+ else {
189
+ grossMicro = 0n;
190
+ }
191
+ // If cost resolved to 0, execute free
192
+ if (grossMicro === 0n) {
193
+ const res = await this.upstreamHandler(request);
194
+ return {
195
+ statusCode: 200,
196
+ headers: { 'Content-Type': 'application/json' },
197
+ body: res,
198
+ };
199
+ }
200
+ // Circuit Breaker Evaluation
201
+ const cbConfig = toolRule.circuitBreaker || serverConfig.globalCircuitBreaker;
202
+ const cbCheck = this.circuitBreaker.check({
203
+ serverId: serverConfig.serverId,
204
+ toolName,
205
+ agentWallet,
206
+ costMicro: grossMicro,
207
+ callArguments: request.params?.arguments,
208
+ timestamp: nowSec * 1000,
209
+ }, cbConfig);
210
+ if (!cbCheck.allowed) {
211
+ const status = cbCheck.statusCode || 429;
212
+ return {
213
+ statusCode: status,
214
+ headers: {
215
+ 'Content-Type': 'application/json',
216
+ ...(cbCheck.retryAfterSeconds ? { 'Retry-After': cbCheck.retryAfterSeconds.toString() } : {}),
217
+ },
218
+ body: {
219
+ jsonrpc: '2.0',
220
+ id: request.id ?? null,
221
+ error: {
222
+ code: status,
223
+ message: `ToolPay Circuit Breaker: ${cbCheck.reason}`,
224
+ data: cbCheck,
225
+ },
226
+ },
227
+ };
228
+ }
229
+ // Check for payment proof
230
+ if (!context.paymentProof) {
231
+ // Return HTTP 402 Challenge
232
+ const challenge = this.orchestrator.generateChallenge(serverConfig, toolRule, grossMicro);
233
+ return {
234
+ statusCode: 402,
235
+ headers: challenge.headers,
236
+ body: challenge.errorResponse.body,
237
+ };
238
+ }
239
+ // Settle payment proof with bound tool/price context (Critical 1)
240
+ const settlementResult = await this.orchestrator.verifyAndSettle(context.paymentProof, nowSec, {
241
+ serverId: serverConfig.serverId,
242
+ toolName,
243
+ minAmountMicro: grossMicro,
244
+ });
245
+ if (!settlementResult.success) {
246
+ // Include fresh challenge details so client can recover without dead-ending (High 8)
247
+ const challenge = this.orchestrator.generateChallenge(serverConfig, toolRule, grossMicro);
248
+ return {
249
+ statusCode: 402,
250
+ headers: challenge.headers,
251
+ body: {
252
+ jsonrpc: '2.0',
253
+ id: request.id ?? null,
254
+ error: {
255
+ code: 402,
256
+ message: `Payment Verification Failed: ${settlementResult.error}`,
257
+ data: challenge.errorResponse.body.error.data,
258
+ },
259
+ },
260
+ };
261
+ }
262
+ // Commit spend to circuit breaker
263
+ this.circuitBreaker.commit({
264
+ serverId: serverConfig.serverId,
265
+ toolName,
266
+ agentWallet,
267
+ costMicro: grossMicro,
268
+ callArguments: request.params?.arguments,
269
+ timestamp: nowSec * 1000,
270
+ });
271
+ // Execute upstream tool call with refund safety (High 10)
272
+ let upstreamRes;
273
+ try {
274
+ upstreamRes = await this.upstreamHandler(request);
275
+ if (upstreamRes && upstreamRes.error && upstreamRes.error.code <= -32600) {
276
+ this.orchestrator.getLedger().refundTransaction(settlementResult.record.transactionId);
277
+ if (context.paymentProof.scheme === 'session-wallet' && context.paymentProof.sessionId) {
278
+ this.orchestrator.sessionWalletManager.refundPayment({
279
+ sessionId: context.paymentProof.sessionId,
280
+ amountMicro: grossMicro,
281
+ });
282
+ }
283
+ }
284
+ }
285
+ catch (err) {
286
+ this.orchestrator.getLedger().refundTransaction(settlementResult.record.transactionId);
287
+ if (context.paymentProof.scheme === 'session-wallet' && context.paymentProof.sessionId) {
288
+ this.orchestrator.sessionWalletManager.refundPayment({
289
+ sessionId: context.paymentProof.sessionId,
290
+ amountMicro: grossMicro,
291
+ });
292
+ }
293
+ return {
294
+ statusCode: 502,
295
+ headers: { 'Content-Type': 'application/json' },
296
+ body: {
297
+ jsonrpc: '2.0',
298
+ id: request.id ?? null,
299
+ error: {
300
+ code: -32000,
301
+ message: `Upstream tool execution failed: ${err.message}. Micropayment refunded.`,
302
+ },
303
+ },
304
+ };
305
+ }
306
+ // Return result with ToolPay settlement metadata in headers
307
+ return {
308
+ statusCode: 200,
309
+ headers: {
310
+ 'Content-Type': 'application/json',
311
+ 'X-ToolPay-Transaction-Id': settlementResult.record.transactionId,
312
+ 'X-ToolPay-Gross-Amount': microToUsd(settlementResult.record.grossAmountMicro),
313
+ 'X-ToolPay-Platform-Fee': microToUsd(settlementResult.record.platformFeeMicro),
314
+ 'X-ToolPay-Developer-Payout': microToUsd(settlementResult.record.developerPayoutMicro),
315
+ },
316
+ body: upstreamRes,
317
+ };
318
+ }
319
+ }
320
+ //# sourceMappingURL=toolpay-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolpay-gateway.js","sourceRoot":"","sources":["../../src/gateway/toolpay-gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ToolPay: MCP Monetization & Micropayment Infrastructure
3
+ * Public Exports (client-only — see NPM_RESTRUCTURE.md)
4
+ *
5
+ * Operator modules (edge persistence, page renderers, relayer, mail) are
6
+ * intentionally NOT exported here: d1-store, dashboard/landing/docs HTML,
7
+ * withdrawal-relayer, email-service, worker. They remain in-repo for the
8
+ * hosted gateway but are excluded from the published tarball.
9
+ */
10
+ export * from './types/mcp.js';
11
+ export * from './types/pricing.js';
12
+ export * from './types/x402.js';
13
+ export * from './types/ledger.js';
14
+ export * from './types/circuit-breaker.js';
15
+ export * from './utils/units.js';
16
+ export * from './fee/fee-calculator.js';
17
+ export * from './fee/fee-ledger.js';
18
+ export * from './circuit-breaker/circuit-breaker.js';
19
+ export * from './settlement/nonce-store.js';
20
+ export * from './settlement/permit-verifier.js';
21
+ export * from './settlement/onchain-verifier.js';
22
+ export * from './settlement/base-contract-client.js';
23
+ export * from './settlement/session-wallet.js';
24
+ export * from './settlement/payment-orchestrator.js';
25
+ export * from './contracts/router-registry.js';
26
+ export * from './gateway/server-registry.js';
27
+ export * from './gateway/toolpay-gateway.js';
28
+ export * from './gateway/config-loader.js';
29
+ export * from './transports/sse-transport.js';
30
+ export * from './transports/stdio-bridge.js';
31
+ export * from './sdk/server-sdk.js';
32
+ export * from './sdk/client-agent.js';
33
+ export { ToolPayServer as MCPaidServer, ToolPayServer as McpaidServer, ToolPayServerOptions as MCPaidServerOptions, ToolPayServerOptions as McpaidServerOptions, } from './sdk/server-sdk.js';
34
+ export { ToolPayClientAgent as MCPaidClientAgent, ToolPayClientAgent as McpaidClientAgent, ToolPayClientAgentOptions as MCPaidClientAgentOptions, ToolPayClientAgentOptions as McpaidClientAgentOptions, } from './sdk/client-agent.js';
35
+ export { ToolPayGateway as MCPaidGateway, ToolPayGateway as McpaidGateway, ToolPayGatewayOptions as MCPaidGatewayOptions, ToolPayGatewayOptions as McpaidGatewayOptions, } from './gateway/toolpay-gateway.js';
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,kBAAkB,CAAC;AAEjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sCAAsC,CAAC;AAErD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAE/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EACL,aAAa,IAAI,YAAY,EAC7B,aAAa,IAAI,YAAY,EAC7B,oBAAoB,IAAI,mBAAmB,EAC3C,oBAAoB,IAAI,mBAAmB,GAC5C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,IAAI,iBAAiB,EACvC,kBAAkB,IAAI,iBAAiB,EACvC,yBAAyB,IAAI,wBAAwB,EACrD,yBAAyB,IAAI,wBAAwB,GACtD,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,cAAc,IAAI,aAAa,EAC/B,cAAc,IAAI,aAAa,EAC/B,qBAAqB,IAAI,oBAAoB,EAC7C,qBAAqB,IAAI,oBAAoB,GAC9C,MAAM,8BAA8B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * ToolPay: MCP Monetization & Micropayment Infrastructure
3
+ * Public Exports (client-only — see NPM_RESTRUCTURE.md)
4
+ *
5
+ * Operator modules (edge persistence, page renderers, relayer, mail) are
6
+ * intentionally NOT exported here: d1-store, dashboard/landing/docs HTML,
7
+ * withdrawal-relayer, email-service, worker. They remain in-repo for the
8
+ * hosted gateway but are excluded from the published tarball.
9
+ */
10
+ export * from './types/mcp.js';
11
+ export * from './types/pricing.js';
12
+ export * from './types/x402.js';
13
+ export * from './types/ledger.js';
14
+ export * from './types/circuit-breaker.js';
15
+ export * from './utils/units.js';
16
+ export * from './fee/fee-calculator.js';
17
+ export * from './fee/fee-ledger.js';
18
+ export * from './circuit-breaker/circuit-breaker.js';
19
+ export * from './settlement/nonce-store.js';
20
+ export * from './settlement/permit-verifier.js';
21
+ export * from './settlement/onchain-verifier.js';
22
+ export * from './settlement/base-contract-client.js';
23
+ export * from './settlement/session-wallet.js';
24
+ export * from './settlement/payment-orchestrator.js';
25
+ export * from './contracts/router-registry.js';
26
+ export * from './gateway/server-registry.js';
27
+ export * from './gateway/toolpay-gateway.js';
28
+ export * from './gateway/config-loader.js';
29
+ export * from './transports/sse-transport.js';
30
+ export * from './transports/stdio-bridge.js';
31
+ export * from './sdk/server-sdk.js';
32
+ export * from './sdk/client-agent.js';
33
+ // MCPaid Brand Aliases
34
+ export { ToolPayServer as MCPaidServer, ToolPayServer as McpaidServer, } from './sdk/server-sdk.js';
35
+ export { ToolPayClientAgent as MCPaidClientAgent, ToolPayClientAgent as McpaidClientAgent, } from './sdk/client-agent.js';
36
+ export { ToolPayGateway as MCPaidGateway, ToolPayGateway as McpaidGateway, } from './gateway/toolpay-gateway.js';
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,kBAAkB,CAAC;AAEjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sCAAsC,CAAC;AAErD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAE/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AAEtC,uBAAuB;AACvB,OAAO,EACL,aAAa,IAAI,YAAY,EAC7B,aAAa,IAAI,YAAY,GAG9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,IAAI,iBAAiB,EACvC,kBAAkB,IAAI,iBAAiB,GAGxC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,cAAc,IAAI,aAAa,EAC/B,cAAc,IAAI,aAAa,GAGhC,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * ToolPay Client Agent Adapter
3
+ * Equips autonomous AI agents with automatic x402 challenge negotiation, spend policies, and payment signing.
4
+ */
5
+ import { type Hex, type Address } from 'viem';
6
+ import { JsonRpcRequest } from '../types/mcp.js';
7
+ import { PaymentProof } from '../types/x402.js';
8
+ import { GatewayResponse } from '../gateway/toolpay-gateway.js';
9
+ export interface AgentSpendPolicy {
10
+ /** Maximum price willing to pay for a single tool call in USD (e.g. "0.05") */
11
+ maxPricePerCallUsd?: string;
12
+ /** Maximum total spend across the agent's lifetime or run */
13
+ maxTotalBudgetUsd?: string;
14
+ /** Auto-approve payments below max price without human intervention */
15
+ autoApprove?: boolean;
16
+ }
17
+ /**
18
+ * Builds the exact ABI-encoded transaction calldata to pay the ToolPayRouter smart contract on Base.
19
+ */
20
+ export declare function buildRouterPaymentCalldata(params: {
21
+ developerWallet: Address;
22
+ tokenAddress: Address;
23
+ grossAmountMicro: bigint;
24
+ challengeNonce: string;
25
+ serverId: string;
26
+ toolName: string;
27
+ }): `0x${string}`;
28
+ export interface ToolPayClientAgentOptions {
29
+ privateKey?: Hex;
30
+ walletAddress?: string;
31
+ spendPolicy?: AgentSpendPolicy;
32
+ sessionId?: string;
33
+ }
34
+ export declare class ToolPayClientAgent {
35
+ readonly walletAddress: string;
36
+ private privateKey?;
37
+ private spendPolicy;
38
+ private totalSpentMicro;
39
+ private sessionId?;
40
+ constructor(params: ToolPayClientAgentOptions);
41
+ /**
42
+ * Invokes an MCP tool through a ToolPay gateway, automatically handling 402 challenges.
43
+ */
44
+ executeToolCall(request: JsonRpcRequest, callerFn: (req: JsonRpcRequest, paymentProof?: PaymentProof) => Promise<GatewayResponse>): Promise<GatewayResponse>;
45
+ getTotalSpentMicro(): bigint;
46
+ }
47
+ //# sourceMappingURL=client-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-agent.d.ts","sourceRoot":"","sources":["../../src/sdk/client-agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,OAAO,EAAsB,MAAM,MAAM,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAqB,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,KAAK,MAAM,EAAE,CAchB;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B,SAAgB,aAAa,EAAE,MAAM,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,CAAM;IACzB,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,MAAM,EAAE,yBAAyB;IAmB7C;;OAEG;IACU,eAAe,CAC1B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,eAAe,CAAC,GACvF,OAAO,CAAC,eAAe,CAAC;IAwHpB,kBAAkB,IAAI,MAAM;CAGpC"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * ToolPay Client Agent Adapter
3
+ * Equips autonomous AI agents with automatic x402 challenge negotiation, spend policies, and payment signing.
4
+ */
5
+ import { privateKeyToAccount } from 'viem/accounts';
6
+ import { encodeFunctionData } from 'viem';
7
+ import { TOOLPAY_PERMIT_DOMAIN, TOOLPAY_PERMIT_TYPES } from '../settlement/permit-verifier.js';
8
+ import { usdToMicro, normalizeNonceToBytes32 } from '../utils/units.js';
9
+ import { TOOLPAY_ROUTER_ABI } from '../contracts/ToolPayRouter.js';
10
+ /**
11
+ * Builds the exact ABI-encoded transaction calldata to pay the ToolPayRouter smart contract on Base.
12
+ */
13
+ export function buildRouterPaymentCalldata(params) {
14
+ const nonceBytes32 = normalizeNonceToBytes32(params.challengeNonce);
15
+ return encodeFunctionData({
16
+ abi: TOOLPAY_ROUTER_ABI,
17
+ functionName: 'payForTool',
18
+ args: [
19
+ params.tokenAddress,
20
+ params.developerWallet,
21
+ params.grossAmountMicro,
22
+ nonceBytes32,
23
+ params.serverId,
24
+ params.toolName,
25
+ ],
26
+ });
27
+ }
28
+ export class ToolPayClientAgent {
29
+ walletAddress;
30
+ privateKey;
31
+ spendPolicy;
32
+ totalSpentMicro = 0n;
33
+ sessionId;
34
+ constructor(params) {
35
+ this.privateKey = params.privateKey;
36
+ this.spendPolicy = {
37
+ autoApprove: true,
38
+ maxPricePerCallUsd: '0.10',
39
+ ...params.spendPolicy,
40
+ };
41
+ this.sessionId = params.sessionId;
42
+ if (this.privateKey) {
43
+ const account = privateKeyToAccount(this.privateKey);
44
+ this.walletAddress = account.address;
45
+ }
46
+ else if (params.walletAddress) {
47
+ this.walletAddress = params.walletAddress.toLowerCase();
48
+ }
49
+ else {
50
+ this.walletAddress = '0x0000000000000000000000000000000000000000';
51
+ }
52
+ }
53
+ /**
54
+ * Invokes an MCP tool through a ToolPay gateway, automatically handling 402 challenges.
55
+ */
56
+ async executeToolCall(request, callerFn) {
57
+ // 1. Initial attempt without payment proof to determine tool pricing terms
58
+ const firstAttempt = await callerFn(request, undefined);
59
+ // If call succeeded or errored with non-402, return immediately
60
+ if (firstAttempt.statusCode !== 402) {
61
+ return firstAttempt;
62
+ }
63
+ // 2. Parse 402 Challenge Data
64
+ const challengePayload = firstAttempt.body?.error?.data;
65
+ if (!challengePayload || !challengePayload.challengeNonce) {
66
+ return firstAttempt; // Malformed 402
67
+ }
68
+ const priceUsd = challengePayload.priceUsd;
69
+ const priceMicro = BigInt(challengePayload.amountMicro);
70
+ // Warn (not fail) when the gateway settles through a non-official
71
+ // router. Official hosted traffic uses OFFICIAL_ROUTER_ADDRESS_BASE;
72
+ // self-hosted forks use their own contract and are outside the hosted
73
+ // network / fee enforcement (see OPERATOR-LICENSE.md).
74
+ try {
75
+ const { isOfficialRouter } = await import('../contracts/router-registry.js');
76
+ const routerAddr = challengePayload.verifyingContract || challengePayload.recipientWallet;
77
+ if (routerAddr && !isOfficialRouter(routerAddr, challengePayload.chainId)) {
78
+ console.warn(`[MCPaid] Gateway router ${routerAddr} is not the official hosted router — ` +
79
+ `you are paying a self-hosted gateway outside mcpaid.dev fee/settlement guarantees.`);
80
+ }
81
+ }
82
+ catch { }
83
+ // 3. Spend Policy Checks
84
+ if (this.spendPolicy.autoApprove === false) {
85
+ throw new Error(`Agent Spend Policy Rejected: autoApprove is disabled for paid tool "${challengePayload.toolName}" ($${priceUsd})`);
86
+ }
87
+ if (this.spendPolicy.maxPricePerCallUsd) {
88
+ const maxPriceMicro = usdToMicro(this.spendPolicy.maxPricePerCallUsd);
89
+ if (priceMicro > maxPriceMicro) {
90
+ throw new Error(`Agent Spend Policy Rejected: tool price $${priceUsd} exceeds maximum per-call budget $${this.spendPolicy.maxPricePerCallUsd}`);
91
+ }
92
+ }
93
+ if (this.spendPolicy.maxTotalBudgetUsd) {
94
+ const maxTotalMicro = usdToMicro(this.spendPolicy.maxTotalBudgetUsd);
95
+ if (this.totalSpentMicro + priceMicro > maxTotalMicro) {
96
+ throw new Error(`Agent Spend Policy Rejected: cumulative spend with this call would exceed total budget $${this.spendPolicy.maxTotalBudgetUsd}`);
97
+ }
98
+ }
99
+ // 4. Generate and Sign Payment Proof
100
+ let paymentProof;
101
+ if (this.sessionId) {
102
+ // Use Session Wallet
103
+ paymentProof = {
104
+ scheme: 'session-wallet',
105
+ challengeNonce: challengePayload.challengeNonce,
106
+ signerWallet: this.walletAddress,
107
+ sessionId: this.sessionId,
108
+ };
109
+ }
110
+ else if (this.privateKey) {
111
+ // Sign EIP-712 Micro-Voucher
112
+ const account = privateKeyToAccount(this.privateKey);
113
+ const deadline = challengePayload.expiresAt;
114
+ const message = {
115
+ serverId: challengePayload.serverId,
116
+ toolName: challengePayload.toolName,
117
+ challengeNonce: challengePayload.challengeNonce,
118
+ amountMicro: priceMicro,
119
+ recipient: challengePayload.recipientWallet,
120
+ deadline: BigInt(deadline),
121
+ };
122
+ const domain = {
123
+ ...TOOLPAY_PERMIT_DOMAIN,
124
+ chainId: challengePayload.chainId || 8453,
125
+ verifyingContract: challengePayload.verifyingContract || TOOLPAY_PERMIT_DOMAIN.verifyingContract,
126
+ };
127
+ const signature = await account.signTypedData({
128
+ domain,
129
+ types: TOOLPAY_PERMIT_TYPES,
130
+ primaryType: 'ToolPayment',
131
+ message,
132
+ });
133
+ paymentProof = {
134
+ scheme: 'eip712-permit',
135
+ challengeNonce: challengePayload.challengeNonce,
136
+ signerWallet: this.walletAddress,
137
+ signature,
138
+ deadline,
139
+ maxAmountMicro: priceMicro,
140
+ };
141
+ }
142
+ else {
143
+ throw new Error(`Payment Required: Tool "${challengePayload.toolName}" costs ${challengePayload.priceUsd} ${challengePayload.currency}. ` +
144
+ `No signing key or session wallet is configured for this agent. ` +
145
+ `To authorize payments, set AGENT_PRIVATE_KEY=0x... in your project .env file or pass --key <private-key> to the mcpaid bridge.`);
146
+ }
147
+ // 5. Replay request with Payment Proof
148
+ const secondAttempt = await callerFn(request, paymentProof);
149
+ if (secondAttempt.statusCode === 200) {
150
+ this.totalSpentMicro += priceMicro;
151
+ }
152
+ return secondAttempt;
153
+ }
154
+ getTotalSpentMicro() {
155
+ return this.totalSpentMicro;
156
+ }
157
+ }
158
+ //# sourceMappingURL=client-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-agent.js","sourceRoot":"","sources":["../../src/sdk/client-agent.ts"],"names":[],"mappings":"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"}