@scriptmasterlabs/mcp-x402 2.0.2 → 2.1.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.
- package/.well-known/x402.json +37 -0
- package/LICENSE +57 -21
- package/README.md +262 -304
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-wrapper.d.ts +71 -0
- package/dist/mcp-wrapper.d.ts.map +1 -0
- package/dist/mcp-wrapper.js +104 -0
- package/dist/mcp-wrapper.js.map +1 -0
- package/dist/x402-middleware.d.ts +76 -0
- package/dist/x402-middleware.d.ts.map +1 -0
- package/dist/x402-middleware.js +113 -0
- package/dist/x402-middleware.js.map +1 -0
- package/dist/xrpl-facilitator.d.ts +77 -0
- package/dist/xrpl-facilitator.d.ts.map +1 -0
- package/dist/xrpl-facilitator.js +156 -0
- package/dist/xrpl-facilitator.js.map +1 -0
- package/llms.txt +108 -70
- package/package.json +65 -78
- package/schema.jsonld +97 -0
- package/.env.example +0 -35
- package/.github/workflows/ci.yml +0 -59
- package/.github/workflows/keepalive.yml +0 -31
- package/.well-known/agentcard.json +0 -34
- package/CONTRIBUTING.md +0 -76
- package/Dockerfile +0 -19
- package/agents.json +0 -67
- package/dist/lib/chains/base.d.ts +0 -10
- package/dist/lib/chains/base.d.ts.map +0 -1
- package/dist/lib/chains/base.js +0 -73
- package/dist/lib/chains/base.js.map +0 -1
- package/dist/lib/chains/solana.d.ts +0 -10
- package/dist/lib/chains/solana.d.ts.map +0 -1
- package/dist/lib/chains/solana.js +0 -49
- package/dist/lib/chains/solana.js.map +0 -1
- package/dist/lib/chains/xrpl.d.ts +0 -10
- package/dist/lib/chains/xrpl.d.ts.map +0 -1
- package/dist/lib/chains/xrpl.js +0 -55
- package/dist/lib/chains/xrpl.js.map +0 -1
- package/dist/lib/credit/bureau.d.ts +0 -10
- package/dist/lib/credit/bureau.d.ts.map +0 -1
- package/dist/lib/credit/bureau.js +0 -58
- package/dist/lib/credit/bureau.js.map +0 -1
- package/dist/lib/sml-api/agentcard.d.ts +0 -17
- package/dist/lib/sml-api/agentcard.d.ts.map +0 -1
- package/dist/lib/sml-api/agentcard.js +0 -30
- package/dist/lib/sml-api/agentcard.js.map +0 -1
- package/dist/lib/sml-api/backtest.d.ts +0 -22
- package/dist/lib/sml-api/backtest.d.ts.map +0 -1
- package/dist/lib/sml-api/backtest.js +0 -28
- package/dist/lib/sml-api/backtest.js.map +0 -1
- package/dist/lib/sml-api/brokers.d.ts +0 -40
- package/dist/lib/sml-api/brokers.d.ts.map +0 -1
- package/dist/lib/sml-api/brokers.js +0 -128
- package/dist/lib/sml-api/brokers.js.map +0 -1
- package/dist/lib/sml-api/copytrader.d.ts +0 -11
- package/dist/lib/sml-api/copytrader.d.ts.map +0 -1
- package/dist/lib/sml-api/copytrader.js +0 -30
- package/dist/lib/sml-api/copytrader.js.map +0 -1
- package/dist/lib/sml-api/crawl.d.ts +0 -20
- package/dist/lib/sml-api/crawl.d.ts.map +0 -1
- package/dist/lib/sml-api/crawl.js +0 -32
- package/dist/lib/sml-api/crawl.js.map +0 -1
- package/dist/lib/sml-api/echo.d.ts +0 -10
- package/dist/lib/sml-api/echo.d.ts.map +0 -1
- package/dist/lib/sml-api/echo.js +0 -23
- package/dist/lib/sml-api/echo.js.map +0 -1
- package/dist/lib/sml-api/forge.d.ts +0 -11
- package/dist/lib/sml-api/forge.d.ts.map +0 -1
- package/dist/lib/sml-api/forge.js +0 -29
- package/dist/lib/sml-api/forge.js.map +0 -1
- package/dist/lib/sml-api/ftd.d.ts +0 -18
- package/dist/lib/sml-api/ftd.d.ts.map +0 -1
- package/dist/lib/sml-api/ftd.js +0 -43
- package/dist/lib/sml-api/ftd.js.map +0 -1
- package/dist/lib/sml-api/ghost.d.ts +0 -13
- package/dist/lib/sml-api/ghost.d.ts.map +0 -1
- package/dist/lib/sml-api/ghost.js +0 -29
- package/dist/lib/sml-api/ghost.js.map +0 -1
- package/dist/lib/sml-api/launchpad.d.ts +0 -20
- package/dist/lib/sml-api/launchpad.d.ts.map +0 -1
- package/dist/lib/sml-api/launchpad.js +0 -31
- package/dist/lib/sml-api/launchpad.js.map +0 -1
- package/dist/lib/sml-api/leviathan.d.ts +0 -22
- package/dist/lib/sml-api/leviathan.d.ts.map +0 -1
- package/dist/lib/sml-api/leviathan.js +0 -33
- package/dist/lib/sml-api/leviathan.js.map +0 -1
- package/dist/lib/sml-api/nexus.d.ts +0 -18
- package/dist/lib/sml-api/nexus.d.ts.map +0 -1
- package/dist/lib/sml-api/nexus.js +0 -40
- package/dist/lib/sml-api/nexus.js.map +0 -1
- package/dist/lib/sml-api/proof402.d.ts +0 -6
- package/dist/lib/sml-api/proof402.d.ts.map +0 -1
- package/dist/lib/sml-api/proof402.js +0 -30
- package/dist/lib/sml-api/proof402.js.map +0 -1
- package/dist/lib/sml-api/rails.d.ts +0 -12
- package/dist/lib/sml-api/rails.d.ts.map +0 -1
- package/dist/lib/sml-api/rails.js +0 -29
- package/dist/lib/sml-api/rails.js.map +0 -1
- package/dist/lib/sml-api/shadow.d.ts +0 -15
- package/dist/lib/sml-api/shadow.d.ts.map +0 -1
- package/dist/lib/sml-api/shadow.js +0 -27
- package/dist/lib/sml-api/shadow.js.map +0 -1
- package/dist/lib/sml-api/squeezeos.d.ts +0 -21
- package/dist/lib/sml-api/squeezeos.d.ts.map +0 -1
- package/dist/lib/sml-api/squeezeos.js +0 -97
- package/dist/lib/sml-api/squeezeos.js.map +0 -1
- package/dist/lib/sml-api/xdeo.d.ts +0 -13
- package/dist/lib/sml-api/xdeo.d.ts.map +0 -1
- package/dist/lib/sml-api/xdeo.js +0 -34
- package/dist/lib/sml-api/xdeo.js.map +0 -1
- package/dist/lib/sml-api/xmit.d.ts +0 -13
- package/dist/lib/sml-api/xmit.d.ts.map +0 -1
- package/dist/lib/sml-api/xmit.js +0 -34
- package/dist/lib/sml-api/xmit.js.map +0 -1
- package/dist/server/health.d.ts +0 -16
- package/dist/server/health.d.ts.map +0 -1
- package/dist/server/health.js +0 -39
- package/dist/server/health.js.map +0 -1
- package/dist/server/index.d.ts +0 -3
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -199
- package/dist/server/index.js.map +0 -1
- package/dist/server/payments/ap2.d.ts +0 -17
- package/dist/server/payments/ap2.d.ts.map +0 -1
- package/dist/server/payments/ap2.js +0 -77
- package/dist/server/payments/ap2.js.map +0 -1
- package/dist/server/payments/receipt.d.ts +0 -28
- package/dist/server/payments/receipt.d.ts.map +0 -1
- package/dist/server/payments/receipt.js +0 -60
- package/dist/server/payments/receipt.js.map +0 -1
- package/dist/server/payments/router.d.ts +0 -23
- package/dist/server/payments/router.d.ts.map +0 -1
- package/dist/server/payments/router.js +0 -69
- package/dist/server/payments/router.js.map +0 -1
- package/dist/server/payments/wallet.d.ts +0 -18
- package/dist/server/payments/wallet.d.ts.map +0 -1
- package/dist/server/payments/wallet.js +0 -107
- package/dist/server/payments/wallet.js.map +0 -1
- package/dist/server/payments/x402.d.ts +0 -29
- package/dist/server/payments/x402.d.ts.map +0 -1
- package/dist/server/payments/x402.js +0 -138
- package/dist/server/payments/x402.js.map +0 -1
- package/dist/server/registry/catalog.d.ts +0 -12
- package/dist/server/registry/catalog.d.ts.map +0 -1
- package/dist/server/registry/catalog.js +0 -55
- package/dist/server/registry/catalog.js.map +0 -1
- package/dist/server/registry/discovery.d.ts +0 -16
- package/dist/server/registry/discovery.d.ts.map +0 -1
- package/dist/server/registry/discovery.js +0 -33
- package/dist/server/registry/discovery.js.map +0 -1
- package/dist/server/registry/pricing.d.ts +0 -10
- package/dist/server/registry/pricing.d.ts.map +0 -1
- package/dist/server/registry/pricing.js +0 -123
- package/dist/server/registry/pricing.js.map +0 -1
- package/dist/server/security/acl.d.ts +0 -28
- package/dist/server/security/acl.d.ts.map +0 -1
- package/dist/server/security/acl.js +0 -36
- package/dist/server/security/acl.js.map +0 -1
- package/dist/server/security/audit.d.ts +0 -15
- package/dist/server/security/audit.d.ts.map +0 -1
- package/dist/server/security/audit.js +0 -77
- package/dist/server/security/audit.js.map +0 -1
- package/dist/server/security/rate-limit.d.ts +0 -12
- package/dist/server/security/rate-limit.d.ts.map +0 -1
- package/dist/server/security/rate-limit.js +0 -72
- package/dist/server/security/rate-limit.js.map +0 -1
- package/dist/server/security/sandbox.d.ts +0 -7
- package/dist/server/security/sandbox.d.ts.map +0 -1
- package/dist/server/security/sandbox.js +0 -42
- package/dist/server/security/sandbox.js.map +0 -1
- package/dist/server/tools/agentcard.d.ts +0 -3
- package/dist/server/tools/agentcard.d.ts.map +0 -1
- package/dist/server/tools/agentcard.js +0 -118
- package/dist/server/tools/agentcard.js.map +0 -1
- package/dist/server/tools/backtest.d.ts +0 -3
- package/dist/server/tools/backtest.d.ts.map +0 -1
- package/dist/server/tools/backtest.js +0 -112
- package/dist/server/tools/backtest.js.map +0 -1
- package/dist/server/tools/brokers.d.ts +0 -3
- package/dist/server/tools/brokers.d.ts.map +0 -1
- package/dist/server/tools/brokers.js +0 -223
- package/dist/server/tools/brokers.js.map +0 -1
- package/dist/server/tools/copytrader.d.ts +0 -3
- package/dist/server/tools/copytrader.d.ts.map +0 -1
- package/dist/server/tools/copytrader.js +0 -90
- package/dist/server/tools/copytrader.js.map +0 -1
- package/dist/server/tools/crawl.d.ts +0 -3
- package/dist/server/tools/crawl.d.ts.map +0 -1
- package/dist/server/tools/crawl.js +0 -60
- package/dist/server/tools/crawl.js.map +0 -1
- package/dist/server/tools/discovery.d.ts +0 -3
- package/dist/server/tools/discovery.d.ts.map +0 -1
- package/dist/server/tools/discovery.js +0 -188
- package/dist/server/tools/discovery.js.map +0 -1
- package/dist/server/tools/echo.d.ts +0 -3
- package/dist/server/tools/echo.d.ts.map +0 -1
- package/dist/server/tools/echo.js +0 -48
- package/dist/server/tools/echo.js.map +0 -1
- package/dist/server/tools/forge.d.ts +0 -3
- package/dist/server/tools/forge.d.ts.map +0 -1
- package/dist/server/tools/forge.js +0 -77
- package/dist/server/tools/forge.js.map +0 -1
- package/dist/server/tools/ftd.d.ts +0 -3
- package/dist/server/tools/ftd.d.ts.map +0 -1
- package/dist/server/tools/ftd.js +0 -70
- package/dist/server/tools/ftd.js.map +0 -1
- package/dist/server/tools/ghost.d.ts +0 -3
- package/dist/server/tools/ghost.d.ts.map +0 -1
- package/dist/server/tools/ghost.js +0 -83
- package/dist/server/tools/ghost.js.map +0 -1
- package/dist/server/tools/index.d.ts +0 -3
- package/dist/server/tools/index.d.ts.map +0 -1
- package/dist/server/tools/index.js +0 -44
- package/dist/server/tools/index.js.map +0 -1
- package/dist/server/tools/launchpad.d.ts +0 -3
- package/dist/server/tools/launchpad.d.ts.map +0 -1
- package/dist/server/tools/launchpad.js +0 -151
- package/dist/server/tools/launchpad.js.map +0 -1
- package/dist/server/tools/leviathan.d.ts +0 -3
- package/dist/server/tools/leviathan.d.ts.map +0 -1
- package/dist/server/tools/leviathan.js +0 -73
- package/dist/server/tools/leviathan.js.map +0 -1
- package/dist/server/tools/nexus.d.ts +0 -3
- package/dist/server/tools/nexus.d.ts.map +0 -1
- package/dist/server/tools/nexus.js +0 -65
- package/dist/server/tools/nexus.js.map +0 -1
- package/dist/server/tools/proof402.d.ts +0 -3
- package/dist/server/tools/proof402.d.ts.map +0 -1
- package/dist/server/tools/proof402.js +0 -74
- package/dist/server/tools/proof402.js.map +0 -1
- package/dist/server/tools/rails.d.ts +0 -3
- package/dist/server/tools/rails.d.ts.map +0 -1
- package/dist/server/tools/rails.js +0 -82
- package/dist/server/tools/rails.js.map +0 -1
- package/dist/server/tools/shadow.d.ts +0 -3
- package/dist/server/tools/shadow.d.ts.map +0 -1
- package/dist/server/tools/shadow.js +0 -114
- package/dist/server/tools/shadow.js.map +0 -1
- package/dist/server/tools/squeezeos.d.ts +0 -3
- package/dist/server/tools/squeezeos.d.ts.map +0 -1
- package/dist/server/tools/squeezeos.js +0 -231
- package/dist/server/tools/squeezeos.js.map +0 -1
- package/dist/server/tools/xdeo.d.ts +0 -3
- package/dist/server/tools/xdeo.d.ts.map +0 -1
- package/dist/server/tools/xdeo.js +0 -58
- package/dist/server/tools/xdeo.js.map +0 -1
- package/dist/server/tools/xmit.d.ts +0 -3
- package/dist/server/tools/xmit.d.ts.map +0 -1
- package/dist/server/tools/xmit.js +0 -59
- package/dist/server/tools/xmit.js.map +0 -1
- package/docker-compose.yml +0 -50
- package/mcp-publisher.exe +0 -0
- package/render.yaml +0 -39
- package/sdk/mcp-x402-sdk/package.json +0 -18
- package/sdk/mcp-x402-sdk/src/index.ts +0 -118
- package/sdk/mcp-x402-sdk/tsconfig.json +0 -14
- package/server.json +0 -48
- package/services/backtest_service.py +0 -176
- package/src/lib/chains/base.ts +0 -77
- package/src/lib/chains/solana.ts +0 -59
- package/src/lib/chains/xrpl.ts +0 -63
- package/src/lib/credit/bureau.ts +0 -65
- package/src/lib/sml-api/agentcard.ts +0 -40
- package/src/lib/sml-api/backtest.ts +0 -47
- package/src/lib/sml-api/brokers.ts +0 -160
- package/src/lib/sml-api/copytrader.ts +0 -33
- package/src/lib/sml-api/crawl.ts +0 -44
- package/src/lib/sml-api/echo.ts +0 -28
- package/src/lib/sml-api/forge.ts +0 -33
- package/src/lib/sml-api/ftd.ts +0 -53
- package/src/lib/sml-api/ghost.ts +0 -35
- package/src/lib/sml-api/launchpad.ts +0 -43
- package/src/lib/sml-api/leviathan.ts +0 -49
- package/src/lib/sml-api/nexus.ts +0 -50
- package/src/lib/sml-api/proof402.ts +0 -27
- package/src/lib/sml-api/rails.ts +0 -34
- package/src/lib/sml-api/shadow.ts +0 -35
- package/src/lib/sml-api/squeezeos.ts +0 -95
- package/src/lib/sml-api/xdeo.ts +0 -40
- package/src/lib/sml-api/xmit.ts +0 -40
- package/src/server/health.ts +0 -52
- package/src/server/index.ts +0 -213
- package/src/server/payments/ap2.ts +0 -101
- package/src/server/payments/receipt.ts +0 -85
- package/src/server/payments/router.ts +0 -110
- package/src/server/payments/wallet.ts +0 -123
- package/src/server/payments/x402.ts +0 -177
- package/src/server/registry/catalog.ts +0 -61
- package/src/server/registry/discovery.ts +0 -39
- package/src/server/registry/pricing.ts +0 -133
- package/src/server/security/acl.ts +0 -42
- package/src/server/security/audit.ts +0 -94
- package/src/server/security/rate-limit.ts +0 -84
- package/src/server/security/sandbox.ts +0 -40
- package/src/server/tools/agentcard.ts +0 -134
- package/src/server/tools/backtest.ts +0 -119
- package/src/server/tools/brokers.ts +0 -250
- package/src/server/tools/copytrader.ts +0 -104
- package/src/server/tools/crawl.ts +0 -70
- package/src/server/tools/discovery.ts +0 -202
- package/src/server/tools/echo.ts +0 -58
- package/src/server/tools/forge.ts +0 -87
- package/src/server/tools/ftd.ts +0 -88
- package/src/server/tools/ghost.ts +0 -93
- package/src/server/tools/index.ts +0 -42
- package/src/server/tools/launchpad.ts +0 -173
- package/src/server/tools/leviathan.ts +0 -81
- package/src/server/tools/nexus.ts +0 -76
- package/src/server/tools/proof402.ts +0 -87
- package/src/server/tools/rails.ts +0 -92
- package/src/server/tools/shadow.ts +0 -128
- package/src/server/tools/squeezeos.ts +0 -312
- package/src/server/tools/xdeo.ts +0 -67
- package/src/server/tools/xmit.ts +0 -68
- package/tests/integration/e2e.test.ts +0 -51
- package/tests/unit/payments.test.ts +0 -49
- package/tests/unit/security.test.ts +0 -92
- package/tests/unit/tools.test.ts +0 -42
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -20
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @scriptmasterlabs/mcp-x402
|
|
3
|
+
*
|
|
4
|
+
* mcp-wrapper.ts — Drop-in wrapper that adds x402 XRPL payment gating
|
|
5
|
+
* to any existing MCP (Model Context Protocol) server.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { wrapMcpServer } from "@scriptmasterlabs/mcp-x402";
|
|
9
|
+
* const server = wrapMcpServer(myMcpServer, { ... });
|
|
10
|
+
*
|
|
11
|
+
* The wrapper intercepts tool calls, checks for payment proof,
|
|
12
|
+
* and either issues a 402 challenge or passes through to the real handler.
|
|
13
|
+
*/
|
|
14
|
+
import { PaymentGateOptions, X402MiddlewareOptions } from "./x402-middleware.js";
|
|
15
|
+
import { Application } from "express";
|
|
16
|
+
export interface McpTool {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
handler: (params: Record<string, unknown>) => Promise<unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface McpToolWithPricing extends McpTool {
|
|
22
|
+
/** If omitted, the tool is free */
|
|
23
|
+
pricing?: PaymentGateOptions;
|
|
24
|
+
}
|
|
25
|
+
export interface McpServerOptions {
|
|
26
|
+
/** Port to listen on. Default: 3402 */
|
|
27
|
+
port?: number;
|
|
28
|
+
/** x402 middleware options (wallet seed, network, cap) */
|
|
29
|
+
x402: X402MiddlewareOptions;
|
|
30
|
+
/** Tools to register */
|
|
31
|
+
tools: McpToolWithPricing[];
|
|
32
|
+
/** Server name shown in MCP server manifest */
|
|
33
|
+
serverName?: string;
|
|
34
|
+
/** Server version */
|
|
35
|
+
serverVersion?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Spins up a lightweight MCP-compatible Express server with x402 payment
|
|
39
|
+
* gating on any tools that have a `pricing` field.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { wrapMcpServer } from "@scriptmasterlabs/mcp-x402";
|
|
44
|
+
*
|
|
45
|
+
* const server = wrapMcpServer({
|
|
46
|
+
* x402: { walletSeed: process.env.XRPL_WALLET_SEED!, network: "xrpl-mainnet" },
|
|
47
|
+
* tools: [
|
|
48
|
+
* {
|
|
49
|
+
* name: "premium-market-data",
|
|
50
|
+
* description: "Real-time XRP/USD price feed",
|
|
51
|
+
* pricing: {
|
|
52
|
+
* destination: "rYourReceivingAddress",
|
|
53
|
+
* amountDrops: "100000", // 0.1 XRP per call
|
|
54
|
+
* currency: "XRP",
|
|
55
|
+
* description: "0.1 XRP per market data query",
|
|
56
|
+
* },
|
|
57
|
+
* handler: async (params) => {
|
|
58
|
+
* return { price: 0.52, timestamp: Date.now() };
|
|
59
|
+
* },
|
|
60
|
+
* },
|
|
61
|
+
* ],
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* server.listen();
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function wrapMcpServer(opts: McpServerOptions): {
|
|
68
|
+
app: Application;
|
|
69
|
+
listen: () => void;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=mcp-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-wrapper.d.ts","sourceRoot":"","sources":["../src/mcp-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA2C,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC1H,OAAgB,EAAE,WAAW,EAAU,MAAM,SAAS,CAAC;AAIvD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,kBAAmB,SAAQ,OAAO;IACjD,mCAAmC;IACnC,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,IAAI,EAAE,qBAAqB,CAAC;IAC5B,wBAAwB;IACxB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAiE9F"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @scriptmasterlabs/mcp-x402
|
|
3
|
+
*
|
|
4
|
+
* mcp-wrapper.ts — Drop-in wrapper that adds x402 XRPL payment gating
|
|
5
|
+
* to any existing MCP (Model Context Protocol) server.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { wrapMcpServer } from "@scriptmasterlabs/mcp-x402";
|
|
9
|
+
* const server = wrapMcpServer(myMcpServer, { ... });
|
|
10
|
+
*
|
|
11
|
+
* The wrapper intercepts tool calls, checks for payment proof,
|
|
12
|
+
* and either issues a 402 challenge or passes through to the real handler.
|
|
13
|
+
*/
|
|
14
|
+
import { createPaymentGate, createX402Middleware } from "./x402-middleware.js";
|
|
15
|
+
import express, { Router } from "express";
|
|
16
|
+
// ─── wrapMcpServer ────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Spins up a lightweight MCP-compatible Express server with x402 payment
|
|
19
|
+
* gating on any tools that have a `pricing` field.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { wrapMcpServer } from "@scriptmasterlabs/mcp-x402";
|
|
24
|
+
*
|
|
25
|
+
* const server = wrapMcpServer({
|
|
26
|
+
* x402: { walletSeed: process.env.XRPL_WALLET_SEED!, network: "xrpl-mainnet" },
|
|
27
|
+
* tools: [
|
|
28
|
+
* {
|
|
29
|
+
* name: "premium-market-data",
|
|
30
|
+
* description: "Real-time XRP/USD price feed",
|
|
31
|
+
* pricing: {
|
|
32
|
+
* destination: "rYourReceivingAddress",
|
|
33
|
+
* amountDrops: "100000", // 0.1 XRP per call
|
|
34
|
+
* currency: "XRP",
|
|
35
|
+
* description: "0.1 XRP per market data query",
|
|
36
|
+
* },
|
|
37
|
+
* handler: async (params) => {
|
|
38
|
+
* return { price: 0.52, timestamp: Date.now() };
|
|
39
|
+
* },
|
|
40
|
+
* },
|
|
41
|
+
* ],
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* server.listen();
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function wrapMcpServer(opts) {
|
|
48
|
+
const app = express();
|
|
49
|
+
const port = opts.port ?? 3402;
|
|
50
|
+
app.use(express.json());
|
|
51
|
+
// Attach x402 client-side middleware (handles outbound 402 fulfillment)
|
|
52
|
+
app.use(createX402Middleware(opts.x402));
|
|
53
|
+
// MCP server manifest (GET /.well-known/mcp)
|
|
54
|
+
app.get("/.well-known/mcp", (_req, res) => {
|
|
55
|
+
res.json({
|
|
56
|
+
name: opts.serverName ?? "mcp-x402-xrpl",
|
|
57
|
+
version: opts.serverVersion ?? "0.1.0",
|
|
58
|
+
protocol: "mcp/1.0",
|
|
59
|
+
payment: {
|
|
60
|
+
protocol: "x402",
|
|
61
|
+
network: opts.x402.network ?? "xrpl-mainnet",
|
|
62
|
+
currency: "XRP",
|
|
63
|
+
info: "https://github.com/Timwal78/mcp-x402-xrpl",
|
|
64
|
+
},
|
|
65
|
+
tools: opts.tools.map((t) => ({
|
|
66
|
+
name: t.name,
|
|
67
|
+
description: t.description,
|
|
68
|
+
...(t.pricing ? { pricing: t.pricing } : {}),
|
|
69
|
+
})),
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
// Register tool routes
|
|
73
|
+
const toolRouter = Router();
|
|
74
|
+
for (const tool of opts.tools) {
|
|
75
|
+
const handlers = [];
|
|
76
|
+
// Gated tool — add payment gate middleware
|
|
77
|
+
if (tool.pricing) {
|
|
78
|
+
handlers.push(createPaymentGate(tool.pricing));
|
|
79
|
+
}
|
|
80
|
+
// Tool handler
|
|
81
|
+
handlers.push(async (req, res) => {
|
|
82
|
+
try {
|
|
83
|
+
const result = await tool.handler(req.body);
|
|
84
|
+
res.json({ result });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
res.status(500).json({ error: String(err) });
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
toolRouter.post(`/${tool.name}`, ...handlers);
|
|
91
|
+
}
|
|
92
|
+
app.use("/tools", toolRouter);
|
|
93
|
+
return {
|
|
94
|
+
app,
|
|
95
|
+
listen: () => {
|
|
96
|
+
app.listen(port, () => {
|
|
97
|
+
console.log(`[mcp-x402] MCP server listening on http://localhost:${port}`);
|
|
98
|
+
console.log(`[mcp-x402] Manifest: http://localhost:${port}/.well-known/mcp`);
|
|
99
|
+
console.log(`[mcp-x402] Tools: ${opts.tools.map((t) => t.name).join(", ")}`);
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=mcp-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-wrapper.js","sourceRoot":"","sources":["../src/mcp-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @scriptmasterlabs/mcp-x402
|
|
3
|
+
*
|
|
4
|
+
* x402-middleware.ts — Express/Fastify-compatible middleware that intercepts
|
|
5
|
+
* HTTP 402 Payment Required responses and fulfils them using an XRPL wallet.
|
|
6
|
+
*
|
|
7
|
+
* The middleware sits between the MCP client (AI agent) and any gated
|
|
8
|
+
* MCP tool endpoint. When the upstream server returns 402, it:
|
|
9
|
+
* 1. Parses the X-Payment-Requirements header
|
|
10
|
+
* 2. Signs an XRPL / Xahau payment transaction
|
|
11
|
+
* 3. Resubmits the original request with X-Payment proof header
|
|
12
|
+
* 4. Passes the 200 response through to the agent
|
|
13
|
+
*
|
|
14
|
+
* Chain support: XRPL mainnet · XRPL testnet · Xahau mainnet · Xahau testnet
|
|
15
|
+
* Settlement: XRP (native) · RLUSD (IOU) · XAH (native on Xahau)
|
|
16
|
+
*/
|
|
17
|
+
import { RequestHandler } from "express";
|
|
18
|
+
import { PaymentRequirements, PaymentProof } from "./xrpl-facilitator.js";
|
|
19
|
+
export interface X402MiddlewareOptions {
|
|
20
|
+
/** XRPL/Xahau wallet seed (family seed format, e.g. "sEdT...") */
|
|
21
|
+
walletSeed: string;
|
|
22
|
+
/** Network to settle on. Defaults to "xrpl-mainnet" */
|
|
23
|
+
network?: "xrpl-mainnet" | "xrpl-testnet" | "xahau-mainnet" | "xahau-testnet";
|
|
24
|
+
/** Maximum amount (in drops for XRP, or string for RLUSD/XAH) the middleware
|
|
25
|
+
* will auto-pay per request. Requests exceeding this are rejected. */
|
|
26
|
+
maxPaymentDrops?: string;
|
|
27
|
+
/** Optional logger. Defaults to console. */
|
|
28
|
+
logger?: Pick<Console, "log" | "warn" | "error">;
|
|
29
|
+
}
|
|
30
|
+
export type { PaymentRequirements, PaymentProof };
|
|
31
|
+
/**
|
|
32
|
+
* Factory — returns an Express-compatible middleware function.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import express from "express";
|
|
37
|
+
* import { createX402Middleware } from "@scriptmasterlabs/mcp-x402";
|
|
38
|
+
*
|
|
39
|
+
* const app = express();
|
|
40
|
+
* app.use(createX402Middleware({
|
|
41
|
+
* walletSeed: process.env.XRPL_WALLET_SEED!,
|
|
42
|
+
* network: "xrpl-mainnet",
|
|
43
|
+
* maxPaymentDrops: "1000000", // 1 XRP cap per tool call
|
|
44
|
+
* }));
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function createX402Middleware(opts: X402MiddlewareOptions): RequestHandler;
|
|
48
|
+
/**
|
|
49
|
+
* createPaymentGate — wraps a route handler so that callers without a valid
|
|
50
|
+
* X-Payment-Proof header receive a 402 challenge automatically.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* app.post(
|
|
55
|
+
* "/tools/premium-query",
|
|
56
|
+
* createPaymentGate({ amountDrops: "100000", currency: "XRP" }),
|
|
57
|
+
* myToolHandler
|
|
58
|
+
* );
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export interface PaymentGateOptions {
|
|
62
|
+
/** Amount in drops (1 XRP = 1,000,000 drops) for XRP payments */
|
|
63
|
+
amountDrops?: string;
|
|
64
|
+
/** For RLUSD or XAH: human-readable amount string e.g. "0.10" */
|
|
65
|
+
amount?: string;
|
|
66
|
+
/** Currency code. "XRP" | "RLUSD" | "XAH". Defaults to "XRP" */
|
|
67
|
+
currency?: "XRP" | "RLUSD" | "XAH";
|
|
68
|
+
/** Your XRPL receiving address */
|
|
69
|
+
destination: string;
|
|
70
|
+
/** Optional destination tag */
|
|
71
|
+
destinationTag?: number;
|
|
72
|
+
/** Description shown to the paying agent */
|
|
73
|
+
description?: string;
|
|
74
|
+
}
|
|
75
|
+
export declare function createPaymentGate(opts: PaymentGateOptions): RequestHandler;
|
|
76
|
+
//# sourceMappingURL=x402-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-middleware.d.ts","sourceRoot":"","sources":["../src/x402-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAmB,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3F,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,CAAC;IAC9E;2EACuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CAClD;AAED,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC;AAElD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,cAAc,CAyDhF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;IACnC,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAmC1E"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @scriptmasterlabs/mcp-x402
|
|
3
|
+
*
|
|
4
|
+
* x402-middleware.ts — Express/Fastify-compatible middleware that intercepts
|
|
5
|
+
* HTTP 402 Payment Required responses and fulfils them using an XRPL wallet.
|
|
6
|
+
*
|
|
7
|
+
* The middleware sits between the MCP client (AI agent) and any gated
|
|
8
|
+
* MCP tool endpoint. When the upstream server returns 402, it:
|
|
9
|
+
* 1. Parses the X-Payment-Requirements header
|
|
10
|
+
* 2. Signs an XRPL / Xahau payment transaction
|
|
11
|
+
* 3. Resubmits the original request with X-Payment proof header
|
|
12
|
+
* 4. Passes the 200 response through to the agent
|
|
13
|
+
*
|
|
14
|
+
* Chain support: XRPL mainnet · XRPL testnet · Xahau mainnet · Xahau testnet
|
|
15
|
+
* Settlement: XRP (native) · RLUSD (IOU) · XAH (native on Xahau)
|
|
16
|
+
*/
|
|
17
|
+
import { XrplFacilitator } from "./xrpl-facilitator.js";
|
|
18
|
+
/**
|
|
19
|
+
* Factory — returns an Express-compatible middleware function.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import express from "express";
|
|
24
|
+
* import { createX402Middleware } from "@scriptmasterlabs/mcp-x402";
|
|
25
|
+
*
|
|
26
|
+
* const app = express();
|
|
27
|
+
* app.use(createX402Middleware({
|
|
28
|
+
* walletSeed: process.env.XRPL_WALLET_SEED!,
|
|
29
|
+
* network: "xrpl-mainnet",
|
|
30
|
+
* maxPaymentDrops: "1000000", // 1 XRP cap per tool call
|
|
31
|
+
* }));
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function createX402Middleware(opts) {
|
|
35
|
+
const log = opts.logger ?? console;
|
|
36
|
+
const facilitator = new XrplFacilitator({
|
|
37
|
+
walletSeed: opts.walletSeed,
|
|
38
|
+
network: opts.network ?? "xrpl-mainnet",
|
|
39
|
+
});
|
|
40
|
+
return async function x402Middleware(req, res, next) {
|
|
41
|
+
// Intercept only if the upstream already returned 402.
|
|
42
|
+
// In proxy mode, call next() — the wrapper handles intercept.
|
|
43
|
+
// In direct mode, the payment gate checks the header before calling next().
|
|
44
|
+
const paymentRequirementsHeader = req.headers["x-payment-requirements"];
|
|
45
|
+
if (!paymentRequirementsHeader) {
|
|
46
|
+
// No payment challenge — pass through
|
|
47
|
+
next();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
let requirements;
|
|
51
|
+
try {
|
|
52
|
+
requirements = JSON.parse(Buffer.from(paymentRequirementsHeader, "base64").toString("utf8"));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
log.error("[mcp-x402] Failed to parse X-Payment-Requirements header");
|
|
56
|
+
res.status(400).json({ error: "malformed_payment_requirements" });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Safety cap check
|
|
60
|
+
if (opts.maxPaymentDrops && BigInt(requirements.amountDrops ?? "0") > BigInt(opts.maxPaymentDrops)) {
|
|
61
|
+
log.warn(`[mcp-x402] Payment request (${requirements.amountDrops} drops) exceeds maxPaymentDrops cap`);
|
|
62
|
+
res.status(402).json({ error: "payment_exceeds_cap", requirements });
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
log.log(`[mcp-x402] Fulfilling x402 payment: ${requirements.amountDrops} drops → ${requirements.destination}`);
|
|
67
|
+
const proof = await facilitator.pay(requirements);
|
|
68
|
+
log.log(`[mcp-x402] Payment settled. TxHash: ${proof.txHash}`);
|
|
69
|
+
// Attach proof header and allow the MCP server to verify
|
|
70
|
+
req.headers["x-payment-proof"] = Buffer.from(JSON.stringify(proof)).toString("base64");
|
|
71
|
+
// Clear the requirements header so the server doesn't loop
|
|
72
|
+
delete req.headers["x-payment-requirements"];
|
|
73
|
+
next();
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
log.error("[mcp-x402] Payment failed:", err);
|
|
77
|
+
res.status(402).json({ error: "payment_failed", details: String(err) });
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export function createPaymentGate(opts) {
|
|
82
|
+
return function paymentGate(req, res, next) {
|
|
83
|
+
const proofHeader = req.headers["x-payment-proof"];
|
|
84
|
+
if (proofHeader) {
|
|
85
|
+
// Proof attached — let the facilitator verify downstream, pass through
|
|
86
|
+
next();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// No proof — issue the 402 challenge
|
|
90
|
+
const requirements = {
|
|
91
|
+
destination: opts.destination,
|
|
92
|
+
destinationTag: opts.destinationTag,
|
|
93
|
+
amountDrops: opts.amountDrops,
|
|
94
|
+
amount: opts.amount,
|
|
95
|
+
currency: opts.currency ?? "XRP",
|
|
96
|
+
network: "xrpl-mainnet",
|
|
97
|
+
description: opts.description ?? "Payment required for MCP tool access",
|
|
98
|
+
expiresAt: new Date(Date.now() + 60_000).toISOString(), // 60-second window
|
|
99
|
+
};
|
|
100
|
+
const encoded = Buffer.from(JSON.stringify(requirements)).toString("base64");
|
|
101
|
+
res
|
|
102
|
+
.status(402)
|
|
103
|
+
.setHeader("X-Payment-Requirements", encoded)
|
|
104
|
+
.json({
|
|
105
|
+
error: "payment_required",
|
|
106
|
+
protocol: "x402",
|
|
107
|
+
network: "xrpl",
|
|
108
|
+
requirements,
|
|
109
|
+
paymentInstructions: "Attach X-Payment-Proof header with base64-encoded XRPL tx proof to retry.",
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=x402-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-middleware.js","sourceRoot":"","sources":["../src/x402-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @scriptmasterlabs/mcp-x402
|
|
3
|
+
*
|
|
4
|
+
* xrpl-facilitator.ts — XRPL/Xahau payment facilitator.
|
|
5
|
+
*
|
|
6
|
+
* Responsibilities:
|
|
7
|
+
* - Connect to the correct XRPL / Xahau network
|
|
8
|
+
* - Sign and submit payment transactions (XRP drops, RLUSD IOU, XAH)
|
|
9
|
+
* - Return a PaymentProof that the receiving MCP server can verify on-ledger
|
|
10
|
+
* - Verify incoming PaymentProof objects (server-side gate)
|
|
11
|
+
*
|
|
12
|
+
* This is the ONLY component that touches private key material.
|
|
13
|
+
* Never log walletSeed. Never expose wallet.privateKey downstream.
|
|
14
|
+
*/
|
|
15
|
+
export interface PaymentRequirements {
|
|
16
|
+
/** Receiving XRPL address */
|
|
17
|
+
destination: string;
|
|
18
|
+
/** Optional destination tag */
|
|
19
|
+
destinationTag?: number;
|
|
20
|
+
/** XRP amount in drops (string to avoid BigInt precision issues) */
|
|
21
|
+
amountDrops?: string;
|
|
22
|
+
/** Human-readable amount for non-XRP currencies */
|
|
23
|
+
amount?: string;
|
|
24
|
+
/** Currency code */
|
|
25
|
+
currency?: "XRP" | "RLUSD" | "XAH";
|
|
26
|
+
/** Network identifier */
|
|
27
|
+
network?: string;
|
|
28
|
+
/** Human-readable description of the tool / service */
|
|
29
|
+
description?: string;
|
|
30
|
+
/** ISO timestamp — proof must be submitted before this */
|
|
31
|
+
expiresAt?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface PaymentProof {
|
|
34
|
+
/** Transaction hash (hex) on XRPL/Xahau ledger */
|
|
35
|
+
txHash: string;
|
|
36
|
+
/** Ledger index where the tx was validated */
|
|
37
|
+
ledgerIndex: number;
|
|
38
|
+
/** Paying wallet address (public, safe to expose) */
|
|
39
|
+
payer: string;
|
|
40
|
+
/** The destination address paid */
|
|
41
|
+
destination: string;
|
|
42
|
+
/** Amount in drops or human-readable string */
|
|
43
|
+
amount: string;
|
|
44
|
+
/** Currency code */
|
|
45
|
+
currency: string;
|
|
46
|
+
/** Network the payment was submitted on */
|
|
47
|
+
network: string;
|
|
48
|
+
/** ISO timestamp of settlement */
|
|
49
|
+
settledAt: string;
|
|
50
|
+
}
|
|
51
|
+
export type XrplNetwork = "xrpl-mainnet" | "xrpl-testnet" | "xahau-mainnet" | "xahau-testnet";
|
|
52
|
+
export interface XrplFacilitatorOptions {
|
|
53
|
+
walletSeed: string;
|
|
54
|
+
network: XrplNetwork;
|
|
55
|
+
}
|
|
56
|
+
export declare class XrplFacilitator {
|
|
57
|
+
private readonly wallet;
|
|
58
|
+
private readonly network;
|
|
59
|
+
private readonly wsUrl;
|
|
60
|
+
constructor(opts: XrplFacilitatorOptions);
|
|
61
|
+
/** Public address of the paying wallet (safe to log/expose) */
|
|
62
|
+
get payerAddress(): string;
|
|
63
|
+
/**
|
|
64
|
+
* pay() — fulfil a PaymentRequirements challenge.
|
|
65
|
+
* Connects, submits, waits for validation, disconnects.
|
|
66
|
+
* Returns a PaymentProof the server can verify on-ledger.
|
|
67
|
+
*/
|
|
68
|
+
pay(req: PaymentRequirements): Promise<PaymentProof>;
|
|
69
|
+
/**
|
|
70
|
+
* verify() — server-side: confirm that a PaymentProof actually exists on-ledger
|
|
71
|
+
* and matches the expected requirements.
|
|
72
|
+
*/
|
|
73
|
+
verify(proof: PaymentProof, expected: PaymentRequirements): Promise<boolean>;
|
|
74
|
+
private buildPaymentTx;
|
|
75
|
+
private extractProof;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=xrpl-facilitator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrpl-facilitator.d.ts","sourceRoot":"","sources":["../src/xrpl-facilitator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;IACnC,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,CAAC;AAE9F,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;CACtB;AAaD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,IAAI,EAAE,sBAAsB;IAOxC,+DAA+D;IAC/D,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAmB1D;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;YAyCpE,cAAc;IAmC5B,OAAO,CAAC,YAAY;CAmBrB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @scriptmasterlabs/mcp-x402
|
|
3
|
+
*
|
|
4
|
+
* xrpl-facilitator.ts — XRPL/Xahau payment facilitator.
|
|
5
|
+
*
|
|
6
|
+
* Responsibilities:
|
|
7
|
+
* - Connect to the correct XRPL / Xahau network
|
|
8
|
+
* - Sign and submit payment transactions (XRP drops, RLUSD IOU, XAH)
|
|
9
|
+
* - Return a PaymentProof that the receiving MCP server can verify on-ledger
|
|
10
|
+
* - Verify incoming PaymentProof objects (server-side gate)
|
|
11
|
+
*
|
|
12
|
+
* This is the ONLY component that touches private key material.
|
|
13
|
+
* Never log walletSeed. Never expose wallet.privateKey downstream.
|
|
14
|
+
*/
|
|
15
|
+
import { Client, Wallet, convertStringToHex } from "xrpl";
|
|
16
|
+
// ─── Network WebSocket endpoints ─────────────────────────────────────────────
|
|
17
|
+
const NETWORK_URLS = {
|
|
18
|
+
"xrpl-mainnet": "wss://xrplcluster.com",
|
|
19
|
+
"xrpl-testnet": "wss://s.altnet.rippletest.net:51233",
|
|
20
|
+
"xahau-mainnet": "wss://xahau.network",
|
|
21
|
+
"xahau-testnet": "wss://xahau-test.net",
|
|
22
|
+
};
|
|
23
|
+
// ─── XrplFacilitator ─────────────────────────────────────────────────────────
|
|
24
|
+
export class XrplFacilitator {
|
|
25
|
+
wallet;
|
|
26
|
+
network;
|
|
27
|
+
wsUrl;
|
|
28
|
+
constructor(opts) {
|
|
29
|
+
if (!opts.walletSeed)
|
|
30
|
+
throw new Error("[mcp-x402] walletSeed is required");
|
|
31
|
+
this.wallet = Wallet.fromSeed(opts.walletSeed);
|
|
32
|
+
this.network = opts.network;
|
|
33
|
+
this.wsUrl = NETWORK_URLS[opts.network];
|
|
34
|
+
}
|
|
35
|
+
/** Public address of the paying wallet (safe to log/expose) */
|
|
36
|
+
get payerAddress() {
|
|
37
|
+
return this.wallet.address;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* pay() — fulfil a PaymentRequirements challenge.
|
|
41
|
+
* Connects, submits, waits for validation, disconnects.
|
|
42
|
+
* Returns a PaymentProof the server can verify on-ledger.
|
|
43
|
+
*/
|
|
44
|
+
async pay(req) {
|
|
45
|
+
// Expiry guard
|
|
46
|
+
if (req.expiresAt && new Date(req.expiresAt) < new Date()) {
|
|
47
|
+
throw new Error("[mcp-x402] Payment requirements have expired");
|
|
48
|
+
}
|
|
49
|
+
const client = new Client(this.wsUrl);
|
|
50
|
+
await client.connect();
|
|
51
|
+
try {
|
|
52
|
+
const tx = await this.buildPaymentTx(req);
|
|
53
|
+
const result = await client.submitAndWait(tx, { wallet: this.wallet });
|
|
54
|
+
return this.extractProof(result, req);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await client.disconnect();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* verify() — server-side: confirm that a PaymentProof actually exists on-ledger
|
|
62
|
+
* and matches the expected requirements.
|
|
63
|
+
*/
|
|
64
|
+
async verify(proof, expected) {
|
|
65
|
+
const client = new Client(this.wsUrl);
|
|
66
|
+
await client.connect();
|
|
67
|
+
try {
|
|
68
|
+
const tx = await client.request({
|
|
69
|
+
command: "tx",
|
|
70
|
+
transaction: proof.txHash,
|
|
71
|
+
});
|
|
72
|
+
const ledgerTx = tx.result;
|
|
73
|
+
// Check destination
|
|
74
|
+
if (ledgerTx["Destination"] !== expected.destination)
|
|
75
|
+
return false;
|
|
76
|
+
// Check amount
|
|
77
|
+
if (expected.currency === "XRP" || !expected.currency) {
|
|
78
|
+
const onChainAmt = ledgerTx["Amount"];
|
|
79
|
+
if (typeof onChainAmt !== "string")
|
|
80
|
+
return false;
|
|
81
|
+
if (BigInt(onChainAmt) < BigInt(expected.amountDrops ?? "0"))
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Check destination tag if specified
|
|
85
|
+
if (expected.destinationTag !== undefined && ledgerTx["DestinationTag"] !== expected.destinationTag) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
// Check tx was validated (not just submitted)
|
|
89
|
+
const meta = ledgerTx["meta"];
|
|
90
|
+
if (meta?.["TransactionResult"] !== "tesSUCCESS")
|
|
91
|
+
return false;
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
await client.disconnect();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ─── Private helpers ───────────────────────────────────────────────────────
|
|
102
|
+
async buildPaymentTx(req) {
|
|
103
|
+
const currency = req.currency ?? "XRP";
|
|
104
|
+
let amount;
|
|
105
|
+
if (currency === "XRP") {
|
|
106
|
+
if (!req.amountDrops)
|
|
107
|
+
throw new Error("[mcp-x402] amountDrops required for XRP payments");
|
|
108
|
+
amount = req.amountDrops; // string of drops
|
|
109
|
+
}
|
|
110
|
+
else if (currency === "RLUSD") {
|
|
111
|
+
if (!req.amount)
|
|
112
|
+
throw new Error("[mcp-x402] amount required for RLUSD payments");
|
|
113
|
+
amount = {
|
|
114
|
+
currency: convertStringToHex("RLUSD").padEnd(40, "0"),
|
|
115
|
+
value: req.amount,
|
|
116
|
+
// RLUSD issuer on XRPL mainnet
|
|
117
|
+
issuer: "rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De",
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
else if (currency === "XAH") {
|
|
121
|
+
// XAH is native on Xahau — treated as drops there
|
|
122
|
+
if (!req.amountDrops)
|
|
123
|
+
throw new Error("[mcp-x402] amountDrops required for XAH payments");
|
|
124
|
+
amount = req.amountDrops;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new Error(`[mcp-x402] Unsupported currency: ${currency}`);
|
|
128
|
+
}
|
|
129
|
+
const tx = {
|
|
130
|
+
TransactionType: "Payment",
|
|
131
|
+
Account: this.wallet.address,
|
|
132
|
+
Destination: req.destination,
|
|
133
|
+
Amount: amount,
|
|
134
|
+
...(req.destinationTag !== undefined ? { DestinationTag: req.destinationTag } : {}),
|
|
135
|
+
};
|
|
136
|
+
return tx;
|
|
137
|
+
}
|
|
138
|
+
extractProof(result, req) {
|
|
139
|
+
const tx = result.result;
|
|
140
|
+
const meta = tx["meta"];
|
|
141
|
+
if (meta?.["TransactionResult"] !== "tesSUCCESS") {
|
|
142
|
+
throw new Error(`[mcp-x402] Transaction failed: ${String(meta?.["TransactionResult"])}`);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
txHash: String(tx["hash"]),
|
|
146
|
+
ledgerIndex: Number(tx["ledger_index"] ?? tx["inLedger"]),
|
|
147
|
+
payer: this.wallet.address,
|
|
148
|
+
destination: req.destination,
|
|
149
|
+
amount: req.amountDrops ?? req.amount ?? "0",
|
|
150
|
+
currency: req.currency ?? "XRP",
|
|
151
|
+
network: this.network,
|
|
152
|
+
settledAt: new Date().toISOString(),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=xrpl-facilitator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrpl-facilitator.js","sourceRoot":"","sources":["../src/xrpl-facilitator.ts"],"names":[],"mappings":"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"}
|