kaleido-mcp 0.1.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.
@@ -0,0 +1,133 @@
1
+ /**
2
+ * MPP / L402 / 402index.io tools — payment-gated API access + discovery.
3
+ */
4
+ import { z } from 'zod';
5
+ import { MppClient } from '../mpp-client.js';
6
+ export function registerMppTools(server) {
7
+ const mpp = new MppClient();
8
+ // -----------------------------------------------------------------------
9
+ server.tool('mpp_request_challenge', 'Probe an MPP-protected URL and return the payment challenge. If server returns HTTP 402, parses WWW-Authenticate and returns the Lightning invoice, challenge_id, and amount. After this, use rln_mpp_pay or spark_mpp_pay to settle, then mpp_submit_credential to access the resource.', { url: z.string().describe('URL of the MPP-protected resource') }, async ({ url }) => {
10
+ try {
11
+ const challenge = await mpp.requestChallenge(url);
12
+ return t(JSON.stringify({
13
+ ...challenge,
14
+ next_step: challenge.invoice
15
+ ? 'Pay invoice via wdk_mpp_pay (RLN) or spark_mpp_pay (Spark), then call mpp_submit_credential'
16
+ : 'No Lightning invoice in challenge — check method',
17
+ }, null, 2));
18
+ }
19
+ catch (err) {
20
+ return t(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2));
21
+ }
22
+ });
23
+ // -----------------------------------------------------------------------
24
+ server.tool('mpp_submit_credential', 'Submit an MPP payment credential to access a protected resource. Call after rln_mpp_pay or spark_mpp_pay returns a credential JSON. Returns the resource data and a receipt.', {
25
+ url: z.string().describe('Same URL used in mpp_request_challenge'),
26
+ credential: z.string().describe('Credential JSON string from rln_mpp_pay or spark_mpp_pay'),
27
+ }, async ({ url, credential: credStr }) => {
28
+ try {
29
+ const cred = mpp.deserializeCredential(credStr);
30
+ const result = await mpp.submitCredential(url, cred);
31
+ return t(JSON.stringify({ ok: result.ok, status: result.status, receipt: result.receipt ?? null, data: result.data }, null, 2));
32
+ }
33
+ catch (err) {
34
+ return t(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2));
35
+ }
36
+ });
37
+ // -----------------------------------------------------------------------
38
+ server.tool('mpp_parse_challenge_header', 'Parse a raw WWW-Authenticate header from an HTTP 402 response into a structured MPP challenge. Use when you have the raw header and need to extract invoice/challenge_id without a new HTTP request.', {
39
+ url: z.string().describe('URL that issued the 402'),
40
+ www_authenticate: z.string().describe('Raw value of the WWW-Authenticate header'),
41
+ }, async ({ url, www_authenticate }) => {
42
+ try {
43
+ return t(JSON.stringify(mpp.parseChallenge(url, www_authenticate), null, 2));
44
+ }
45
+ catch (err) {
46
+ return t(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2));
47
+ }
48
+ });
49
+ // -----------------------------------------------------------------------
50
+ server.tool('l402_request_challenge', 'Request an L402 Lightning challenge for a premium endpoint (legacy L402 protocol). Returns a BOLT11 invoice and macaroon. After paying with rln_pay_invoice, call l402_fetch_resource with the preimage.', {
51
+ resource_url: z.string().describe('URL of the L402-protected resource'),
52
+ price_sats: z.number().int().positive().optional().describe('Max price in sats willing to pay (default: 10)'),
53
+ }, async ({ resource_url, price_sats = 10 }) => {
54
+ // Simple HEAD probe to extract L402 challenge
55
+ try {
56
+ const res = await fetch(resource_url, { method: 'GET', signal: AbortSignal.timeout(8_000) });
57
+ if (res.status === 402) {
58
+ const wwwAuth = res.headers.get('WWW-Authenticate') ?? '';
59
+ const challenge = mpp.parseChallenge(resource_url, wwwAuth);
60
+ return t(JSON.stringify({ ...challenge, price_sats, next_step: 'Pay invoice via rln_pay_invoice, then call l402_fetch_resource with preimage as token' }, null, 2));
61
+ }
62
+ return t(JSON.stringify({ info: `Server returned ${res.status} — may not require payment`, resource_url }, null, 2));
63
+ }
64
+ catch (err) {
65
+ return t(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2));
66
+ }
67
+ });
68
+ // -----------------------------------------------------------------------
69
+ server.tool('l402_fetch_resource', 'Fetch an L402-protected resource using a paid Bearer token (format: "macaroon:preimage"). Call after paying the L402 invoice.', {
70
+ resource_url: z.string(),
71
+ token: z.string().describe('L402 Bearer token in format "macaroon:preimage"'),
72
+ }, async ({ resource_url, token }) => {
73
+ try {
74
+ const res = await fetch(resource_url, { headers: { Authorization: `L402 ${token}` }, signal: AbortSignal.timeout(10_000) });
75
+ const body = await res.text();
76
+ let data;
77
+ try {
78
+ data = JSON.parse(body);
79
+ }
80
+ catch {
81
+ data = body;
82
+ }
83
+ return t(JSON.stringify({ status: res.status, data }, null, 2));
84
+ }
85
+ catch (err) {
86
+ return t(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2));
87
+ }
88
+ });
89
+ // -----------------------------------------------------------------------
90
+ server.tool('search_paid_apis', 'Search the 402index.io directory for payment-gated APIs (L402/MPP/x402). Returns endpoint URLs, pricing in sats, health status, and protocol type — ready to call via mpp_request_challenge. Use to discover premium Bitcoin data feeds, on-chain analytics, and AI services payable with Lightning micropayments.', {
91
+ query: z.string().optional().describe('Search keyword (e.g. "bitcoin price", "on-chain analytics", "sentiment")'),
92
+ protocol: z.enum(['L402', 'x402', 'MPP']).optional().describe('L402=Lightning, MPP=Stripe/Tempo, x402=Base/Solana'),
93
+ category: z.string().optional().describe('Category filter (e.g. "finance", "crypto", "ai", "data")'),
94
+ health: z.enum(['healthy', 'degraded', 'unknown']).optional(),
95
+ limit: z.number().int().min(1).max(50).optional().describe('Max results (default: 10)'),
96
+ }, async ({ query, protocol, category, health, limit = 10 }) => {
97
+ try {
98
+ const params = new URLSearchParams();
99
+ if (query)
100
+ params.set('search', query);
101
+ if (protocol)
102
+ params.set('protocol', protocol);
103
+ if (category)
104
+ params.set('category', category);
105
+ if (health)
106
+ params.set('health', health);
107
+ params.set('limit', String(limit));
108
+ const res = await fetch(`https://402index.io/api/v1/services?${params}`, {
109
+ headers: { Accept: 'application/json', 'User-Agent': 'kaleido-mcp/1.0' },
110
+ signal: AbortSignal.timeout(10_000),
111
+ });
112
+ if (!res.ok)
113
+ return t(JSON.stringify({ error: `402index.io returned ${res.status}` }, null, 2));
114
+ const data = await res.json();
115
+ const services = (data.services ?? []).map(s => ({
116
+ id: s.id, name: s.name, description: s.description, url: s.url,
117
+ protocol: s.protocol, price_usd: s.pricing?.usd ?? null,
118
+ price_sats: s.pricing?.sats ?? null,
119
+ category: s.category, health: s.health,
120
+ }));
121
+ return t(JSON.stringify({
122
+ total_available: data.total ?? services.length,
123
+ returned: services.length, services,
124
+ usage: 'For L402/MPP: call mpp_request_challenge → wdk_mpp_pay or spark_mpp_pay → mpp_submit_credential',
125
+ }, null, 2));
126
+ }
127
+ catch (err) {
128
+ return t(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2));
129
+ }
130
+ });
131
+ }
132
+ const t = (content) => ({ content: [{ type: 'text', text: content }] });
133
+ //# sourceMappingURL=mpp-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpp-tools.js","sourceRoot":"","sources":["../../src/tools/mpp-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WdkMcpServer } from '@tetherto/wdk-mcp-toolkit';
2
+ import { type RlnClient } from 'kaleido-sdk/rln';
3
+ export declare function registerRlnTools(server: WdkMcpServer, rln: RlnClient): void;
@@ -0,0 +1,245 @@
1
+ /**
2
+ * RLN (RGB Lightning Node) tools — Lightning channels, RGB assets, atomic swaps.
3
+ * These are custom tools that go beyond what WDK built-in WALLET_TOOLS provide,
4
+ * while using the SDK-backed RLN node client (not a WDK WalletManager).
5
+ *
6
+ * Canonical names mirror the focused `wdk-wallet-rln-mcp` server.
7
+ * Legacy `rln_*` aliases are kept temporarily for compatibility.
8
+ */
9
+ import { z } from 'zod';
10
+ import { AssetSchema } from 'kaleido-sdk/rln';
11
+ const toFungibleAssignment = (value) => ({ type: 'Fungible', value });
12
+ export function registerRlnTools(server, rln) {
13
+ const registerAliases = (names, description, schema,
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ handler) => {
16
+ for (const name of names)
17
+ server.tool(name, description, schema, handler);
18
+ };
19
+ // -----------------------------------------------------------------------
20
+ registerAliases(['wdk_get_node_info', 'rln_get_node_info'], 'Get RLN node identity: pubkey, channel count, Lightning balance, peers. Call first to confirm node is reachable.', {}, async () => {
21
+ const info = await rln.getNodeInfo();
22
+ return t(JSON.stringify(info, null, 2));
23
+ });
24
+ // -----------------------------------------------------------------------
25
+ registerAliases(['wdk_get_balances', 'rln_get_balances'], 'Get RLN wallet balances: BTC on-chain (vanilla/colored UTXOs) and Lightning balance. For RGB asset balances use wdk_get_asset_balance.', { skip_sync: z.boolean().optional().describe('Skip blockchain sync for faster response (default: false)') }, async ({ skip_sync = false }) => {
26
+ const [btc, node] = await Promise.all([rln.getBtcBalance(skip_sync), rln.getNodeInfo()]);
27
+ return t(JSON.stringify({
28
+ btc_onchain: {
29
+ vanilla_spendable_sats: btc.vanilla?.spendable ?? 0,
30
+ vanilla_settled_sats: btc.vanilla?.settled ?? 0,
31
+ colored_spendable_sats: btc.colored?.spendable ?? 0,
32
+ colored_settled_sats: btc.colored?.settled ?? 0,
33
+ },
34
+ lightning_balance_sat: node.local_balance_sat ?? 0,
35
+ }, null, 2));
36
+ });
37
+ // -----------------------------------------------------------------------
38
+ registerAliases(['wdk_get_asset_balance', 'rln_get_asset_balance'], 'Get balance of a specific RGB asset (USDT, XAUT) by asset_id. Returns settled, future, spendable, and off-chain amounts.', { asset_id: z.string().describe("RGB asset ID e.g. 'rgb:2JEUOrsc-...'") }, async ({ asset_id }) => t(JSON.stringify({ asset_id, ...(await rln.getAssetBalance({ asset_id })) }, null, 2)));
39
+ // -----------------------------------------------------------------------
40
+ registerAliases(['wdk_list_assets', 'rln_list_assets'], 'List all RGB assets held by the RLN node (NIA, UDA, CFA schemas). Returns asset_id, ticker, name, precision.', { schemas: z.array(z.enum(['Nia', 'Uda', 'Cfa'])).optional() }, async ({ schemas = [] }) => {
41
+ const assets = await rln.listAssets(schemas.map(schema => AssetSchema[schema]));
42
+ const all = [
43
+ ...(assets.nia ?? []).map(a => ({ ...a, schema: 'Nia' })),
44
+ ...(assets.uda ?? []).map(a => ({ ...a, schema: 'Uda' })),
45
+ ...(assets.cfa ?? []).map(a => ({ ...a, schema: 'Cfa' })),
46
+ ];
47
+ return t(JSON.stringify(all, null, 2));
48
+ });
49
+ // -----------------------------------------------------------------------
50
+ registerAliases(['wdk_get_address', 'rln_get_address'], 'Get RLN node on-chain BTC address for receiving Bitcoin deposits.', {}, async () => t(JSON.stringify(await rln.getAddress(), null, 2)));
51
+ // -----------------------------------------------------------------------
52
+ registerAliases(['wdk_create_rgb_invoice', 'rln_create_rgb_invoice'], 'Create an RGB invoice to receive an RGB asset (USDT, XAUT). Pass the invoice as receiver_address with format=RGB_INVOICE when calling kaleidoswap_place_order.', {
53
+ asset_id: z.string().optional().describe('RGB asset ID. Omit for any asset.'),
54
+ amount: z.number().positive().optional().describe('Expected amount in display units (e.g. 65.5 for 65.5 USDT)'),
55
+ duration_seconds: z.number().int().positive().optional().describe('Invoice expiry (default: 86400 = 24h)'),
56
+ }, async ({ asset_id, amount, duration_seconds }) => {
57
+ const invoice = await rln.createRgbInvoice({
58
+ ...(asset_id ? { asset_id } : {}),
59
+ ...(amount !== undefined ? { assignment: toFungibleAssignment(amount) } : {}),
60
+ duration_seconds: duration_seconds ?? 86400,
61
+ min_confirmations: 1,
62
+ witness: false,
63
+ });
64
+ return t(JSON.stringify({
65
+ invoice: invoice.invoice,
66
+ recipient_id: invoice.recipient_id,
67
+ expires_at: invoice.expiration_timestamp ? new Date(invoice.expiration_timestamp * 1000).toISOString() : null,
68
+ usage: 'Pass invoice as receiver_address with receiver_address_format="RGB_INVOICE"',
69
+ }, null, 2));
70
+ });
71
+ // -----------------------------------------------------------------------
72
+ registerAliases(['wdk_create_ln_invoice', 'rln_create_ln_invoice'], 'Create a BOLT11 Lightning invoice to receive BTC via Lightning Network into the RLN node.', {
73
+ amount_msat: z.number().int().positive().optional().describe('Amount in millisatoshis. Omit for any-amount.'),
74
+ description: z.string().optional(),
75
+ expiry_sec: z.number().int().positive().optional().describe('Expiry in seconds (default: 3600)'),
76
+ }, async ({ amount_msat, description, expiry_sec }) => t(JSON.stringify(await rln.createLNInvoice({
77
+ amt_msat: amount_msat,
78
+ expiry_sec: expiry_sec ?? 3600,
79
+ }), null, 2)));
80
+ // -----------------------------------------------------------------------
81
+ registerAliases(['wdk_pay_invoice', 'rln_pay_invoice'], 'Pay a BOLT11 Lightning invoice from the RLN node. Use to fund KaleidoSwap deposit after placing a REST swap order.', { invoice: z.string().describe('BOLT11 invoice string (lnbc... or lntb...)') }, async ({ invoice }) => t(JSON.stringify(await rln.sendPayment({ invoice }), null, 2)));
82
+ // -----------------------------------------------------------------------
83
+ registerAliases(['wdk_send_btc', 'rln_send_btc'], 'Send BTC on-chain from the RLN node.', {
84
+ address: z.string().describe('Destination Bitcoin address'),
85
+ amount_sat: z.number().int().positive().describe('Amount in satoshis'),
86
+ fee_rate: z.number().positive().optional().describe('Fee rate in sat/vbyte (default: 3)'),
87
+ }, async ({ address, amount_sat, fee_rate = 3 }) => {
88
+ await rln.sendBtc({ address, amount: amount_sat, fee_rate, skip_sync: false });
89
+ return t(JSON.stringify({ sent: true, address, amount_sat, fee_rate }, null, 2));
90
+ });
91
+ // -----------------------------------------------------------------------
92
+ registerAliases(['wdk_send_asset', 'rln_send_asset'], 'Send an RGB asset (USDT/XAUT) on-chain. Pass deposit_address.address from a KaleidoSwap RGB_INVOICE order as recipient_id.', {
93
+ asset_id: z.string().describe('RGB asset ID'),
94
+ recipient_id: z.string().describe('Recipient identifier from an RGB invoice'),
95
+ amount: z.number().positive().describe('Amount in display units (e.g. 65.5 for USDT)'),
96
+ transport_endpoints: z.array(z.string()).optional(),
97
+ fee_rate: z.number().positive().optional(),
98
+ }, async ({ asset_id, recipient_id, amount, transport_endpoints, fee_rate, }) => {
99
+ const assets = await rln.listAssets([]);
100
+ const all = [...(assets.nia ?? []), ...(assets.uda ?? []), ...(assets.cfa ?? [])];
101
+ const precision = all.find(a => a.asset_id === asset_id)?.precision ?? 0;
102
+ const rawAmount = Math.round(amount * Math.pow(10, precision));
103
+ const result = await rln.sendRgb({
104
+ donation: false,
105
+ fee_rate: fee_rate ?? 3,
106
+ min_confirmations: 1,
107
+ recipient_map: {
108
+ [asset_id]: [{
109
+ recipient_id,
110
+ assignment: toFungibleAssignment(rawAmount),
111
+ transport_endpoints: transport_endpoints ?? [],
112
+ }],
113
+ },
114
+ skip_sync: false,
115
+ });
116
+ return t(JSON.stringify({
117
+ sent: true,
118
+ asset_id,
119
+ recipient_id,
120
+ amount_display: amount,
121
+ amount_raw: rawAmount,
122
+ txid: result.txid ?? null,
123
+ }, null, 2));
124
+ });
125
+ // -----------------------------------------------------------------------
126
+ registerAliases(['wdk_list_channels', 'rln_list_channels'], 'List all RLN Lightning channels: capacity, local balance, usability, RGB asset allocation.', { usable_only: z.boolean().optional().describe('Return only usable channels (default: false)') }, async ({ usable_only = false }) => {
127
+ const res = await rln.listChannels();
128
+ const channels = usable_only ? (res.channels ?? []).filter(c => c.is_usable) : (res.channels ?? []);
129
+ const totalOut = channels.reduce((s, c) => s + (c.outbound_balance_msat ?? 0), 0);
130
+ const totalIn = channels.reduce((s, c) => s + (c.inbound_balance_msat ?? 0), 0);
131
+ return t(JSON.stringify({
132
+ channel_count: channels.length,
133
+ total_outbound_msat: totalOut,
134
+ total_inbound_msat: totalIn,
135
+ channels,
136
+ }, null, 2));
137
+ });
138
+ // -----------------------------------------------------------------------
139
+ registerAliases(['wdk_connect_peer', 'rln_connect_peer'], 'Connect the RLN node to a Lightning peer. Required before LSPS1 channel purchase. Format: pubkey@host:port.', { peer_pubkey_and_addr: z.string().describe('pubkey@host:port') }, async ({ peer_pubkey_and_addr }) => {
140
+ await rln.connectPeer({ peer_pubkey_and_addr });
141
+ return t(JSON.stringify({ success: true, connected_to: peer_pubkey_and_addr }, null, 2));
142
+ });
143
+ // -----------------------------------------------------------------------
144
+ registerAliases(['wdk_open_channel', 'rln_open_channel'], 'Open a Lightning channel from the RLN node. Optionally allocate an RGB asset to the channel.', {
145
+ peer_pubkey_and_addr: z.string().describe('pubkey@host:port'),
146
+ capacity_sat: z.number().int().positive().describe('Channel capacity in satoshis'),
147
+ push_msat: z.number().int().optional().describe('Millisatoshis to push to remote (default: 0)'),
148
+ asset_id: z.string().optional().describe('RGB asset ID to allocate'),
149
+ asset_amount: z.number().positive().optional().describe('Amount of RGB asset to allocate'),
150
+ is_public: z.boolean().optional().describe('Announce channel publicly (default: false)'),
151
+ }, async ({ peer_pubkey_and_addr, capacity_sat, push_msat, asset_id, asset_amount, is_public, }) => {
152
+ const result = await rln.openChannel({
153
+ peer_pubkey_and_opt_addr: peer_pubkey_and_addr,
154
+ capacity_sat,
155
+ push_msat: push_msat ?? 0,
156
+ asset_id,
157
+ asset_amount,
158
+ public: is_public ?? false,
159
+ with_anchors: false,
160
+ });
161
+ return t(JSON.stringify({ ...result, note: 'Use wdk_list_channels to monitor until status=Opened' }, null, 2));
162
+ });
163
+ // -----------------------------------------------------------------------
164
+ registerAliases(['wdk_close_channel', 'rln_close_channel'], 'Close a Lightning channel on the RLN node. Use force=true only for unresponsive peers. Get channel_id from wdk_list_channels.', {
165
+ channel_id: z.string().describe('Channel ID from wdk_list_channels'),
166
+ peer_pubkey: z.string().describe('Peer pubkey from wdk_list_channels'),
167
+ force: z.boolean().optional().describe('Force close (unilateral). Default: false (cooperative close)'),
168
+ }, async ({ channel_id, peer_pubkey, force = false, }) => {
169
+ await rln.closeChannel({ channel_id, peer_pubkey, force });
170
+ return t(JSON.stringify({ closed: true, channel_id, peer_pubkey, force }, null, 2));
171
+ });
172
+ // -----------------------------------------------------------------------
173
+ registerAliases(['wdk_get_channel_id', 'rln_get_channel_id'], 'Resolve a temporary_channel_id (from wdk_open_channel) to the permanent channel_id once the channel is established.', {
174
+ temporary_channel_id: z.string().describe('Temporary channel ID from wdk_open_channel'),
175
+ }, async ({ temporary_channel_id }) => t(JSON.stringify(await rln.getChannelId({ temporary_channel_id }), null, 2)));
176
+ // -----------------------------------------------------------------------
177
+ registerAliases(['wdk_list_payments', 'rln_list_payments'], 'List recent Lightning payments (sent and received) on the RLN node.', {
178
+ limit: z.number().int().positive().optional().describe('Max payments to return (default: 20)'),
179
+ inbound_only: z.boolean().optional(),
180
+ outbound_only: z.boolean().optional(),
181
+ }, async ({ limit = 20, inbound_only, outbound_only, }) => {
182
+ let payments = (await rln.listPayments()).payments ?? [];
183
+ if (inbound_only)
184
+ payments = payments.filter(p => p.inbound);
185
+ if (outbound_only)
186
+ payments = payments.filter(p => !p.inbound);
187
+ return t(JSON.stringify(payments.slice(0, limit), null, 2));
188
+ });
189
+ // -----------------------------------------------------------------------
190
+ registerAliases(['wdk_refresh_transfers', 'rln_refresh_transfers'], 'Refresh pending RGB asset transfers on the RLN node. Call after a KaleidoSwap order is FILLED to sync balances.', { skip_sync: z.boolean().optional() }, async ({ skip_sync = false }) => {
191
+ await rln.refreshTransfers({ skip_sync });
192
+ return t(JSON.stringify({ refreshed: true }, null, 2));
193
+ });
194
+ // -----------------------------------------------------------------------
195
+ registerAliases(['wdk_atomic_taker', 'rln_atomic_taker'], 'Step 2 of atomic HTLC swap: whitelist the incoming HTLC on the RLN node. Call with the swapstring from kaleidoswap_atomic_init BEFORE calling kaleidoswap_atomic_execute.', { swapstring: z.string().describe('Swapstring from kaleidoswap_atomic_init') }, async ({ swapstring }) => {
196
+ await rln.whitelistSwap({ swapstring });
197
+ return t(JSON.stringify({
198
+ success: true,
199
+ note: 'HTLC whitelisted — now call wdk_get_node_info for pubkey, then kaleidoswap_atomic_execute',
200
+ }, null, 2));
201
+ });
202
+ // -----------------------------------------------------------------------
203
+ registerAliases(['wdk_list_swaps', 'rln_list_swaps'], 'List all atomic swaps on the RLN node (maker and taker sides).', {}, async () => {
204
+ const res = await rln.listSwaps();
205
+ return t(JSON.stringify({
206
+ maker: res.maker ?? [],
207
+ taker: res.taker ?? [],
208
+ total: (res.maker?.length ?? 0) + (res.taker?.length ?? 0),
209
+ }, null, 2));
210
+ });
211
+ // -----------------------------------------------------------------------
212
+ registerAliases(['wdk_get_swap', 'rln_get_swap'], 'Get atomic swap status by payment_hash from the RLN node.', {
213
+ payment_hash: z.string().describe('Payment hash from kaleidoswap_atomic_init'),
214
+ taker: z.boolean().optional().describe('Filter for taker-side swap'),
215
+ }, async ({ payment_hash, taker }) => {
216
+ const request = { payment_hash, ...(taker !== undefined ? { taker } : {}) };
217
+ return t(JSON.stringify(await rln.getSwap(request), null, 2));
218
+ });
219
+ // -----------------------------------------------------------------------
220
+ registerAliases(['wdk_mpp_pay', 'rln_mpp_pay'], 'Pay an MPP (Machine Payments Protocol) Lightning challenge from the RLN node. Returns a credential JSON for mpp_submit_credential.', {
221
+ invoice: z.string().describe('BOLT11 invoice from mpp_request_challenge'),
222
+ challenge_id: z.string().optional().describe('MPP challenge_id'),
223
+ macaroon: z.string().optional().describe('Macaroon for L402-compatible servers'),
224
+ }, async ({ invoice, challenge_id, macaroon }) => {
225
+ const result = await rln.sendPayment({ invoice });
226
+ const preimage = result.preimage
227
+ ?? result.payment_secret;
228
+ const cred = { method: 'lightning' };
229
+ if (challenge_id)
230
+ cred.challenge_id = challenge_id;
231
+ if (preimage)
232
+ cred.preimage = preimage;
233
+ if (macaroon)
234
+ cred.macaroon = macaroon;
235
+ return t(JSON.stringify({
236
+ paid: true,
237
+ payment_hash: result.payment_hash ?? null,
238
+ preimage: preimage ?? null,
239
+ credential: JSON.stringify(cred),
240
+ note: preimage ? 'Credential ready — pass to mpp_submit_credential' : 'Payment sent but preimage not returned by node',
241
+ }, null, 2));
242
+ });
243
+ }
244
+ const t = (content) => ({ content: [{ type: 'text', text: content }] });
245
+ //# sourceMappingURL=rln-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rln-tools.js","sourceRoot":"","sources":["../../src/tools/rln-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { WdkMcpServer } from '@tetherto/wdk-mcp-toolkit';
2
+ export declare function registerSparkTools(server: WdkMcpServer, usdtToken?: string): void;