@moonpay/cli 0.5.0 → 0.5.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/dist/{chunk-AH5VMN63.js → chunk-PBRXVTTG.js} +299 -253
- package/dist/{chunk-AH5VMN63.js.map → chunk-PBRXVTTG.js.map} +1 -1
- package/dist/index.js +68 -3
- package/dist/index.js.map +1 -1
- package/dist/{mcp-VOEHXIOY.js → mcp-TDQN25MO.js} +5 -119
- package/dist/mcp-TDQN25MO.js.map +1 -0
- package/package.json +1 -1
- package/skills/moonpay-mcp/SKILL.md +4 -6
- package/skills/moonpay-missions/SKILL.md +7 -2
- package/skills/moonpay-swap-tokens/SKILL.md +33 -10
- package/dist/mcp-VOEHXIOY.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
bitcoinBalanceRetrieve,
|
|
5
|
+
callRemoteTool,
|
|
5
6
|
callTool,
|
|
6
7
|
clearCredentials,
|
|
7
8
|
createTool,
|
|
@@ -11,6 +12,7 @@ import {
|
|
|
11
12
|
messageSign,
|
|
12
13
|
resolveBaseUrl,
|
|
13
14
|
schemas_default,
|
|
15
|
+
tokenBridge,
|
|
14
16
|
tokenSwap,
|
|
15
17
|
transactionSign,
|
|
16
18
|
virtualAccountWalletRegister,
|
|
@@ -18,9 +20,12 @@ import {
|
|
|
18
20
|
walletDelete,
|
|
19
21
|
walletImport,
|
|
20
22
|
walletList,
|
|
21
|
-
walletRetrieve
|
|
22
|
-
|
|
23
|
+
walletRetrieve,
|
|
24
|
+
x402Request
|
|
25
|
+
} from "./chunk-PBRXVTTG.js";
|
|
23
26
|
import {
|
|
27
|
+
KEY_CHAIN_MAP,
|
|
28
|
+
chainSchema,
|
|
24
29
|
findWalletOrThrow
|
|
25
30
|
} from "./chunk-V7MA7WNX.js";
|
|
26
31
|
|
|
@@ -319,6 +324,62 @@ var skillInstall = createTool(skillInstallSchema, async (params) => {
|
|
|
319
324
|
return installSkills(params.force, params.dir ?? void 0);
|
|
320
325
|
});
|
|
321
326
|
|
|
327
|
+
// src/tools/token/transfer/schema.ts
|
|
328
|
+
import { z as z5 } from "zod";
|
|
329
|
+
var tokenTransferSchema = defineToolSchema({
|
|
330
|
+
name: "token_transfer",
|
|
331
|
+
description: "Transfer tokens to another wallet on the same chain. Builds, signs locally, and broadcasts.",
|
|
332
|
+
input: z5.object({
|
|
333
|
+
wallet: z5.string().describe("Local wallet name to sign with"),
|
|
334
|
+
chain: chainSchema.describe("Chain to transfer on"),
|
|
335
|
+
token: z5.string().describe("Token address to transfer"),
|
|
336
|
+
amount: z5.coerce.number().describe("Amount to transfer"),
|
|
337
|
+
to: z5.string().describe("Recipient wallet name or address")
|
|
338
|
+
}),
|
|
339
|
+
output: z5.object({
|
|
340
|
+
signature: z5.string().describe("Transaction hash/signature"),
|
|
341
|
+
message: z5.string().describe("Human-readable transfer description")
|
|
342
|
+
})
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
// src/tools/token/transfer/tool.ts
|
|
346
|
+
var tokenTransfer = createTool(tokenTransferSchema, async (params) => {
|
|
347
|
+
const baseUrl = resolveBaseUrl();
|
|
348
|
+
const wallet = await walletRetrieve.handler({ wallet: params.wallet });
|
|
349
|
+
const fromAddress = wallet.addresses[KEY_CHAIN_MAP[params.chain]];
|
|
350
|
+
if (!fromAddress) {
|
|
351
|
+
throw new Error(`Wallet "${wallet.name}" has no address on ${params.chain}.`);
|
|
352
|
+
}
|
|
353
|
+
let toAddress = params.to;
|
|
354
|
+
try {
|
|
355
|
+
const toWallet = await walletRetrieve.handler({ wallet: params.to });
|
|
356
|
+
toAddress = toWallet.addresses[KEY_CHAIN_MAP[params.chain]] ?? params.to;
|
|
357
|
+
} catch {
|
|
358
|
+
}
|
|
359
|
+
const buildResult = await callRemoteTool(baseUrl, "token_transfer", {
|
|
360
|
+
wallet: fromAddress,
|
|
361
|
+
token: params.token,
|
|
362
|
+
to: toAddress,
|
|
363
|
+
amount: params.amount,
|
|
364
|
+
chain: params.chain
|
|
365
|
+
});
|
|
366
|
+
const txPayload = buildResult.transaction.type === "solana" ? buildResult.transaction.base64 : JSON.stringify(buildResult.transaction);
|
|
367
|
+
const { transaction: signedTransaction } = await transactionSign.handler({
|
|
368
|
+
wallet: wallet.name,
|
|
369
|
+
chain: params.chain,
|
|
370
|
+
transaction: txPayload
|
|
371
|
+
});
|
|
372
|
+
const sendResult = await callRemoteTool(baseUrl, "transaction_send", {
|
|
373
|
+
transaction: signedTransaction,
|
|
374
|
+
message: buildResult.message,
|
|
375
|
+
chain: params.chain
|
|
376
|
+
});
|
|
377
|
+
if (!sendResult.signature) {
|
|
378
|
+
throw new Error(`Transaction send failed: ${sendResult.message}`);
|
|
379
|
+
}
|
|
380
|
+
return { signature: sendResult.signature, message: buildResult.message };
|
|
381
|
+
});
|
|
382
|
+
|
|
322
383
|
// src/index.ts
|
|
323
384
|
var LOCAL_TOOLS = [
|
|
324
385
|
walletCreate,
|
|
@@ -334,6 +395,9 @@ var LOCAL_TOOLS = [
|
|
|
334
395
|
skillRetrieve,
|
|
335
396
|
skillInstall,
|
|
336
397
|
tokenSwap,
|
|
398
|
+
tokenBridge,
|
|
399
|
+
tokenTransfer,
|
|
400
|
+
x402Request,
|
|
337
401
|
virtualAccountWalletRegister
|
|
338
402
|
];
|
|
339
403
|
var require2 = createRequire(import.meta.url);
|
|
@@ -372,7 +436,7 @@ program.command("logout").description("Log out and clear stored credentials").ac
|
|
|
372
436
|
console.log("Logged out.");
|
|
373
437
|
});
|
|
374
438
|
program.command("mcp").description("Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)").action(async () => {
|
|
375
|
-
const { startMcpServer } = await import("./mcp-
|
|
439
|
+
const { startMcpServer } = await import("./mcp-TDQN25MO.js");
|
|
376
440
|
await startMcpServer();
|
|
377
441
|
});
|
|
378
442
|
function getOrCreateGroup(parent, segments) {
|
|
@@ -494,6 +558,7 @@ function isNumberProperty(prop) {
|
|
|
494
558
|
}
|
|
495
559
|
var HIDDEN_TOOLS = /* @__PURE__ */ new Set([
|
|
496
560
|
"swaps_transaction_build",
|
|
561
|
+
"token_transfer",
|
|
497
562
|
"transaction_register"
|
|
498
563
|
]);
|
|
499
564
|
function registerRemoteTools(parent, remoteSchemas) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/format.ts","../src/version-check.ts","../src/tools/wallet/export/schema.ts","../src/tools/wallet/export/tool.ts","../src/tools/skill/server.ts","../src/tools/skill/list/schema.ts","../src/tools/skill/list/tool.ts","../src/tools/skill/retrieve/schema.ts","../src/tools/skill/retrieve/tool.ts","../src/tools/skill/install/schema.ts","../src/tools/skill/install/tool.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"module\";\nimport { Command } from \"commander\";\nimport {\n clearCredentials,\n getConfigOrDefault,\n login,\n resolveBaseUrl,\n} from \"./auth\";\nimport { callTool } from \"./client\";\nimport { color, formatOutput, type OutputFormat } from \"./format\";\nimport { startVersionCheck } from \"./version-check\";\nimport type { Tool } from \"./tools/shared\";\nimport schemas from \"./generated/schemas.json\";\nimport { walletCreate } from \"./tools/wallet/create/tool\";\nimport { walletImport } from \"./tools/wallet/import/tool\";\nimport { walletList } from \"./tools/wallet/list/tool\";\nimport { walletRetrieve } from \"./tools/wallet/retrieve/tool\";\nimport { walletDelete } from \"./tools/wallet/delete/tool\";\nimport { walletExport } from \"./tools/wallet/export/tool\";\nimport { transactionSign } from \"./tools/transaction/sign/tool\";\nimport { messageSign } from \"./tools/message/sign/tool\";\nimport { bitcoinBalanceRetrieve } from \"./tools/bitcoin/balance/tool\";\nimport { skillList } from \"./tools/skill/list/tool\";\nimport { skillRetrieve } from \"./tools/skill/retrieve/tool\";\nimport { skillInstall } from \"./tools/skill/install/tool\";\nimport { tokenSwap } from \"./tools/token/swap/tool\";\nimport { virtualAccountWalletRegister } from \"./tools/virtual-account/wallet/register/tool\";\n/** All local tools — CLI commands are derived from their schemas */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst LOCAL_TOOLS: Tool<any>[] = [\n walletCreate,\n walletImport,\n walletList,\n walletRetrieve,\n walletDelete,\n walletExport,\n transactionSign,\n messageSign,\n bitcoinBalanceRetrieve,\n skillList,\n skillRetrieve,\n skillInstall,\n tokenSwap,\n virtualAccountWalletRegister,\n];\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst getUpdateNotice = startVersionCheck(version);\n\nconst program = new Command();\n\nprogram\n .name(\"moonpay\")\n .description(\n \"MoonPay CLI — non-custodial crypto tools\\n\\n\" +\n \" Run `mp skill install` to install AI skills for Claude Code.\\n\\n\" +\n \" Terms of Service: https://agents.moonpay.com/terms-of-service\\n\" +\n \" Privacy Policy: https://agents.moonpay.com/privacy-policy\\n\" +\n \" Swaps by: https://swaps.xyz/terms\",\n )\n .version(version)\n .option(\"-f, --format <type>\", \"Output format: json, compact, or table\", \"json\");\n\nfunction getFormat(): OutputFormat {\n const fmt = program.opts().format as string;\n if (fmt === \"json\" || fmt === \"compact\" || fmt === \"table\") return fmt;\n return \"json\";\n}\n\nfunction printResult(result: unknown): void {\n console.log(formatOutput(result, getFormat()));\n}\n\nfunction printUpdateNotice(): void {\n const notice = getUpdateNotice();\n if (notice) process.stderr.write(notice);\n}\n\n// ── Auth commands ──────────────────────────────────────────────\n\nprogram\n .command(\"login\")\n .description(\n \"Log in to MoonPay via OAuth.\\n\\n\" +\n \" Interactive: mp login Opens browser, paste code when prompted\\n\" +\n \" Headless: mp login --no-browser Prints auth URL, then exit\\n\" +\n \" mp login --code <code> Complete login with the code from the callback page\\n\" +\n \" Agent/LLM: Run --no-browser, open the URL for the user, then run --code with their response\"\n )\n .option(\"--no-browser\", \"Print the auth URL and exit (for VPS, SSH, or agent use)\")\n .option(\"--code <code>\", \"Complete login with a code from the callback page\")\n .action(async (opts: { browser: boolean; code?: string }) => {\n const config = getConfigOrDefault();\n try {\n await login(config, { noBrowser: !opts.browser, code: opts.code });\n console.log(\"Logged in successfully.\");\n } catch (error) {\n console.error(\"Login failed:\", (error as Error).message);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and clear stored credentials\")\n .action(() => {\n clearCredentials();\n console.log(\"Logged out.\");\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)\")\n .action(async () => {\n const { startMcpServer } = await import(\"./mcp\");\n await startMcpServer();\n });\n\n// ── Nested command helpers ─────────────────────────────────────\n\n/**\n * Get or create nested command groups from name segments.\n * e.g. [\"token\", \"swap\"] → program > token > swap\n */\nfunction getOrCreateGroup(parent: Command, segments: string[]): Command {\n let current = parent;\n for (const segment of segments) {\n let existing = current.commands.find((c) => c.name() === segment);\n if (!existing) {\n existing = current.command(segment);\n }\n current = existing;\n }\n return current;\n}\n\n// ── Schema flattening ────────────────────────────────────────────\n\ntype FlatField = {\n flatKey: string;\n field: any;\n path: string[];\n};\n\n/**\n * Walk a Zod object shape and flatten nested ZodObjects into\n * hyphenated keys: { from: { wallet, chain } } → from-wallet, from-chain\n */\nfunction flattenShape(shape: Record<string, any>, prefix = \"\"): FlatField[] {\n const fields: FlatField[] = [];\n for (const [key, field] of Object.entries(shape)) {\n const flatKey = prefix ? `${prefix}-${key}` : key;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n\n // Unwrap nullable to check if inner is an object\n let unwrapped = inner;\n if (unwrapped._def.typeName === \"ZodNullable\") unwrapped = unwrapped._def.innerType;\n\n if (unwrapped._def.typeName === \"ZodObject\" && unwrapped.shape) {\n fields.push(...flattenShape(unwrapped.shape, flatKey));\n } else {\n fields.push({ flatKey, field, path: flatKey.split(\"-\") });\n }\n }\n return fields;\n}\n\n/**\n * Reconstruct nested object from flat hyphenated params.\n * { \"from-wallet\": \"test\", \"from-chain\": \"solana\" } → { from: { wallet: \"test\", chain: \"solana\" } }\n */\nfunction unflattenParams(\n flat: Record<string, unknown>,\n fields: FlatField[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const { flatKey, path } of fields) {\n // Commander camelCases --from-wallet → fromWallet, so check both\n const camelKey = flatKey.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const value = camelKey in flat ? flat[camelKey] : flat[flatKey];\n\n if (path.length === 1) {\n result[path[0]] = value;\n } else {\n let obj = result;\n for (let i = 0; i < path.length - 1; i++) {\n if (!obj[path[i]] || typeof obj[path[i]] !== \"object\") {\n obj[path[i]] = {};\n }\n obj = obj[path[i]] as Record<string, unknown>;\n }\n obj[path[path.length - 1]] = value;\n }\n }\n\n return result;\n}\n\n// ── Local tool registration ────────────────────────────────────\n\nfunction registerLocalTools(parent: Command, tools: Tool<any>[]): void {\n for (const tool of tools) {\n const segments = tool.schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n const cmd = group.command(leafName).description(tool.schema.description);\n\n const shape = (tool.schema.input as any).shape ?? {};\n const flatFields = flattenShape(shape);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n\n for (const { flatKey, field } of flatFields) {\n const desc = field.description ?? flatKey;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n const typeName = inner._def.typeName;\n\n let checkNum = inner;\n if (checkNum._def.typeName === \"ZodNullable\") checkNum = checkNum._def.innerType;\n if (checkNum._def.typeName === \"ZodNumber\") numberKeys.push(flatKey);\n\n if (typeName === \"ZodBoolean\") {\n cmd.option(`--${flatKey}`, desc, false);\n } else if (typeName === \"ZodNullable\") {\n cmd.option(`--${flatKey} <${flatKey}>`, desc);\n nullableKeys.push(flatKey);\n } else {\n cmd.requiredOption(`--${flatKey} <${flatKey}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n // Coerce types on the flat keys (commander camelCases them)\n for (const key of nullableKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] === undefined) options[camelKey] = null;\n }\n for (const key of numberKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] != null && typeof options[camelKey] === \"string\") {\n options[camelKey] = Number(options[camelKey]);\n }\n }\n\n const params = unflattenParams(options, flatFields);\n\n try {\n const result = await tool.handler(params);\n printResult(result);\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Remote tool registration ───────────────────────────────────\n\ninterface JsonSchemaProperty {\n type?: string | string[];\n description?: string;\n enum?: string[];\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n anyOf?: { type: string }[];\n}\n\ninterface JsonSchema {\n $ref?: string;\n definitions?: Record<string, JsonSchemaProperty>;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n}\n\nfunction resolveJsonSchema(inputSchema: JsonSchema): JsonSchemaProperty {\n if (inputSchema.$ref && inputSchema.definitions) {\n const defName = inputSchema.$ref.replace(\"#/definitions/\", \"\");\n return inputSchema.definitions[defName];\n }\n return inputSchema;\n}\n\nfunction isNullableProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"null\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"null\");\n return false;\n}\n\nfunction isObjectProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"object\");\n return prop.type === \"object\";\n}\n\nfunction isNumberProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.some((t) => t === \"number\" || t === \"integer\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"number\" || t.type === \"integer\");\n return prop.type === \"number\" || prop.type === \"integer\";\n}\n\nconst HIDDEN_TOOLS = new Set([\n \"swaps_transaction_build\",\n \"transaction_register\",\n]);\n\nfunction registerRemoteTools(\n parent: Command,\n remoteSchemas: { name: string; description: string; inputSchema: JsonSchema }[],\n): void {\n for (const schema of remoteSchemas) {\n if (HIDDEN_TOOLS.has(schema.name)) continue;\n const segments = schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n // Skip if a local tool already registered this command\n if (group.commands.find((c) => c.name() === leafName)) continue;\n\n const cmd = group.command(leafName).description(schema.description);\n\n const resolved = resolveJsonSchema(schema.inputSchema);\n const props = resolved.properties ?? {};\n const requiredSet = new Set(resolved.required ?? []);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n const objectKeys: string[] = [];\n\n for (const [key, prop] of Object.entries(props)) {\n const desc = prop.description ?? key;\n const nullable = isNullableProperty(prop);\n const isObj = isObjectProperty(prop);\n const isNum = isNumberProperty(prop);\n\n if (isNum) numberKeys.push(key);\n\n if (isObj) {\n objectKeys.push(key);\n if (requiredSet.has(key) && !nullable) {\n cmd.requiredOption(`--${key} <json>`, `${desc} (as JSON)`);\n } else {\n cmd.option(`--${key} <json>`, `${desc} (as JSON)`);\n nullableKeys.push(key);\n }\n } else if (nullable || !requiredSet.has(key)) {\n cmd.option(`--${key} <${key}>`, desc);\n nullableKeys.push(key);\n } else {\n cmd.requiredOption(`--${key} <${key}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n // Coerce types\n for (const key of nullableKeys) {\n if (options[key] === undefined) options[key] = null;\n }\n for (const key of numberKeys) {\n if (options[key] != null && typeof options[key] === \"string\") {\n options[key] = Number(options[key]);\n }\n }\n for (const key of objectKeys) {\n if (typeof options[key] === \"string\") {\n try {\n options[key] = JSON.parse(options[key] as string);\n } catch {\n console.error(`Invalid JSON for --${key}`);\n process.exit(1);\n }\n }\n }\n\n try {\n const baseUrl = resolveBaseUrl();\n const result = await callTool(baseUrl, schema.name, options as Record<string, unknown>);\n printResult(result);\n printUpdateNotice();\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Register all tools ─────────────────────────────────────────\n\nregisterLocalTools(program, LOCAL_TOOLS);\nregisterRemoteTools(program, schemas as any);\n\n\n// ── Tools listing ──────────────────────────────────────────────\n\nprogram\n .command(\"tools\")\n .description(\"List available tools\")\n .action(() => {\n const allTools = [\n ...LOCAL_TOOLS.map((t) => ({\n name: t.schema.name,\n description: t.schema.description,\n })),\n ...schemas\n .filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name) && !HIDDEN_TOOLS.has(s.name))\n .map((s) => ({ name: s.name, description: s.description })),\n ].sort((a, b) => a.name.localeCompare(b.name));\n\n const lines: string[] = [];\n for (const tool of allTools) {\n const cmdName = tool.name.replace(/_/g, \" \");\n lines.push(` ${color.green(cmdName.padEnd(28))} ${color.dim(tool.description)}`);\n }\n lines.push(\"\");\n lines.push(color.dim(`${allTools.length} tools`));\n console.log(lines.join(\"\\n\"));\n printUpdateNotice();\n });\n\nprogram.parse();\n","const useColor =\n !process.env.NO_COLOR && process.stdout.isTTY === true;\n\nfunction ansi(code: string) {\n return (text: string) => (useColor ? `${code}${text}\\x1b[0m` : text);\n}\n\nexport const color = {\n bold: ansi(\"\\x1b[1m\"),\n dim: ansi(\"\\x1b[2m\"),\n green: ansi(\"\\x1b[32m\"),\n yellow: ansi(\"\\x1b[33m\"),\n cyan: ansi(\"\\x1b[36m\"),\n red: ansi(\"\\x1b[31m\"),\n};\n\nconst MAX_COL_WIDTH = 40;\n\nfunction truncate(str: string, max: number): string {\n return str.length > max ? str.slice(0, max - 1) + \"…\" : str;\n}\n\nfunction renderArrayTable(rows: Record<string, unknown>[]): string {\n if (rows.length === 0) return \"\";\n\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) => k.length);\n\n const stringRows = rows.map((row) =>\n keys.map((k, i) => {\n const val = truncate(String(row[k] ?? \"\"), MAX_COL_WIDTH);\n widths[i] = Math.max(widths[i], val.length);\n return val;\n }),\n );\n\n // Cap widths\n for (let i = 0; i < widths.length; i++) {\n widths[i] = Math.min(widths[i], MAX_COL_WIDTH);\n }\n\n const header = keys.map((k, i) => color.bold(k.padEnd(widths[i]))).join(\" \");\n const separator = color.dim(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n const body = stringRows\n .map((row) => row.map((val, i) => val.padEnd(widths[i])).join(\" \"))\n .join(\"\\n\");\n\n return `${header}\\n${separator}\\n${body}`;\n}\n\nfunction renderObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n const maxKey = Math.min(\n MAX_COL_WIDTH,\n Math.max(...entries.map(([k]) => k.length)),\n );\n\n return entries\n .map(([k, v]) => `${color.bold(k.padEnd(maxKey))} ${String(v ?? \"\")}`)\n .join(\"\\n\");\n}\n\nexport function renderTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return color.dim(\"(empty)\");\n if (typeof data[0] === \"object\" && data[0] !== null) {\n return renderArrayTable(data as Record<string, unknown>[]);\n }\n return data.map(String).join(\"\\n\");\n }\n\n if (typeof data === \"object\" && data !== null) {\n return renderObjectTable(data as Record<string, unknown>);\n }\n\n return String(data);\n}\n\nexport type OutputFormat = \"json\" | \"compact\" | \"table\";\n\nexport function formatOutput(result: unknown, format: OutputFormat): string {\n if (format === \"compact\") {\n return JSON.stringify(result);\n }\n\n if (format === \"table\") {\n const value =\n typeof result === \"object\" &&\n result !== null &&\n \"data\" in result\n ? (result as Record<string, unknown>).data\n : result;\n return renderTable(value);\n }\n\n return JSON.stringify(result, null, 2);\n}\n","import { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { color } from \"./format\";\n\nconst CACHE_DIR = join(homedir(), \".config\", \"moonpay\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 3000;\n\ntype CacheData = {\n latest: string;\n checkedAt: number;\n};\n\nfunction readCache(): CacheData | null {\n try {\n const raw = readFileSync(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw) as CacheData;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(data: CacheData): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(data));\n } catch {\n // Ignore write errors\n }\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const a = latest.split(\".\").map(Number);\n const b = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((a[i] ?? 0) > (b[i] ?? 0)) return true;\n if ((a[i] ?? 0) < (b[i] ?? 0)) return false;\n }\n return false;\n}\n\nfunction formatNotice(current: string, latest: string): string {\n return [\n \"\",\n color.yellow(`Update available: ${current} → ${latest}`),\n color.dim(\"Run `npm i -g @moonpay/cli` to update.\"),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function startVersionCheck(\n currentVersion: string,\n): () => string | null {\n let notice: string | null = null;\n\n const cache = readCache();\n\n if (cache && Date.now() - cache.checkedAt < ONE_DAY_MS) {\n if (isNewer(cache.latest, currentVersion)) {\n notice = formatNotice(currentVersion, cache.latest);\n }\n return () => notice;\n }\n\n // Fire async fetch — non-blocking\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n fetch(\"https://registry.npmjs.org/@moonpay%2fcli/latest\", {\n signal: controller.signal,\n })\n .then((res) => res.json())\n .then((data: unknown) => {\n const latest = (data as { version?: string }).version;\n if (latest) {\n writeCache({ latest, checkedAt: Date.now() });\n if (isNewer(latest, currentVersion)) {\n notice = formatNotice(currentVersion, latest);\n }\n }\n })\n .catch(() => {\n // Silently ignore fetch errors\n })\n .finally(() => clearTimeout(timeout));\n\n return () => notice;\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletExportSchema = defineToolSchema({\n name: \"wallet_export\",\n description:\n \"Export wallet secret (mnemonic or private key). Interactive only — cannot be run by agents or piped.\",\n input: z.object({\n wallet: z.string().describe(\"Wallet name\"),\n }),\n output: z.object({\n exported: z.literal(true),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { findWalletOrThrow } from \"../store\";\nimport { walletExportSchema } from \"./schema\";\n\nexport const walletExport = createTool(walletExportSchema, async (params) => {\n if (!process.stdout.isTTY) {\n throw new Error(\n \"Wallet export requires an interactive terminal.\\n\" +\n \"Run this command directly in your terminal: mp wallet export \" + params.wallet,\n );\n }\n\n const wallet = findWalletOrThrow(params.wallet);\n\n if (wallet.type === \"hd\") {\n process.stderr.write(`\\nMnemonic for \"${wallet.name}\":\\n\\n`);\n process.stderr.write(` ${wallet.mnemonic}\\n\\n`);\n process.stderr.write(\"Write this down and store it securely.\\n\\n\");\n } else {\n process.stderr.write(`\\nPrivate key for \"${wallet.name}\" (${wallet.chain}):\\n\\n`);\n process.stderr.write(` ${wallet.privateKey}\\n\\n`);\n }\n\n return { exported: true as const };\n});\n","import { readdirSync, readFileSync, existsSync, mkdirSync, cpSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\n\n/** Package root → skills/ directory bundled with the CLI */\nfunction getSkillsDir(): string {\n // import.meta.url resolves to dist/index.js when bundled\n const __filename = fileURLToPath(import.meta.url);\n const distDir = dirname(__filename);\n // dist/ → package root → skills/\n return join(distDir, \"..\", \"skills\");\n}\n\n/** Where Claude Code discovers skills */\nfunction getClaudeSkillsDir(): string {\n return join(homedir(), \".claude\", \"skills\");\n}\n\nexport type SkillInfo = {\n name: string;\n description: string;\n};\n\nexport function listBundledSkills(): SkillInfo[] {\n const dir = getSkillsDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.startsWith(\"moonpay-\"))\n .map((e) => {\n const md = readFileSync(join(dir, e.name, \"SKILL.md\"), \"utf-8\");\n const descMatch = md.match(/^description:\\s*(.+)$/m);\n return {\n name: e.name,\n description: descMatch?.[1]?.replace(/^[\"']|[\"']$/g, \"\") ?? \"\",\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function readSkill(name: string): string {\n if (/[/\\\\]|\\.\\./.test(name)) throw new Error(`Invalid skill name: \"${name}\"`);\n const skillPath = join(getSkillsDir(), name, \"SKILL.md\");\n if (!existsSync(skillPath)) {\n throw new Error(`Skill \"${name}\" not found. Run \\`mp skill list\\` to see available skills.`);\n }\n return readFileSync(skillPath, \"utf-8\");\n}\n\nexport function installSkills(force: boolean, dir?: string): { name: string; installed: boolean }[] {\n const srcDir = getSkillsDir();\n const destDir = dir ?? getClaudeSkillsDir();\n const skills = listBundledSkills();\n\n mkdirSync(destDir, { recursive: true });\n\n return skills.map((s) => {\n const dest = join(destDir, s.name);\n if (existsSync(dest) && !force) {\n return { name: s.name, installed: false };\n }\n cpSync(join(srcDir, s.name), dest, { recursive: true, force: true });\n return { name: s.name, installed: true };\n });\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillListSchema = defineToolSchema({\n name: \"skill_list\",\n description: \"List available AI skills for Claude Code and other agents\",\n input: z.object({}),\n output: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { listBundledSkills } from \"../server\";\nimport { skillListSchema } from \"./schema\";\n\nexport const skillList = createTool(skillListSchema, async () => {\n return listBundledSkills();\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillRetrieveSchema = defineToolSchema({\n name: \"skill_retrieve\",\n description: \"Get the full instructions for a specific skill\",\n input: z.object({\n name: z.string().describe(\"Skill name (e.g. moonpay-swap-tokens)\"),\n }),\n output: z.object({\n name: z.string(),\n content: z.string(),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { readSkill } from \"../server\";\nimport { skillRetrieveSchema } from \"./schema\";\n\nexport const skillRetrieve = createTool(skillRetrieveSchema, async (params) => {\n return {\n name: params.name,\n content: readSkill(params.name),\n };\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillInstallSchema = defineToolSchema({\n name: \"skill_install\",\n description:\n \"Install AI skills for Claude Code. Defaults to ~/.claude/skills/, or specify --dir for a custom location (e.g. project-local, ~/.agents/skills).\",\n input: z.object({\n force: z.boolean().describe(\"Overwrite existing skills\"),\n dir: z\n .string()\n .nullable()\n .describe(\n \"Target directory to install skills into (default: ~/.claude/skills/)\",\n ),\n }),\n output: z.array(\n z.object({\n name: z.string(),\n installed: z.boolean(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { installSkills } from \"../server\";\nimport { skillInstallSchema } from \"./schema\";\n\nexport const skillInstall = createTool(skillInstallSchema, async (params) => {\n return installSkills(params.force, params.dir ?? undefined);\n});\n"],"mappings":"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","names":["readFileSync","mkdirSync","join","homedir","z","z","z","z","z","z","require"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/format.ts","../src/version-check.ts","../src/tools/wallet/export/schema.ts","../src/tools/wallet/export/tool.ts","../src/tools/skill/server.ts","../src/tools/skill/list/schema.ts","../src/tools/skill/list/tool.ts","../src/tools/skill/retrieve/schema.ts","../src/tools/skill/retrieve/tool.ts","../src/tools/skill/install/schema.ts","../src/tools/skill/install/tool.ts","../src/tools/token/transfer/schema.ts","../src/tools/token/transfer/tool.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"module\";\nimport { Command } from \"commander\";\nimport {\n clearCredentials,\n getConfigOrDefault,\n login,\n resolveBaseUrl,\n} from \"./auth\";\nimport { callTool } from \"./client\";\nimport { color, formatOutput, type OutputFormat } from \"./format\";\nimport { startVersionCheck } from \"./version-check\";\nimport type { Tool } from \"./tools/shared\";\nimport schemas from \"./generated/schemas.json\";\nimport { walletCreate } from \"./tools/wallet/create/tool\";\nimport { walletImport } from \"./tools/wallet/import/tool\";\nimport { walletList } from \"./tools/wallet/list/tool\";\nimport { walletRetrieve } from \"./tools/wallet/retrieve/tool\";\nimport { walletDelete } from \"./tools/wallet/delete/tool\";\nimport { walletExport } from \"./tools/wallet/export/tool\";\nimport { transactionSign } from \"./tools/transaction/sign/tool\";\nimport { messageSign } from \"./tools/message/sign/tool\";\nimport { bitcoinBalanceRetrieve } from \"./tools/bitcoin/balance/tool\";\nimport { skillList } from \"./tools/skill/list/tool\";\nimport { skillRetrieve } from \"./tools/skill/retrieve/tool\";\nimport { skillInstall } from \"./tools/skill/install/tool\";\nimport { tokenSwap, tokenBridge } from \"./tools/token/swap/tool\";\nimport { tokenTransfer } from \"./tools/token/transfer/tool\";\nimport { x402Request } from \"./tools/x402/request/tool\";\nimport { virtualAccountWalletRegister } from \"./tools/virtual-account/wallet/register/tool\";\n/** All local tools — CLI commands are derived from their schemas */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst LOCAL_TOOLS: Tool<any>[] = [\n walletCreate,\n walletImport,\n walletList,\n walletRetrieve,\n walletDelete,\n walletExport,\n transactionSign,\n messageSign,\n bitcoinBalanceRetrieve,\n skillList,\n skillRetrieve,\n skillInstall,\n tokenSwap,\n tokenBridge,\n tokenTransfer,\n x402Request,\n virtualAccountWalletRegister,\n];\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst getUpdateNotice = startVersionCheck(version);\n\nconst program = new Command();\n\nprogram\n .name(\"moonpay\")\n .description(\n \"MoonPay CLI — non-custodial crypto tools\\n\\n\" +\n \" Run `mp skill install` to install AI skills for Claude Code.\\n\\n\" +\n \" Terms of Service: https://agents.moonpay.com/terms-of-service\\n\" +\n \" Privacy Policy: https://agents.moonpay.com/privacy-policy\\n\" +\n \" Swaps by: https://swaps.xyz/terms\",\n )\n .version(version)\n .option(\"-f, --format <type>\", \"Output format: json, compact, or table\", \"json\");\n\nfunction getFormat(): OutputFormat {\n const fmt = program.opts().format as string;\n if (fmt === \"json\" || fmt === \"compact\" || fmt === \"table\") return fmt;\n return \"json\";\n}\n\nfunction printResult(result: unknown): void {\n console.log(formatOutput(result, getFormat()));\n}\n\nfunction printUpdateNotice(): void {\n const notice = getUpdateNotice();\n if (notice) process.stderr.write(notice);\n}\n\n// ── Auth commands ──────────────────────────────────────────────\n\nprogram\n .command(\"login\")\n .description(\n \"Log in to MoonPay via OAuth.\\n\\n\" +\n \" Interactive: mp login Opens browser, paste code when prompted\\n\" +\n \" Headless: mp login --no-browser Prints auth URL, then exit\\n\" +\n \" mp login --code <code> Complete login with the code from the callback page\\n\" +\n \" Agent/LLM: Run --no-browser, open the URL for the user, then run --code with their response\"\n )\n .option(\"--no-browser\", \"Print the auth URL and exit (for VPS, SSH, or agent use)\")\n .option(\"--code <code>\", \"Complete login with a code from the callback page\")\n .action(async (opts: { browser: boolean; code?: string }) => {\n const config = getConfigOrDefault();\n try {\n await login(config, { noBrowser: !opts.browser, code: opts.code });\n console.log(\"Logged in successfully.\");\n } catch (error) {\n console.error(\"Login failed:\", (error as Error).message);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and clear stored credentials\")\n .action(() => {\n clearCredentials();\n console.log(\"Logged out.\");\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)\")\n .action(async () => {\n const { startMcpServer } = await import(\"./mcp\");\n await startMcpServer();\n });\n\n// ── Nested command helpers ─────────────────────────────────────\n\n/**\n * Get or create nested command groups from name segments.\n * e.g. [\"token\", \"swap\"] → program > token > swap\n */\nfunction getOrCreateGroup(parent: Command, segments: string[]): Command {\n let current = parent;\n for (const segment of segments) {\n let existing = current.commands.find((c) => c.name() === segment);\n if (!existing) {\n existing = current.command(segment);\n }\n current = existing;\n }\n return current;\n}\n\n// ── Schema flattening ────────────────────────────────────────────\n\ntype FlatField = {\n flatKey: string;\n field: any;\n path: string[];\n};\n\n/**\n * Walk a Zod object shape and flatten nested ZodObjects into\n * hyphenated keys: { from: { wallet, chain } } → from-wallet, from-chain\n */\nfunction flattenShape(shape: Record<string, any>, prefix = \"\"): FlatField[] {\n const fields: FlatField[] = [];\n for (const [key, field] of Object.entries(shape)) {\n const flatKey = prefix ? `${prefix}-${key}` : key;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n\n // Unwrap nullable to check if inner is an object\n let unwrapped = inner;\n if (unwrapped._def.typeName === \"ZodNullable\") unwrapped = unwrapped._def.innerType;\n\n if (unwrapped._def.typeName === \"ZodObject\" && unwrapped.shape) {\n fields.push(...flattenShape(unwrapped.shape, flatKey));\n } else {\n fields.push({ flatKey, field, path: flatKey.split(\"-\") });\n }\n }\n return fields;\n}\n\n/**\n * Reconstruct nested object from flat hyphenated params.\n * { \"from-wallet\": \"test\", \"from-chain\": \"solana\" } → { from: { wallet: \"test\", chain: \"solana\" } }\n */\nfunction unflattenParams(\n flat: Record<string, unknown>,\n fields: FlatField[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const { flatKey, path } of fields) {\n // Commander camelCases --from-wallet → fromWallet, so check both\n const camelKey = flatKey.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const value = camelKey in flat ? flat[camelKey] : flat[flatKey];\n\n if (path.length === 1) {\n result[path[0]] = value;\n } else {\n let obj = result;\n for (let i = 0; i < path.length - 1; i++) {\n if (!obj[path[i]] || typeof obj[path[i]] !== \"object\") {\n obj[path[i]] = {};\n }\n obj = obj[path[i]] as Record<string, unknown>;\n }\n obj[path[path.length - 1]] = value;\n }\n }\n\n return result;\n}\n\n// ── Local tool registration ────────────────────────────────────\n\nfunction registerLocalTools(parent: Command, tools: Tool<any>[]): void {\n for (const tool of tools) {\n const segments = tool.schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n const cmd = group.command(leafName).description(tool.schema.description);\n\n const shape = (tool.schema.input as any).shape ?? {};\n const flatFields = flattenShape(shape);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n\n for (const { flatKey, field } of flatFields) {\n const desc = field.description ?? flatKey;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n const typeName = inner._def.typeName;\n\n let checkNum = inner;\n if (checkNum._def.typeName === \"ZodNullable\") checkNum = checkNum._def.innerType;\n if (checkNum._def.typeName === \"ZodNumber\") numberKeys.push(flatKey);\n\n if (typeName === \"ZodBoolean\") {\n cmd.option(`--${flatKey}`, desc, false);\n } else if (typeName === \"ZodNullable\") {\n cmd.option(`--${flatKey} <${flatKey}>`, desc);\n nullableKeys.push(flatKey);\n } else {\n cmd.requiredOption(`--${flatKey} <${flatKey}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n // Coerce types on the flat keys (commander camelCases them)\n for (const key of nullableKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] === undefined) options[camelKey] = null;\n }\n for (const key of numberKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] != null && typeof options[camelKey] === \"string\") {\n options[camelKey] = Number(options[camelKey]);\n }\n }\n\n const params = unflattenParams(options, flatFields);\n\n try {\n const result = await tool.handler(params);\n printResult(result);\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Remote tool registration ───────────────────────────────────\n\ninterface JsonSchemaProperty {\n type?: string | string[];\n description?: string;\n enum?: string[];\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n anyOf?: { type: string }[];\n}\n\ninterface JsonSchema {\n $ref?: string;\n definitions?: Record<string, JsonSchemaProperty>;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n}\n\nfunction resolveJsonSchema(inputSchema: JsonSchema): JsonSchemaProperty {\n if (inputSchema.$ref && inputSchema.definitions) {\n const defName = inputSchema.$ref.replace(\"#/definitions/\", \"\");\n return inputSchema.definitions[defName];\n }\n return inputSchema;\n}\n\nfunction isNullableProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"null\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"null\");\n return false;\n}\n\nfunction isObjectProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"object\");\n return prop.type === \"object\";\n}\n\nfunction isNumberProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.some((t) => t === \"number\" || t === \"integer\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"number\" || t.type === \"integer\");\n return prop.type === \"number\" || prop.type === \"integer\";\n}\n\nconst HIDDEN_TOOLS = new Set([\n \"swaps_transaction_build\",\n \"token_transfer\",\n \"transaction_register\",\n]);\n\nfunction registerRemoteTools(\n parent: Command,\n remoteSchemas: { name: string; description: string; inputSchema: JsonSchema }[],\n): void {\n for (const schema of remoteSchemas) {\n if (HIDDEN_TOOLS.has(schema.name)) continue;\n const segments = schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n // Skip if a local tool already registered this command\n if (group.commands.find((c) => c.name() === leafName)) continue;\n\n const cmd = group.command(leafName).description(schema.description);\n\n const resolved = resolveJsonSchema(schema.inputSchema);\n const props = resolved.properties ?? {};\n const requiredSet = new Set(resolved.required ?? []);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n const objectKeys: string[] = [];\n\n for (const [key, prop] of Object.entries(props)) {\n const desc = prop.description ?? key;\n const nullable = isNullableProperty(prop);\n const isObj = isObjectProperty(prop);\n const isNum = isNumberProperty(prop);\n\n if (isNum) numberKeys.push(key);\n\n if (isObj) {\n objectKeys.push(key);\n if (requiredSet.has(key) && !nullable) {\n cmd.requiredOption(`--${key} <json>`, `${desc} (as JSON)`);\n } else {\n cmd.option(`--${key} <json>`, `${desc} (as JSON)`);\n nullableKeys.push(key);\n }\n } else if (nullable || !requiredSet.has(key)) {\n cmd.option(`--${key} <${key}>`, desc);\n nullableKeys.push(key);\n } else {\n cmd.requiredOption(`--${key} <${key}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n // Coerce types\n for (const key of nullableKeys) {\n if (options[key] === undefined) options[key] = null;\n }\n for (const key of numberKeys) {\n if (options[key] != null && typeof options[key] === \"string\") {\n options[key] = Number(options[key]);\n }\n }\n for (const key of objectKeys) {\n if (typeof options[key] === \"string\") {\n try {\n options[key] = JSON.parse(options[key] as string);\n } catch {\n console.error(`Invalid JSON for --${key}`);\n process.exit(1);\n }\n }\n }\n\n try {\n const baseUrl = resolveBaseUrl();\n const result = await callTool(baseUrl, schema.name, options as Record<string, unknown>);\n printResult(result);\n printUpdateNotice();\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Register all tools ─────────────────────────────────────────\n\nregisterLocalTools(program, LOCAL_TOOLS);\nregisterRemoteTools(program, schemas as any);\n\n\n// ── Tools listing ──────────────────────────────────────────────\n\nprogram\n .command(\"tools\")\n .description(\"List available tools\")\n .action(() => {\n const allTools = [\n ...LOCAL_TOOLS.map((t) => ({\n name: t.schema.name,\n description: t.schema.description,\n })),\n ...schemas\n .filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name) && !HIDDEN_TOOLS.has(s.name))\n .map((s) => ({ name: s.name, description: s.description })),\n ].sort((a, b) => a.name.localeCompare(b.name));\n\n const lines: string[] = [];\n for (const tool of allTools) {\n const cmdName = tool.name.replace(/_/g, \" \");\n lines.push(` ${color.green(cmdName.padEnd(28))} ${color.dim(tool.description)}`);\n }\n lines.push(\"\");\n lines.push(color.dim(`${allTools.length} tools`));\n console.log(lines.join(\"\\n\"));\n printUpdateNotice();\n });\n\nprogram.parse();\n","const useColor =\n !process.env.NO_COLOR && process.stdout.isTTY === true;\n\nfunction ansi(code: string) {\n return (text: string) => (useColor ? `${code}${text}\\x1b[0m` : text);\n}\n\nexport const color = {\n bold: ansi(\"\\x1b[1m\"),\n dim: ansi(\"\\x1b[2m\"),\n green: ansi(\"\\x1b[32m\"),\n yellow: ansi(\"\\x1b[33m\"),\n cyan: ansi(\"\\x1b[36m\"),\n red: ansi(\"\\x1b[31m\"),\n};\n\nconst MAX_COL_WIDTH = 40;\n\nfunction truncate(str: string, max: number): string {\n return str.length > max ? str.slice(0, max - 1) + \"…\" : str;\n}\n\nfunction renderArrayTable(rows: Record<string, unknown>[]): string {\n if (rows.length === 0) return \"\";\n\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) => k.length);\n\n const stringRows = rows.map((row) =>\n keys.map((k, i) => {\n const val = truncate(String(row[k] ?? \"\"), MAX_COL_WIDTH);\n widths[i] = Math.max(widths[i], val.length);\n return val;\n }),\n );\n\n // Cap widths\n for (let i = 0; i < widths.length; i++) {\n widths[i] = Math.min(widths[i], MAX_COL_WIDTH);\n }\n\n const header = keys.map((k, i) => color.bold(k.padEnd(widths[i]))).join(\" \");\n const separator = color.dim(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n const body = stringRows\n .map((row) => row.map((val, i) => val.padEnd(widths[i])).join(\" \"))\n .join(\"\\n\");\n\n return `${header}\\n${separator}\\n${body}`;\n}\n\nfunction renderObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n const maxKey = Math.min(\n MAX_COL_WIDTH,\n Math.max(...entries.map(([k]) => k.length)),\n );\n\n return entries\n .map(([k, v]) => `${color.bold(k.padEnd(maxKey))} ${String(v ?? \"\")}`)\n .join(\"\\n\");\n}\n\nexport function renderTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return color.dim(\"(empty)\");\n if (typeof data[0] === \"object\" && data[0] !== null) {\n return renderArrayTable(data as Record<string, unknown>[]);\n }\n return data.map(String).join(\"\\n\");\n }\n\n if (typeof data === \"object\" && data !== null) {\n return renderObjectTable(data as Record<string, unknown>);\n }\n\n return String(data);\n}\n\nexport type OutputFormat = \"json\" | \"compact\" | \"table\";\n\nexport function formatOutput(result: unknown, format: OutputFormat): string {\n if (format === \"compact\") {\n return JSON.stringify(result);\n }\n\n if (format === \"table\") {\n const value =\n typeof result === \"object\" &&\n result !== null &&\n \"data\" in result\n ? (result as Record<string, unknown>).data\n : result;\n return renderTable(value);\n }\n\n return JSON.stringify(result, null, 2);\n}\n","import { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { color } from \"./format\";\n\nconst CACHE_DIR = join(homedir(), \".config\", \"moonpay\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 3000;\n\ntype CacheData = {\n latest: string;\n checkedAt: number;\n};\n\nfunction readCache(): CacheData | null {\n try {\n const raw = readFileSync(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw) as CacheData;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(data: CacheData): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(data));\n } catch {\n // Ignore write errors\n }\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const a = latest.split(\".\").map(Number);\n const b = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((a[i] ?? 0) > (b[i] ?? 0)) return true;\n if ((a[i] ?? 0) < (b[i] ?? 0)) return false;\n }\n return false;\n}\n\nfunction formatNotice(current: string, latest: string): string {\n return [\n \"\",\n color.yellow(`Update available: ${current} → ${latest}`),\n color.dim(\"Run `npm i -g @moonpay/cli` to update.\"),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function startVersionCheck(\n currentVersion: string,\n): () => string | null {\n let notice: string | null = null;\n\n const cache = readCache();\n\n if (cache && Date.now() - cache.checkedAt < ONE_DAY_MS) {\n if (isNewer(cache.latest, currentVersion)) {\n notice = formatNotice(currentVersion, cache.latest);\n }\n return () => notice;\n }\n\n // Fire async fetch — non-blocking\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n fetch(\"https://registry.npmjs.org/@moonpay%2fcli/latest\", {\n signal: controller.signal,\n })\n .then((res) => res.json())\n .then((data: unknown) => {\n const latest = (data as { version?: string }).version;\n if (latest) {\n writeCache({ latest, checkedAt: Date.now() });\n if (isNewer(latest, currentVersion)) {\n notice = formatNotice(currentVersion, latest);\n }\n }\n })\n .catch(() => {\n // Silently ignore fetch errors\n })\n .finally(() => clearTimeout(timeout));\n\n return () => notice;\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletExportSchema = defineToolSchema({\n name: \"wallet_export\",\n description:\n \"Export wallet secret (mnemonic or private key). Interactive only — cannot be run by agents or piped.\",\n input: z.object({\n wallet: z.string().describe(\"Wallet name\"),\n }),\n output: z.object({\n exported: z.literal(true),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { findWalletOrThrow } from \"../store\";\nimport { walletExportSchema } from \"./schema\";\n\nexport const walletExport = createTool(walletExportSchema, async (params) => {\n if (!process.stdout.isTTY) {\n throw new Error(\n \"Wallet export requires an interactive terminal.\\n\" +\n \"Run this command directly in your terminal: mp wallet export \" + params.wallet,\n );\n }\n\n const wallet = findWalletOrThrow(params.wallet);\n\n if (wallet.type === \"hd\") {\n process.stderr.write(`\\nMnemonic for \"${wallet.name}\":\\n\\n`);\n process.stderr.write(` ${wallet.mnemonic}\\n\\n`);\n process.stderr.write(\"Write this down and store it securely.\\n\\n\");\n } else {\n process.stderr.write(`\\nPrivate key for \"${wallet.name}\" (${wallet.chain}):\\n\\n`);\n process.stderr.write(` ${wallet.privateKey}\\n\\n`);\n }\n\n return { exported: true as const };\n});\n","import { readdirSync, readFileSync, existsSync, mkdirSync, cpSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\n\n/** Package root → skills/ directory bundled with the CLI */\nfunction getSkillsDir(): string {\n // import.meta.url resolves to dist/index.js when bundled\n const __filename = fileURLToPath(import.meta.url);\n const distDir = dirname(__filename);\n // dist/ → package root → skills/\n return join(distDir, \"..\", \"skills\");\n}\n\n/** Where Claude Code discovers skills */\nfunction getClaudeSkillsDir(): string {\n return join(homedir(), \".claude\", \"skills\");\n}\n\nexport type SkillInfo = {\n name: string;\n description: string;\n};\n\nexport function listBundledSkills(): SkillInfo[] {\n const dir = getSkillsDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.startsWith(\"moonpay-\"))\n .map((e) => {\n const md = readFileSync(join(dir, e.name, \"SKILL.md\"), \"utf-8\");\n const descMatch = md.match(/^description:\\s*(.+)$/m);\n return {\n name: e.name,\n description: descMatch?.[1]?.replace(/^[\"']|[\"']$/g, \"\") ?? \"\",\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function readSkill(name: string): string {\n if (/[/\\\\]|\\.\\./.test(name)) throw new Error(`Invalid skill name: \"${name}\"`);\n const skillPath = join(getSkillsDir(), name, \"SKILL.md\");\n if (!existsSync(skillPath)) {\n throw new Error(`Skill \"${name}\" not found. Run \\`mp skill list\\` to see available skills.`);\n }\n return readFileSync(skillPath, \"utf-8\");\n}\n\nexport function installSkills(force: boolean, dir?: string): { name: string; installed: boolean }[] {\n const srcDir = getSkillsDir();\n const destDir = dir ?? getClaudeSkillsDir();\n const skills = listBundledSkills();\n\n mkdirSync(destDir, { recursive: true });\n\n return skills.map((s) => {\n const dest = join(destDir, s.name);\n if (existsSync(dest) && !force) {\n return { name: s.name, installed: false };\n }\n cpSync(join(srcDir, s.name), dest, { recursive: true, force: true });\n return { name: s.name, installed: true };\n });\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillListSchema = defineToolSchema({\n name: \"skill_list\",\n description: \"List available AI skills for Claude Code and other agents\",\n input: z.object({}),\n output: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { listBundledSkills } from \"../server\";\nimport { skillListSchema } from \"./schema\";\n\nexport const skillList = createTool(skillListSchema, async () => {\n return listBundledSkills();\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillRetrieveSchema = defineToolSchema({\n name: \"skill_retrieve\",\n description: \"Get the full instructions for a specific skill\",\n input: z.object({\n name: z.string().describe(\"Skill name (e.g. moonpay-swap-tokens)\"),\n }),\n output: z.object({\n name: z.string(),\n content: z.string(),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { readSkill } from \"../server\";\nimport { skillRetrieveSchema } from \"./schema\";\n\nexport const skillRetrieve = createTool(skillRetrieveSchema, async (params) => {\n return {\n name: params.name,\n content: readSkill(params.name),\n };\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillInstallSchema = defineToolSchema({\n name: \"skill_install\",\n description:\n \"Install AI skills for Claude Code. Defaults to ~/.claude/skills/, or specify --dir for a custom location (e.g. project-local, ~/.agents/skills).\",\n input: z.object({\n force: z.boolean().describe(\"Overwrite existing skills\"),\n dir: z\n .string()\n .nullable()\n .describe(\n \"Target directory to install skills into (default: ~/.claude/skills/)\",\n ),\n }),\n output: z.array(\n z.object({\n name: z.string(),\n installed: z.boolean(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { installSkills } from \"../server\";\nimport { skillInstallSchema } from \"./schema\";\n\nexport const skillInstall = createTool(skillInstallSchema, async (params) => {\n return installSkills(params.force, params.dir ?? undefined);\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema } from \"../../wallet/models\";\n\nexport const tokenTransferSchema = defineToolSchema({\n name: \"token_transfer\",\n description:\n \"Transfer tokens to another wallet on the same chain. Builds, signs locally, and broadcasts.\",\n input: z.object({\n wallet: z.string().describe(\"Local wallet name to sign with\"),\n chain: chainSchema.describe(\"Chain to transfer on\"),\n token: z.string().describe(\"Token address to transfer\"),\n amount: z.coerce.number().describe(\"Amount to transfer\"),\n to: z.string().describe(\"Recipient wallet name or address\"),\n }),\n output: z.object({\n signature: z.string().describe(\"Transaction hash/signature\"),\n message: z.string().describe(\"Human-readable transfer description\"),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { callRemoteTool } from \"../../../client\";\nimport { resolveBaseUrl } from \"../../../auth\";\nimport { walletRetrieve } from \"../../wallet/retrieve/tool\";\nimport { KEY_CHAIN_MAP } from \"../../wallet/models\";\nimport { transactionSign } from \"../../transaction/sign/tool\";\nimport { tokenTransferSchema } from \"./schema\";\n\nexport const tokenTransfer = createTool(tokenTransferSchema, async (params) => {\n const baseUrl = resolveBaseUrl();\n\n const wallet = await walletRetrieve.handler({ wallet: params.wallet });\n const fromAddress = wallet.addresses[KEY_CHAIN_MAP[params.chain]];\n if (!fromAddress) {\n throw new Error(`Wallet \"${wallet.name}\" has no address on ${params.chain}.`);\n }\n\n // Resolve recipient: try as wallet name, fall back to raw address\n let toAddress = params.to;\n try {\n const toWallet = await walletRetrieve.handler({ wallet: params.to });\n toAddress = toWallet.addresses[KEY_CHAIN_MAP[params.chain]] ?? params.to;\n } catch {\n // Not a wallet name — use as-is (raw address)\n }\n\n // Build unsigned transaction\n const buildResult = await callRemoteTool(baseUrl, \"token_transfer\", {\n wallet: fromAddress,\n token: params.token,\n to: toAddress,\n amount: params.amount,\n chain: params.chain,\n });\n\n // Sign\n const txPayload = buildResult.transaction.type === \"solana\"\n ? buildResult.transaction.base64\n : JSON.stringify(buildResult.transaction);\n\n const { transaction: signedTransaction } = await transactionSign.handler({\n wallet: wallet.name,\n chain: params.chain,\n transaction: txPayload,\n });\n\n // Send\n const sendResult = await callRemoteTool(baseUrl, \"transaction_send\", {\n transaction: signedTransaction,\n message: buildResult.message,\n chain: params.chain,\n });\n\n if (!sendResult.signature) {\n throw new Error(`Transaction send failed: ${sendResult.message}`);\n }\n\n return { signature: sendResult.signature, message: buildResult.message };\n});\n"],"mappings":"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","names":["readFileSync","mkdirSync","join","homedir","z","z","z","z","z","z","z","z","require"]}
|
|
@@ -2,8 +2,6 @@ import { createRequire as __createRequire } from "module"; const require = __cre
|
|
|
2
2
|
import {
|
|
3
3
|
bitcoinBalanceRetrieve,
|
|
4
4
|
callTool,
|
|
5
|
-
createTool,
|
|
6
|
-
defineToolSchema,
|
|
7
5
|
messageSign,
|
|
8
6
|
resolveBaseUrl,
|
|
9
7
|
schemas_default,
|
|
@@ -14,12 +12,10 @@ import {
|
|
|
14
12
|
walletDelete,
|
|
15
13
|
walletImport,
|
|
16
14
|
walletList,
|
|
17
|
-
walletRetrieve
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
resolveSigningKey
|
|
22
|
-
} from "./chunk-V7MA7WNX.js";
|
|
15
|
+
walletRetrieve,
|
|
16
|
+
x402Request
|
|
17
|
+
} from "./chunk-PBRXVTTG.js";
|
|
18
|
+
import "./chunk-V7MA7WNX.js";
|
|
23
19
|
|
|
24
20
|
// src/mcp.ts
|
|
25
21
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -29,116 +25,6 @@ import {
|
|
|
29
25
|
ListToolsRequestSchema
|
|
30
26
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
31
27
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
32
|
-
|
|
33
|
-
// src/tools/x402/request/tool.ts
|
|
34
|
-
import { Keypair, VersionedTransaction, VersionedMessage } from "@solana/web3.js";
|
|
35
|
-
import axios from "axios";
|
|
36
|
-
import { wrapAxiosWithPayment } from "@x402/axios";
|
|
37
|
-
import { x402Client } from "@x402/core/client";
|
|
38
|
-
import { ExactSvmScheme } from "@x402/svm";
|
|
39
|
-
|
|
40
|
-
// src/tools/x402/request/schema.ts
|
|
41
|
-
import { z } from "zod";
|
|
42
|
-
var x402RequestSchema = defineToolSchema({
|
|
43
|
-
name: "x402_request",
|
|
44
|
-
description: "Make an HTTP request to an x402-protected endpoint. Automatically handles payment when a 402 Payment Required response is received, signing the payment transaction with the local wallet.",
|
|
45
|
-
input: z.object({
|
|
46
|
-
method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe("HTTP method"),
|
|
47
|
-
url: z.string().url().refine((u) => u.startsWith("https://"), { message: "URL must use HTTPS" }).refine(
|
|
48
|
-
(u) => {
|
|
49
|
-
try {
|
|
50
|
-
const host = new URL(u).hostname;
|
|
51
|
-
return !host.match(/^(localhost|127\.|10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.|169\.254\.|0\.0\.0\.0|\[::1\])/);
|
|
52
|
-
} catch {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
{ message: "URL must not target private/internal addresses" }
|
|
57
|
-
).describe(
|
|
58
|
-
"Full HTTPS URL of the x402-protected endpoint (e.g., 'https://agents.moonpay.com/api/x402/tools/market_digest_retrieve')"
|
|
59
|
-
),
|
|
60
|
-
body: z.record(z.any()).nullable().describe("Request body (for POST, PUT, PATCH)"),
|
|
61
|
-
params: z.record(z.any()).nullable().describe("Query parameters"),
|
|
62
|
-
wallet: z.string().describe("Wallet name or address to pay with")
|
|
63
|
-
}),
|
|
64
|
-
output: z.object({
|
|
65
|
-
status: z.number().describe("HTTP status code"),
|
|
66
|
-
data: z.any().describe("Response data"),
|
|
67
|
-
headers: z.record(z.string()).describe("Response headers")
|
|
68
|
-
})
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// src/tools/x402/request/tool.ts
|
|
72
|
-
var SOLANA_NETWORK = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
|
|
73
|
-
function createLocalX402Client(walletAddress, secretKey) {
|
|
74
|
-
const keypair = Keypair.fromSecretKey(secretKey);
|
|
75
|
-
const signer = {
|
|
76
|
-
address: walletAddress,
|
|
77
|
-
signTransactions: async (transactions) => {
|
|
78
|
-
return transactions.map((transaction) => {
|
|
79
|
-
const messageBytes = new Uint8Array(transaction.messageBytes);
|
|
80
|
-
const message = VersionedMessage.deserialize(messageBytes);
|
|
81
|
-
const numSigs = Object.keys(transaction.signatures).length;
|
|
82
|
-
const tx = new VersionedTransaction(
|
|
83
|
-
message,
|
|
84
|
-
new Array(numSigs).fill(new Uint8Array(64))
|
|
85
|
-
);
|
|
86
|
-
tx.sign([keypair]);
|
|
87
|
-
const signerIndex = message.staticAccountKeys.findIndex(
|
|
88
|
-
(key) => key.toBase58() === walletAddress
|
|
89
|
-
);
|
|
90
|
-
if (signerIndex === -1) {
|
|
91
|
-
throw new Error(
|
|
92
|
-
`Wallet ${walletAddress} is not a signer for this transaction`
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
[walletAddress]: tx.signatures[signerIndex]
|
|
97
|
-
};
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
const client = new x402Client();
|
|
102
|
-
const svmScheme = new ExactSvmScheme(signer);
|
|
103
|
-
client.register(SOLANA_NETWORK, svmScheme);
|
|
104
|
-
client.registerV1("solana", svmScheme);
|
|
105
|
-
return wrapAxiosWithPayment(axios.create(), client);
|
|
106
|
-
}
|
|
107
|
-
var x402Request = createTool(
|
|
108
|
-
x402RequestSchema,
|
|
109
|
-
async ({ method, url, body, params, wallet: walletNameOrAddress }) => {
|
|
110
|
-
const walletMetadata = findWalletOrThrow(walletNameOrAddress);
|
|
111
|
-
const { privateKey, address } = resolveSigningKey(walletMetadata, "solana");
|
|
112
|
-
const client = createLocalX402Client(address, privateKey);
|
|
113
|
-
let response;
|
|
114
|
-
switch (method) {
|
|
115
|
-
case "GET":
|
|
116
|
-
response = await client.get(url, { params });
|
|
117
|
-
break;
|
|
118
|
-
case "POST":
|
|
119
|
-
response = await client.post(url, body || {}, { params });
|
|
120
|
-
break;
|
|
121
|
-
case "PUT":
|
|
122
|
-
response = await client.put(url, body || {}, { params });
|
|
123
|
-
break;
|
|
124
|
-
case "PATCH":
|
|
125
|
-
response = await client.patch(url, body || {}, { params });
|
|
126
|
-
break;
|
|
127
|
-
case "DELETE":
|
|
128
|
-
response = await client.delete(url, { params });
|
|
129
|
-
break;
|
|
130
|
-
default:
|
|
131
|
-
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
status: response.status,
|
|
135
|
-
data: response.data,
|
|
136
|
-
headers: response.headers
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
// src/mcp.ts
|
|
142
28
|
var LOCAL_TOOLS = [
|
|
143
29
|
walletCreate,
|
|
144
30
|
walletImport,
|
|
@@ -262,4 +148,4 @@ async function startMcpServer() {
|
|
|
262
148
|
export {
|
|
263
149
|
startMcpServer
|
|
264
150
|
};
|
|
265
|
-
//# sourceMappingURL=mcp-
|
|
151
|
+
//# sourceMappingURL=mcp-TDQN25MO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp.ts"],"sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { callTool } from \"./client\";\nimport { resolveBaseUrl } from \"./auth\";\nimport type { Tool } from \"./tools/shared\";\nimport { walletCreate } from \"./tools/wallet/create/tool\";\nimport { walletImport } from \"./tools/wallet/import/tool\";\nimport { walletList } from \"./tools/wallet/list/tool\";\nimport { walletRetrieve } from \"./tools/wallet/retrieve/tool\";\nimport { walletDelete } from \"./tools/wallet/delete/tool\";\nimport { transactionSign } from \"./tools/transaction/sign/tool\";\nimport { messageSign } from \"./tools/message/sign/tool\";\nimport { bitcoinBalanceRetrieve } from \"./tools/bitcoin/balance/tool\";\nimport { x402Request } from \"./tools/x402/request/tool\";\nimport { tokenSwap } from \"./tools/token/swap/tool\";\nimport { virtualAccountWalletRegister } from \"./tools/virtual-account/wallet/register/tool\";\nimport schemas from \"./generated/schemas.json\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst LOCAL_TOOLS: Tool<any>[] = [\n walletCreate,\n walletImport,\n walletList,\n walletRetrieve,\n walletDelete,\n transactionSign,\n messageSign,\n bitcoinBalanceRetrieve,\n x402Request,\n tokenSwap,\n virtualAccountWalletRegister,\n];\n\nconst localToolMap = new Map(LOCAL_TOOLS.map((t) => [t.schema.name, t]));\n\n/**\n * Resolve a remote schema's $ref to the actual properties object.\n */\nfunction resolveRemoteSchema(schema: (typeof schemas)[number]) {\n const input = schema.inputSchema as any;\n if (input.$ref && input.definitions) {\n const defName = input.$ref.replace(\"#/definitions/\", \"\");\n return input.definitions[defName] ?? input;\n }\n return input;\n}\n\nexport async function startMcpServer() {\n const server = new Server(\n { name: \"moonpay\", version: \"1.0.0\" },\n { capabilities: { tools: { listChanged: true } } },\n );\n\n // Build tool definitions — local tools use Zod→JSON, remote use JSON directly\n const toolDefs: Array<{\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n }> = LOCAL_TOOLS.map((tool) => ({\n name: tool.schema.name,\n description: tool.schema.description,\n inputSchema: zodToJsonSchema(tool.schema.input) as Record<string, unknown>,\n }));\n\n const remotePropsMap = new Map<string, Record<string, any>>();\n for (const schema of schemas) {\n if (localToolMap.has(schema.name)) continue;\n const resolved = resolveRemoteSchema(schema);\n remotePropsMap.set(\n schema.name,\n (resolved.properties ?? {}) as Record<string, any>,\n );\n toolDefs.push({\n name: schema.name,\n description: schema.description,\n inputSchema: {\n type: \"object\",\n properties: resolved.properties ?? {},\n ...(resolved.required ? { required: resolved.required } : {}),\n ...(resolved.additionalProperties !== undefined\n ? { additionalProperties: resolved.additionalProperties }\n : {}),\n },\n });\n }\n\n const toolDefMap = new Map(toolDefs.map((t) => [t.name, t]));\n\n // tools/list — return raw JSON schemas directly\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: toolDefs.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n }));\n\n // tools/call\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: params = {} } = request.params;\n\n if (!toolDefMap.has(name)) {\n return {\n content: [{ type: \"text\" as const, text: `Unknown tool: ${name}` }],\n isError: true,\n };\n }\n\n try {\n // Local tool — coerce nullable fields then run handler\n const localTool = localToolMap.get(name);\n if (localTool) {\n // Fill missing nullable fields with null (MCP clients may omit them)\n const shape = (localTool.schema.input as z.ZodObject<z.ZodRawShape>).shape ?? {};\n for (const [key, field] of Object.entries(shape)) {\n if (\n params[key] === undefined &&\n (field as z.ZodTypeAny)._def.typeName === \"ZodNullable\"\n ) {\n params[key] = null;\n }\n }\n\n const result = await localTool.handler(params);\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n ],\n };\n }\n\n // Remote tool — coerce types then call API\n const props = remotePropsMap.get(name) ?? {};\n for (const [key, prop] of Object.entries(props)) {\n if (params[key] === undefined) {\n const nullable = Array.isArray(prop.type)\n ? prop.type.includes(\"null\")\n : prop.anyOf?.some((t: any) => t.type === \"null\");\n if (nullable) params[key] = null;\n }\n const isNum =\n prop.type === \"number\" ||\n prop.type === \"integer\" ||\n (Array.isArray(prop.type) &&\n prop.type.some(\n (t: string) => t === \"number\" || t === \"integer\",\n )) ||\n prop.anyOf?.some(\n (t: any) => t.type === \"number\" || t.type === \"integer\",\n );\n if (isNum && typeof params[key] === \"string\") {\n params[key] = Number(params[key]);\n }\n }\n\n const baseUrl = resolveBaseUrl();\n const result = await callTool(baseUrl, name, params);\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: error instanceof Error ? error.message : String(error),\n },\n ],\n isError: true,\n };\n }\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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","names":["result"]}
|
package/package.json
CHANGED
|
@@ -44,13 +44,11 @@ Then restart Claude Desktop.
|
|
|
44
44
|
|
|
45
45
|
All MoonPay CLI tools are available as MCP tools:
|
|
46
46
|
|
|
47
|
-
- **Wallet management** — create, import, list, retrieve, delete wallets
|
|
48
|
-
- **Token operations** — search, retrieve,
|
|
49
|
-
- **
|
|
50
|
-
- **DeFi** — lending deposits/withdrawals, yield recommendations
|
|
51
|
-
- **Fiat on/off-ramp** — buy crypto, virtual accounts, bank accounts
|
|
47
|
+
- **Wallet management** — create, import, list, retrieve, delete, export wallets
|
|
48
|
+
- **Token operations** — search, retrieve, trending, swap, bridge, transfer
|
|
49
|
+
- **Fiat** — buy crypto with card/bank, virtual accounts with on-ramp
|
|
52
50
|
- **x402 payments** — paid API requests with automatic payment handling
|
|
53
|
-
- **
|
|
51
|
+
- **Transactions** — sign locally, send, list, retrieve
|
|
54
52
|
|
|
55
53
|
## Verification
|
|
56
54
|
|
|
@@ -62,14 +62,19 @@ Pick a small swap based on what the wallet holds:
|
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
mp token swap \
|
|
65
|
-
--
|
|
66
|
-
--from-token
|
|
65
|
+
--wallet main --chain solana \
|
|
66
|
+
--from-token So11111111111111111111111111111111111111111 \
|
|
67
67
|
--from-amount 0.01 \
|
|
68
68
|
--to-token EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
This builds, signs locally, and broadcasts in one step. Show the result and explain: the transaction was built on the server, signed locally (key never left the machine), and submitted on-chain.
|
|
72
72
|
|
|
73
|
+
Three commands for moving tokens:
|
|
74
|
+
- **`mp token swap`** — same chain, different tokens (e.g. SOL → USDC)
|
|
75
|
+
- **`mp token bridge`** — cross chain (e.g. ETH on Ethereum → USDC on Polygon)
|
|
76
|
+
- **`mp token transfer`** — same chain, same token, different wallet (e.g. send USDC to a friend)
|
|
77
|
+
|
|
73
78
|
## Mission 5: Buy with Fiat
|
|
74
79
|
|
|
75
80
|
**Goal:** Generate a fiat checkout link.
|