@dexterai/mcp 1.0.0 → 1.0.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/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -33,7 +33,7 @@ var init_config = __esm({
|
|
|
33
33
|
"use strict";
|
|
34
34
|
DATA_DIR = join(homedir(), ".dexterai-mcp");
|
|
35
35
|
WALLET_FILE = join(DATA_DIR, "wallet.json");
|
|
36
|
-
DEXTER_API_PROD = process.env.DEXTER_API_URL || "https://
|
|
36
|
+
DEXTER_API_PROD = process.env.DEXTER_API_URL || "https://x402.dexter.cash";
|
|
37
37
|
DEXTER_API_DEV = "http://127.0.0.1:3030";
|
|
38
38
|
SOLANA_RPC_URL = process.env.SOLANA_RPC_URL || "https://api.dexter.cash/api/solana/rpc";
|
|
39
39
|
MARKETPLACE_PATH = "/api/facilitator/marketplace/resources";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/tools/search.ts","../src/wallet/index.ts","../src/tools/fetch.ts","../src/tools/check.ts","../src/tools/wallet-tool.ts","../src/server/index.ts","../src/cli/install/clients.ts","../src/cli/install/index.ts","../src/index.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname as pathDirname } from \"node:path\";\n\nexport const DATA_DIR = join(homedir(), \".dexterai-mcp\");\nexport const WALLET_FILE = join(DATA_DIR, \"wallet.json\");\n\nexport const DEXTER_API_PROD = process.env.DEXTER_API_URL || \"https://api.dexter.cash\";\nexport const DEXTER_API_DEV = \"http://127.0.0.1:3030\";\nexport const SOLANA_RPC_URL = process.env.SOLANA_RPC_URL || \"https://api.dexter.cash/api/solana/rpc\";\n\nexport const MARKETPLACE_PATH = \"/api/facilitator/marketplace/resources\";\n\nexport function getApiBase(dev: boolean): string {\n return dev ? DEXTER_API_DEV : DEXTER_API_PROD;\n}\n\nfunction loadVersion(): string {\n try {\n const here = pathDirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, \"..\", \"package.json\"), \"utf-8\"));\n return pkg.version || \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const VERSION = loadVersion();\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getApiBase, MARKETPLACE_PATH } from \"../config.js\";\n\ninterface SearchOpts {\n dev: boolean;\n}\n\ninterface MarketplaceResource {\n resourceUrl: string;\n displayName?: string;\n description?: string | null;\n method?: string;\n priceUsdc?: number | null;\n priceLabel?: string | null;\n priceNetwork?: string | null;\n qualityScore?: number | null;\n verificationStatus?: string | null;\n totalSettlements?: number;\n totalVolumeUsdc?: number;\n category?: string | null;\n seller?: { displayName?: string | null };\n reputationScore?: number | null;\n}\n\nfunction formatResource(r: MarketplaceResource) {\n return {\n name: r.displayName || r.resourceUrl,\n url: r.resourceUrl,\n method: r.method || \"GET\",\n price: r.priceLabel || (r.priceUsdc != null ? `$${r.priceUsdc.toFixed(2)}` : \"free\"),\n network: r.priceNetwork || null,\n description: r.description || \"\",\n category: r.category || \"uncategorized\",\n qualityScore: r.qualityScore ?? null,\n verified: r.verificationStatus === \"pass\",\n totalCalls: r.totalSettlements ?? 0,\n seller: r.seller?.displayName || null,\n };\n}\n\nasync function searchMarketplace(\n params: {\n query?: string;\n category?: string;\n network?: string;\n maxPriceUsdc?: number;\n verifiedOnly?: boolean;\n sort?: string;\n limit?: number;\n },\n opts: SearchOpts,\n) {\n const qs = new URLSearchParams();\n if (params.query) qs.set(\"search\", params.query);\n if (params.category) qs.set(\"category\", params.category);\n if (params.network) qs.set(\"network\", params.network);\n if (params.maxPriceUsdc != null) qs.set(\"maxPrice\", String(params.maxPriceUsdc));\n if (params.verifiedOnly) qs.set(\"verified\", \"true\");\n qs.set(\"sort\", params.sort || \"quality_score\");\n qs.set(\"order\", \"desc\");\n qs.set(\"limit\", String(Math.min(params.limit || 20, 50)));\n\n const url = `${getApiBase(opts.dev)}${MARKETPLACE_PATH}?${qs}`;\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Marketplace returned ${res.status}: ${await res.text().catch(() => \"\")}`);\n }\n\n const data = await res.json() as { resources?: MarketplaceResource[] };\n return {\n resources: (data.resources || []).map(formatResource),\n total: data.resources?.length || 0,\n };\n}\n\nexport function registerSearchTool(server: McpServer, opts: SearchOpts): void {\n server.tool(\n \"x402_search\",\n \"Search the Dexter x402 marketplace for paid API resources. \" +\n \"Returns services with pricing, quality scores, and verification status. \" +\n \"Use this to discover APIs an agent can pay for and call with x402_fetch.\",\n {\n query: z.string().optional().describe(\"Search term, e.g. 'token analysis', 'image generation'\"),\n category: z.string().optional().describe(\"Filter by category\"),\n network: z.string().optional().describe(\"Filter by payment network: 'solana', 'base', 'polygon'\"),\n maxPriceUsdc: z.number().optional().describe(\"Maximum price per call in USDC\"),\n verifiedOnly: z.boolean().optional().describe(\"Only return verified endpoints\"),\n sort: z\n .enum([\"relevance\", \"quality_score\", \"settlements\", \"volume\", \"recent\"])\n .optional()\n .describe(\"Sort order (default: quality_score)\"),\n limit: z.number().optional().default(20).describe(\"Max results (1-50)\"),\n },\n async (args) => {\n try {\n const result = await searchMarketplace(args, opts);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(\n {\n success: true,\n count: result.total,\n resources: result.resources,\n tip: \"Use x402_fetch to call any of these endpoints.\",\n },\n null,\n 2,\n ),\n },\n ],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n\nexport async function cliSearch(query: string, opts: { dev: boolean }): Promise<void> {\n try {\n const result = await searchMarketplace({ query }, opts);\n console.log(JSON.stringify({ success: true, count: result.total, resources: result.resources }, null, 2));\n } catch (err: any) {\n console.log(JSON.stringify({ error: err.message || String(err) }, null, 2));\n process.exit(1);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { Keypair, Connection, PublicKey } from \"@solana/web3.js\";\nimport { getAssociatedTokenAddress } from \"@solana/spl-token\";\nimport bs58 from \"bs58\";\nimport { DATA_DIR, WALLET_FILE, SOLANA_RPC_URL } from \"../config.js\";\n\nexport interface WalletInfo {\n solanaPrivateKey: string;\n solanaAddress: string;\n evmPrivateKey?: string;\n evmAddress?: string;\n createdAt: string;\n}\n\nexport interface LoadedWallet {\n info: WalletInfo;\n solanaKeypair: Keypair;\n}\n\nconst USDC_MINT = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\n\nexport async function loadOrCreateWallet(): Promise<LoadedWallet | null> {\n // Env var override takes priority\n const envKey = process.env.DEXTER_PRIVATE_KEY || process.env.SOLANA_PRIVATE_KEY;\n if (envKey) {\n const keypair = keypairFromString(envKey);\n return {\n info: {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n },\n solanaKeypair: keypair,\n };\n }\n\n if (existsSync(WALLET_FILE)) {\n try {\n const raw = readFileSync(WALLET_FILE, \"utf-8\");\n const data = JSON.parse(raw) as WalletInfo;\n if (!data.solanaPrivateKey) throw new Error(\"Missing solanaPrivateKey\");\n const keypair = keypairFromString(data.solanaPrivateKey);\n if (keypair.secretKey.length !== 64) throw new Error(\"Invalid key length\");\n return { info: data, solanaKeypair: keypair };\n } catch (err: any) {\n console.error(`[dexter-mcp] Corrupted wallet file: ${err.message}`);\n console.error(`[dexter-mcp] Backing up to ${WALLET_FILE}.bak and creating fresh wallet.`);\n try { copyFileSync(WALLET_FILE, WALLET_FILE + \".bak\"); } catch {}\n }\n }\n\n // Generate new wallet\n const keypair = Keypair.generate();\n const info: WalletInfo = {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n };\n\n mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(WALLET_FILE, JSON.stringify(info, null, 2), { mode: 0o600 });\n\n console.error(`[dexter-mcp] New wallet created: ${info.solanaAddress}`);\n console.error(`[dexter-mcp] Saved to ${WALLET_FILE}`);\n console.error(`[dexter-mcp] Deposit USDC (Solana) to this address to start paying for x402 APIs.`);\n\n return { info, solanaKeypair: keypair };\n}\n\nfunction keypairFromString(key: string): Keypair {\n try {\n // Try base58\n return Keypair.fromSecretKey(bs58.decode(key));\n } catch {\n // Try JSON array\n try {\n const arr = JSON.parse(key);\n if (Array.isArray(arr)) {\n return Keypair.fromSecretKey(Uint8Array.from(arr));\n }\n } catch {}\n throw new Error(\"Invalid private key format. Expected base58 string or JSON byte array.\");\n }\n}\n\nexport async function getSolanaBalance(\n address: string,\n rpcUrl?: string,\n): Promise<{ sol: number; usdc: number }> {\n try {\n const connection = new Connection(rpcUrl || SOLANA_RPC_URL, \"confirmed\");\n const pubkey = new PublicKey(address);\n\n const [solBalance, usdcBalance] = await Promise.all([\n connection.getBalance(pubkey).catch(() => 0),\n getUsdcBalance(connection, pubkey),\n ]);\n\n return { sol: solBalance / 1e9, usdc: usdcBalance };\n } catch (err: any) {\n console.error(`[dexter-mcp] RPC error fetching balance: ${err.message}`);\n return { sol: 0, usdc: 0 };\n }\n}\n\nasync function getUsdcBalance(connection: Connection, owner: PublicKey): Promise<number> {\n try {\n const ata = await getAssociatedTokenAddress(USDC_MINT, owner);\n const info = await connection.getTokenAccountBalance(ata);\n return Number(info.value.uiAmount ?? 0);\n } catch {\n return 0;\n }\n}\n\nexport async function showWalletInfo(opts: { dev: boolean }): Promise<void> {\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.log(JSON.stringify({ error: \"Failed to load wallet\" }));\n process.exit(1);\n }\n\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n\n console.log(JSON.stringify({\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n balances: {\n sol: balance.sol,\n usdc: balance.usdc,\n },\n walletFile: WALLET_FILE,\n tip: balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n }, null, 2));\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getApiBase } from \"../config.js\";\n\ninterface FetchOpts {\n dev: boolean;\n}\n\nasync function parseResponse(res: Response): Promise<unknown> {\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"json\")) {\n try { return await res.json(); } catch { return await res.text(); }\n }\n return await res.text();\n}\n\nfunction extractSettlement(res: Response): unknown {\n const header = res.headers.get(\"payment-response\") || res.headers.get(\"PAYMENT-RESPONSE\");\n if (!header) return null;\n try { return JSON.parse(atob(header)); } catch {\n try { return JSON.parse(header); } catch { return null; }\n }\n}\n\nfunction parse402(body: unknown): { requirements: Record<string, unknown> | null; firstAccept: Record<string, unknown> | null } {\n const obj = body as Record<string, unknown> | null;\n if (!obj?.accepts || !Array.isArray(obj.accepts)) return { requirements: null, firstAccept: null };\n return {\n requirements: { accepts: obj.accepts, x402Version: obj.x402Version ?? 2, resource: obj.resource },\n firstAccept: obj.accepts[0] as Record<string, unknown> || null,\n };\n}\n\nasync function createQrSession(\n accept: Record<string, unknown>,\n resourceUrl: string,\n dev: boolean,\n): Promise<Record<string, unknown>> {\n const sessionRes = await fetch(`${getApiBase(dev)}/v2/pay/session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n payTo: accept.payTo,\n amount: String(accept.amount || accept.maxAmountRequired),\n asset: accept.asset,\n feePayer: (accept.extra as Record<string, unknown>)?.feePayer || \"\",\n resourceUrl,\n }),\n });\n return await sessionRes.json() as Record<string, unknown>;\n}\n\nasync function pollSessionStatus(nonce: string, dev: boolean, maxAttempts = 60): Promise<Record<string, unknown>> {\n for (let i = 0; i < maxAttempts; i++) {\n await new Promise((r) => setTimeout(r, 2000));\n const res = await fetch(`${getApiBase(dev)}/v2/pay/status/${nonce}`);\n const status = await res.json() as Record<string, unknown>;\n if (status.state === \"paid\" || status.state === \"expired\") return status;\n }\n return { state: \"timeout\" };\n}\n\nasync function x402Fetch(\n params: { url: string; method: string; body?: string; headers?: Record<string, string> },\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): Promise<Record<string, unknown>> {\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(params.headers || {}),\n };\n const fetchOpts: RequestInit = {\n method: params.method || \"GET\",\n headers: requestHeaders,\n };\n if (params.body && params.method !== \"GET\") {\n fetchOpts.body = params.body;\n }\n\n const probeRes = await fetch(params.url, { ...fetchOpts, signal: AbortSignal.timeout(15_000) });\n\n if (probeRes.status !== 402) {\n return { status: probeRes.status, data: await parseResponse(probeRes) };\n }\n\n let body402: unknown = null;\n try { body402 = await probeRes.json(); } catch {\n try { body402 = await probeRes.text(); } catch {}\n }\n\n const { requirements, firstAccept } = parse402(body402);\n\n // Mode 1: Local wallet auto-pay\n if (wallet) {\n try {\n const { wrapFetch } = await import(\"@dexterai/x402/client\");\n const x402FetchFn = wrapFetch(fetch, {\n walletPrivateKey: wallet.info.solanaPrivateKey,\n });\n\n const paidRes = await x402FetchFn(params.url, fetchOpts);\n const data = await parseResponse(paidRes);\n const settlement = extractSettlement(paidRes);\n\n return {\n status: paidRes.status,\n data,\n payment: settlement ? { settled: true, details: settlement } : { settled: false },\n };\n } catch (err: any) {\n return { status: 402, error: `Payment failed: ${err.message}`, requirements };\n }\n }\n\n // Mode 2: QR pay (no local wallet)\n if (firstAccept && String(firstAccept.network || \"\").startsWith(\"solana\")) {\n try {\n const session = await createQrSession(firstAccept, params.url, opts.dev);\n\n if (!session.ok) {\n return { status: 402, error: \"Failed to create payment session\", requirements };\n }\n\n return {\n status: 402,\n mode: \"qr\",\n message: \"Scan the QR code with Phantom or Solflare to pay, then this tool will automatically complete the request.\",\n qr: {\n solanaPayUrl: session.solanaPayUrl,\n nonce: session.nonce,\n expiresAt: session.expiresAt,\n },\n pollUrl: `${getApiBase(opts.dev)}/v2/pay/status/${session.nonce}`,\n requirements,\n };\n } catch {\n // Fall through to manual mode\n }\n }\n\n // Fallback: return raw requirements\n return {\n status: 402,\n message: \"Payment required. Set DEXTER_PRIVATE_KEY for auto-pay, or use a Solana wallet to pay manually.\",\n requirements,\n };\n}\n\nexport function registerFetchTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): void {\n const hasWallet = wallet !== null;\n\n server.tool(\n \"x402_fetch\",\n hasWallet\n ? \"Call any x402-protected API with automatic payment. \" +\n \"Signs and pays using your local wallet. Returns the API response directly.\"\n : \"Call any x402-protected API. Returns payment requirements. \" +\n \"Configure DEXTER_PRIVATE_KEY to enable automatic payment.\",\n {\n url: z.string().url().describe(\"The x402 resource URL to call\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method\"),\n body: z.string().optional().describe(\"JSON request body for POST/PUT\"),\n },\n async (args) => {\n try {\n const result = await x402Fetch(\n { url: args.url, method: args.method, body: args.body },\n wallet,\n opts,\n );\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n ],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n\nexport async function cliFetch(\n url: string,\n opts: { method: string; body?: string; dev: boolean },\n): Promise<void> {\n try {\n const { loadOrCreateWallet } = await import(\"../wallet/index.js\");\n const wallet = await loadOrCreateWallet();\n const result = await x402Fetch(\n { url, method: opts.method, body: opts.body },\n wallet,\n opts,\n );\n console.log(JSON.stringify(result, null, 2));\n } catch (err: any) {\n const msg = err.cause?.code === \"ENOTFOUND\"\n ? `Could not reach ${url} — DNS lookup failed`\n : err.name === \"TimeoutError\"\n ? `Request to ${url} timed out`\n : err.message || String(err);\n console.log(JSON.stringify({ error: msg }, null, 2));\n process.exit(1);\n }\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\ninterface CheckOpts {\n dev: boolean;\n}\n\nasync function checkEndpoint(url: string, method: string): Promise<Record<string, unknown>> {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: method !== \"GET\" ? \"{}\" : undefined,\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.status !== 402) {\n if (res.status >= 500) {\n return { error: true, statusCode: res.status, message: \"Server error\" };\n }\n if (res.status >= 400) {\n return { error: true, statusCode: res.status, message: `Client error: ${res.status}` };\n }\n return { requiresPayment: false, statusCode: res.status, free: true };\n }\n\n let body: Record<string, unknown> | null = null;\n try {\n body = await res.json() as Record<string, unknown>;\n } catch {}\n\n const accepts = body?.accepts as Array<Record<string, unknown>> | undefined;\n if (!accepts?.length) {\n return {\n requiresPayment: true,\n statusCode: 402,\n error: \"No payment options found in 402 response\",\n };\n }\n\n const paymentOptions = accepts.map((a) => {\n const amount = Number(a.amount || a.maxAmountRequired || 0);\n const decimals = Number(a.extra && typeof a.extra === \"object\" && \"decimals\" in a.extra\n ? (a.extra as Record<string, unknown>).decimals\n : 6);\n return {\n price: amount / Math.pow(10, decimals),\n priceFormatted: `$${(amount / Math.pow(10, decimals)).toFixed(decimals > 2 ? 4 : 2)}`,\n network: a.network,\n scheme: a.scheme,\n asset: a.asset,\n payTo: a.payTo,\n };\n });\n\n return {\n requiresPayment: true,\n statusCode: 402,\n x402Version: body?.x402Version ?? 2,\n paymentOptions,\n resource: body?.resource,\n };\n}\n\nexport function registerCheckTool(server: McpServer, opts: CheckOpts): void {\n server.tool(\n \"x402_check\",\n \"Check if an endpoint requires x402 payment and see its pricing. \" +\n \"Does NOT make a payment — just probes for requirements.\",\n {\n url: z.string().url().describe(\"The URL to check\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method to probe with\"),\n },\n async (args) => {\n try {\n const result = await checkEndpoint(args.url, args.method);\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n ],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getSolanaBalance } from \"../wallet/index.js\";\nimport { WALLET_FILE } from \"../config.js\";\n\ninterface WalletToolOpts {\n dev: boolean;\n}\n\nexport function registerWalletTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: WalletToolOpts,\n): void {\n server.tool(\n \"x402_wallet\",\n \"Show wallet address, USDC balance, and deposit instructions. \" +\n \"The wallet is used to automatically pay for x402 API calls.\",\n {},\n async () => {\n if (!wallet) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n error: \"No wallet configured\",\n tip: \"Set DEXTER_PRIVATE_KEY env var or run `npx @dexterai/mcp wallet` to create one.\",\n }, null, 2),\n },\n ],\n };\n }\n\n try {\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(\n {\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n networkName: \"Solana Mainnet\",\n balances: {\n sol: balance.sol,\n usdc: balance.usdc,\n },\n walletFile: WALLET_FILE,\n tip:\n balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n },\n null,\n 2,\n ),\n },\n ],\n };\n } catch (err: any) {\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify({ error: err.message }) },\n ],\n isError: true,\n };\n }\n },\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VERSION } from \"../config.js\";\nimport { registerSearchTool } from \"../tools/search.js\";\nimport { registerFetchTool } from \"../tools/fetch.js\";\nimport { registerCheckTool } from \"../tools/check.js\";\nimport { registerWalletTool } from \"../tools/wallet-tool.js\";\nimport { loadOrCreateWallet } from \"../wallet/index.js\";\n\nexport interface ServerOptions {\n transport: \"stdio\" | \"http\";\n dev: boolean;\n}\n\nexport async function startServer(opts: ServerOptions): Promise<void> {\n let wallet;\n try {\n wallet = await loadOrCreateWallet();\n } catch (err: any) {\n console.error(`[dexter-mcp] Wallet initialization failed: ${err.message}`);\n console.error(\"[dexter-mcp] Starting in search-only mode. Set DEXTER_PRIVATE_KEY or fix ~/.dexterai-mcp/wallet.json to enable payments.\");\n wallet = null;\n }\n\n const server = new McpServer({\n name: \"Dexter x402 Gateway\",\n version: VERSION,\n });\n\n registerSearchTool(server, opts);\n registerFetchTool(server, wallet, opts);\n registerCheckTool(server, opts);\n registerWalletTool(server, wallet, opts);\n\n if (opts.transport !== \"stdio\") {\n console.error(\"HTTP transport not yet implemented. Use --transport=stdio\");\n process.exit(1);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n const shutdown = async () => {\n await server.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport type ClientId =\n | \"cursor\"\n | \"claude-code\"\n | \"codex\"\n | \"vscode\"\n | \"windsurf\"\n | \"gemini-cli\";\n\ninterface ClientMeta {\n name: string;\n description: string;\n}\n\nexport const CLIENTS: Record<ClientId, ClientMeta> = {\n cursor: {\n name: \"Cursor\",\n description: \"Cursor AI code editor\",\n },\n \"claude-code\": {\n name: \"Claude Code\",\n description: \"Anthropic Claude Code CLI\",\n },\n codex: {\n name: \"Codex\",\n description: \"OpenAI Codex CLI\",\n },\n vscode: {\n name: \"VS Code\",\n description: \"Visual Studio Code with MCP support\",\n },\n windsurf: {\n name: \"Windsurf\",\n description: \"Codeium Windsurf editor\",\n },\n \"gemini-cli\": {\n name: \"Gemini CLI\",\n description: \"Google Gemini CLI\",\n },\n};\n\ninterface ClientConfig {\n configPath: string;\n sectionKey: string;\n entry: Record<string, unknown>;\n manual?: boolean;\n}\n\nconst SERVER_CMD = {\n command: \"npx\",\n args: [\"-y\", \"@dexterai/mcp@latest\"],\n};\n\nconst SERVER_CMD_DEV = {\n command: \"node\",\n args: [process.cwd() + \"/dist/index.js\", \"--dev\"],\n};\n\nfunction getConfigDir(): string {\n const platform = process.platform;\n if (platform === \"win32\") {\n return process.env.APPDATA || join(homedir(), \"AppData\", \"Roaming\");\n }\n if (platform === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\");\n }\n return process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n}\n\nexport function getClientConfig(client: ClientId, dev: boolean): ClientConfig {\n const cmd = dev ? SERVER_CMD_DEV : SERVER_CMD;\n\n switch (client) {\n case \"cursor\":\n return {\n configPath: join(homedir(), \".cursor\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"claude-code\":\n return {\n configPath: join(homedir(), \".claude.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"codex\": {\n const codexHome = process.env.CODEX_HOME || join(homedir(), \".codex\");\n return {\n configPath: join(codexHome, \"config.toml\"),\n sectionKey: \"mcp_servers\",\n entry: cmd,\n manual: true, // TOML requires different handling\n };\n }\n\n case \"vscode\": {\n const configDir = getConfigDir();\n const vscodeDirs = [\"Code\", \"Code - Insiders\"];\n const dir = vscodeDirs.find((d) => existsSync(join(configDir, d))) || \"Code\";\n return {\n configPath: join(configDir, dir, \"User\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n\n case \"windsurf\":\n return {\n configPath: join(homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"gemini-cli\":\n return {\n configPath: join(homedir(), \".gemini\", \"settings.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { loadOrCreateWallet } from \"../../wallet/index.js\";\nimport { getClientConfig, CLIENTS, type ClientId } from \"./clients.js\";\n\ninterface InstallOpts {\n client?: string;\n yes: boolean;\n dev: boolean;\n}\n\nexport async function runInstall(opts: InstallOpts): Promise<void> {\n // Step 1: ensure wallet exists\n console.log(\"Setting up wallet...\");\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.error(\"Failed to create wallet. Exiting.\");\n process.exit(1);\n }\n console.log(`Wallet: ${wallet.info.solanaAddress}\\n`);\n\n // Step 2: pick client\n let clientId = opts.client as ClientId | undefined;\n\n if (!clientId) {\n if (opts.yes) {\n console.error(\"--client is required when using --yes\");\n process.exit(1);\n }\n\n console.log(\"Select an AI client to install into:\\n\");\n const ids = Object.keys(CLIENTS) as ClientId[];\n ids.forEach((id, i) => console.log(` ${i + 1}. ${CLIENTS[id].name}`));\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\"Choice (number): \", resolve);\n });\n rl.close();\n\n const idx = parseInt(answer, 10) - 1;\n if (idx < 0 || idx >= ids.length) {\n console.error(\"Invalid choice.\");\n process.exit(1);\n }\n clientId = ids[idx];\n }\n\n if (!CLIENTS[clientId]) {\n console.error(`Unknown client: ${clientId}`);\n console.error(`Available: ${Object.keys(CLIENTS).join(\", \")}`);\n process.exit(1);\n }\n\n // Step 3: write config\n const config = getClientConfig(clientId, opts.dev);\n\n if (config.manual) {\n console.log(`\\n${CLIENTS[clientId].name} requires manual configuration.\\n`);\n console.log(\"Add this to your MCP config:\\n\");\n console.log(JSON.stringify(config.entry, null, 2));\n console.log(`\\nConfig file: ${config.configPath}`);\n return;\n }\n\n console.log(`\\nInstalling into ${CLIENTS[clientId].name}...`);\n\n mkdirSync(dirname(config.configPath), { recursive: true });\n\n let existing: Record<string, unknown> = {};\n if (existsSync(config.configPath)) {\n const raw = readFileSync(config.configPath, \"utf-8\");\n try {\n existing = JSON.parse(raw);\n } catch {\n console.error(`Warning: ${config.configPath} contains invalid JSON. Backing up and creating fresh.`);\n copyFileSync(config.configPath, config.configPath + \".bak\");\n existing = {};\n }\n // Back up valid configs too\n if (Object.keys(existing).length > 0) {\n copyFileSync(config.configPath, config.configPath + \".bak\");\n }\n }\n\n const section = (existing[config.sectionKey] as Record<string, unknown>) || {};\n section[\"dexter-x402\"] = config.entry;\n existing[config.sectionKey] = section;\n\n writeFileSync(config.configPath, JSON.stringify(existing, null, 2) + \"\\n\");\n\n console.log(`Written to ${config.configPath}`);\n console.log(`\\nDexter x402 Gateway installed for ${CLIENTS[clientId].name}.`);\n console.log(`Wallet: ${wallet.info.solanaAddress}`);\n console.log(`\\nDeposit USDC (Solana) to start paying for x402 APIs.`);\n}\n","import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\nasync function main() {\n await yargs(hideBin(process.argv))\n .scriptName(\"@dexterai/mcp\")\n .usage(\"$0 [command] [options]\")\n .option(\"dev\", {\n type: \"boolean\",\n description: \"Use localhost endpoints instead of production\",\n default: false,\n })\n .command(\n [\"$0\", \"server\"],\n \"Start the MCP server (default)\",\n (y) =>\n y.option(\"transport\", {\n choices: [\"stdio\", \"http\"] as const,\n default: \"stdio\" as const,\n description: \"Transport mode\",\n }),\n async (args) => {\n const { startServer } = await import(\"./server/index.js\");\n await startServer({\n transport: args.transport,\n dev: args.dev,\n });\n },\n )\n .command(\n \"install\",\n \"Install Dexter MCP into an AI client (Cursor, Claude, Codex, etc.)\",\n (y) =>\n y\n .option(\"client\", {\n type: \"string\",\n description: \"Client to install into\",\n })\n .option(\"yes\", {\n alias: \"y\",\n type: \"boolean\",\n description: \"Skip prompts\",\n default: false,\n }),\n async (args) => {\n const { runInstall } = await import(\"./cli/install/index.js\");\n await runInstall({ client: args.client, yes: args.yes, dev: args.dev });\n },\n )\n .command(\n \"wallet\",\n \"Show wallet address and balances\",\n () => {},\n async (args) => {\n const { showWalletInfo } = await import(\"./wallet/index.js\");\n await showWalletInfo({ dev: args.dev });\n },\n )\n .command(\n \"search <query>\",\n \"Search the Dexter x402 marketplace\",\n (y) =>\n y.positional(\"query\", { type: \"string\", demandOption: true }),\n async (args) => {\n const { cliSearch } = await import(\"./tools/search.js\");\n await cliSearch(args.query!, { dev: args.dev });\n },\n )\n .command(\n \"fetch <url>\",\n \"Fetch an x402-protected resource with automatic payment\",\n (y) =>\n y\n .positional(\"url\", { type: \"string\", demandOption: true })\n .option(\"method\", {\n choices: [\"GET\", \"POST\", \"PUT\", \"DELETE\"] as const,\n default: \"GET\" as const,\n })\n .option(\"body\", { type: \"string\", description: \"JSON request body\" }),\n async (args) => {\n const { cliFetch } = await import(\"./tools/fetch.js\");\n await cliFetch(args.url!, {\n method: args.method,\n body: args.body,\n dev: args.dev,\n });\n },\n )\n .strict()\n .help()\n .parseAsync();\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":"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","names":["readFileSync","keypair","z","loadOrCreateWallet","z","homedir","join","existsSync","existsSync","readFileSync","writeFileSync","mkdirSync","copyFileSync","startServer","runInstall","showWalletInfo","cliSearch","cliFetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/tools/search.ts","../src/wallet/index.ts","../src/tools/fetch.ts","../src/tools/check.ts","../src/tools/wallet-tool.ts","../src/server/index.ts","../src/cli/install/clients.ts","../src/cli/install/index.ts","../src/index.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname as pathDirname } from \"node:path\";\n\nexport const DATA_DIR = join(homedir(), \".dexterai-mcp\");\nexport const WALLET_FILE = join(DATA_DIR, \"wallet.json\");\n\nexport const DEXTER_API_PROD = process.env.DEXTER_API_URL || \"https://x402.dexter.cash\";\nexport const DEXTER_API_DEV = \"http://127.0.0.1:3030\";\nexport const SOLANA_RPC_URL = process.env.SOLANA_RPC_URL || \"https://api.dexter.cash/api/solana/rpc\";\n\nexport const MARKETPLACE_PATH = \"/api/facilitator/marketplace/resources\";\n\nexport function getApiBase(dev: boolean): string {\n return dev ? DEXTER_API_DEV : DEXTER_API_PROD;\n}\n\nfunction loadVersion(): string {\n try {\n const here = pathDirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, \"..\", \"package.json\"), \"utf-8\"));\n return pkg.version || \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const VERSION = loadVersion();\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getApiBase, MARKETPLACE_PATH } from \"../config.js\";\n\ninterface SearchOpts {\n dev: boolean;\n}\n\ninterface MarketplaceResource {\n resourceUrl: string;\n displayName?: string;\n description?: string | null;\n method?: string;\n priceUsdc?: number | null;\n priceLabel?: string | null;\n priceNetwork?: string | null;\n qualityScore?: number | null;\n verificationStatus?: string | null;\n totalSettlements?: number;\n totalVolumeUsdc?: number;\n category?: string | null;\n seller?: { displayName?: string | null };\n reputationScore?: number | null;\n}\n\nfunction formatResource(r: MarketplaceResource) {\n return {\n name: r.displayName || r.resourceUrl,\n url: r.resourceUrl,\n method: r.method || \"GET\",\n price: r.priceLabel || (r.priceUsdc != null ? `$${r.priceUsdc.toFixed(2)}` : \"free\"),\n network: r.priceNetwork || null,\n description: r.description || \"\",\n category: r.category || \"uncategorized\",\n qualityScore: r.qualityScore ?? null,\n verified: r.verificationStatus === \"pass\",\n totalCalls: r.totalSettlements ?? 0,\n seller: r.seller?.displayName || null,\n };\n}\n\nasync function searchMarketplace(\n params: {\n query?: string;\n category?: string;\n network?: string;\n maxPriceUsdc?: number;\n verifiedOnly?: boolean;\n sort?: string;\n limit?: number;\n },\n opts: SearchOpts,\n) {\n const qs = new URLSearchParams();\n if (params.query) qs.set(\"search\", params.query);\n if (params.category) qs.set(\"category\", params.category);\n if (params.network) qs.set(\"network\", params.network);\n if (params.maxPriceUsdc != null) qs.set(\"maxPrice\", String(params.maxPriceUsdc));\n if (params.verifiedOnly) qs.set(\"verified\", \"true\");\n qs.set(\"sort\", params.sort || \"quality_score\");\n qs.set(\"order\", \"desc\");\n qs.set(\"limit\", String(Math.min(params.limit || 20, 50)));\n\n const url = `${getApiBase(opts.dev)}${MARKETPLACE_PATH}?${qs}`;\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Marketplace returned ${res.status}: ${await res.text().catch(() => \"\")}`);\n }\n\n const data = await res.json() as { resources?: MarketplaceResource[] };\n return {\n resources: (data.resources || []).map(formatResource),\n total: data.resources?.length || 0,\n };\n}\n\nexport function registerSearchTool(server: McpServer, opts: SearchOpts): void {\n server.tool(\n \"x402_search\",\n \"Search the Dexter x402 marketplace for paid API resources. \" +\n \"Returns services with pricing, quality scores, and verification status. \" +\n \"Use this to discover APIs an agent can pay for and call with x402_fetch.\",\n {\n query: z.string().optional().describe(\"Search term, e.g. 'token analysis', 'image generation'\"),\n category: z.string().optional().describe(\"Filter by category\"),\n network: z.string().optional().describe(\"Filter by payment network: 'solana', 'base', 'polygon'\"),\n maxPriceUsdc: z.number().optional().describe(\"Maximum price per call in USDC\"),\n verifiedOnly: z.boolean().optional().describe(\"Only return verified endpoints\"),\n sort: z\n .enum([\"relevance\", \"quality_score\", \"settlements\", \"volume\", \"recent\"])\n .optional()\n .describe(\"Sort order (default: quality_score)\"),\n limit: z.number().optional().default(20).describe(\"Max results (1-50)\"),\n },\n async (args) => {\n try {\n const result = await searchMarketplace(args, opts);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(\n {\n success: true,\n count: result.total,\n resources: result.resources,\n tip: \"Use x402_fetch to call any of these endpoints.\",\n },\n null,\n 2,\n ),\n },\n ],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n\nexport async function cliSearch(query: string, opts: { dev: boolean }): Promise<void> {\n try {\n const result = await searchMarketplace({ query }, opts);\n console.log(JSON.stringify({ success: true, count: result.total, resources: result.resources }, null, 2));\n } catch (err: any) {\n console.log(JSON.stringify({ error: err.message || String(err) }, null, 2));\n process.exit(1);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { Keypair, Connection, PublicKey } from \"@solana/web3.js\";\nimport { getAssociatedTokenAddress } from \"@solana/spl-token\";\nimport bs58 from \"bs58\";\nimport { DATA_DIR, WALLET_FILE, SOLANA_RPC_URL } from \"../config.js\";\n\nexport interface WalletInfo {\n solanaPrivateKey: string;\n solanaAddress: string;\n evmPrivateKey?: string;\n evmAddress?: string;\n createdAt: string;\n}\n\nexport interface LoadedWallet {\n info: WalletInfo;\n solanaKeypair: Keypair;\n}\n\nconst USDC_MINT = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\n\nexport async function loadOrCreateWallet(): Promise<LoadedWallet | null> {\n // Env var override takes priority\n const envKey = process.env.DEXTER_PRIVATE_KEY || process.env.SOLANA_PRIVATE_KEY;\n if (envKey) {\n const keypair = keypairFromString(envKey);\n return {\n info: {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n },\n solanaKeypair: keypair,\n };\n }\n\n if (existsSync(WALLET_FILE)) {\n try {\n const raw = readFileSync(WALLET_FILE, \"utf-8\");\n const data = JSON.parse(raw) as WalletInfo;\n if (!data.solanaPrivateKey) throw new Error(\"Missing solanaPrivateKey\");\n const keypair = keypairFromString(data.solanaPrivateKey);\n if (keypair.secretKey.length !== 64) throw new Error(\"Invalid key length\");\n return { info: data, solanaKeypair: keypair };\n } catch (err: any) {\n console.error(`[dexter-mcp] Corrupted wallet file: ${err.message}`);\n console.error(`[dexter-mcp] Backing up to ${WALLET_FILE}.bak and creating fresh wallet.`);\n try { copyFileSync(WALLET_FILE, WALLET_FILE + \".bak\"); } catch {}\n }\n }\n\n // Generate new wallet\n const keypair = Keypair.generate();\n const info: WalletInfo = {\n solanaPrivateKey: bs58.encode(keypair.secretKey),\n solanaAddress: keypair.publicKey.toBase58(),\n createdAt: new Date().toISOString(),\n };\n\n mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(WALLET_FILE, JSON.stringify(info, null, 2), { mode: 0o600 });\n\n console.error(`[dexter-mcp] New wallet created: ${info.solanaAddress}`);\n console.error(`[dexter-mcp] Saved to ${WALLET_FILE}`);\n console.error(`[dexter-mcp] Deposit USDC (Solana) to this address to start paying for x402 APIs.`);\n\n return { info, solanaKeypair: keypair };\n}\n\nfunction keypairFromString(key: string): Keypair {\n try {\n // Try base58\n return Keypair.fromSecretKey(bs58.decode(key));\n } catch {\n // Try JSON array\n try {\n const arr = JSON.parse(key);\n if (Array.isArray(arr)) {\n return Keypair.fromSecretKey(Uint8Array.from(arr));\n }\n } catch {}\n throw new Error(\"Invalid private key format. Expected base58 string or JSON byte array.\");\n }\n}\n\nexport async function getSolanaBalance(\n address: string,\n rpcUrl?: string,\n): Promise<{ sol: number; usdc: number }> {\n try {\n const connection = new Connection(rpcUrl || SOLANA_RPC_URL, \"confirmed\");\n const pubkey = new PublicKey(address);\n\n const [solBalance, usdcBalance] = await Promise.all([\n connection.getBalance(pubkey).catch(() => 0),\n getUsdcBalance(connection, pubkey),\n ]);\n\n return { sol: solBalance / 1e9, usdc: usdcBalance };\n } catch (err: any) {\n console.error(`[dexter-mcp] RPC error fetching balance: ${err.message}`);\n return { sol: 0, usdc: 0 };\n }\n}\n\nasync function getUsdcBalance(connection: Connection, owner: PublicKey): Promise<number> {\n try {\n const ata = await getAssociatedTokenAddress(USDC_MINT, owner);\n const info = await connection.getTokenAccountBalance(ata);\n return Number(info.value.uiAmount ?? 0);\n } catch {\n return 0;\n }\n}\n\nexport async function showWalletInfo(opts: { dev: boolean }): Promise<void> {\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.log(JSON.stringify({ error: \"Failed to load wallet\" }));\n process.exit(1);\n }\n\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n\n console.log(JSON.stringify({\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n balances: {\n sol: balance.sol,\n usdc: balance.usdc,\n },\n walletFile: WALLET_FILE,\n tip: balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n }, null, 2));\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getApiBase } from \"../config.js\";\n\ninterface FetchOpts {\n dev: boolean;\n}\n\nasync function parseResponse(res: Response): Promise<unknown> {\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"json\")) {\n try { return await res.json(); } catch { return await res.text(); }\n }\n return await res.text();\n}\n\nfunction extractSettlement(res: Response): unknown {\n const header = res.headers.get(\"payment-response\") || res.headers.get(\"PAYMENT-RESPONSE\");\n if (!header) return null;\n try { return JSON.parse(atob(header)); } catch {\n try { return JSON.parse(header); } catch { return null; }\n }\n}\n\nfunction parse402(body: unknown): { requirements: Record<string, unknown> | null; firstAccept: Record<string, unknown> | null } {\n const obj = body as Record<string, unknown> | null;\n if (!obj?.accepts || !Array.isArray(obj.accepts)) return { requirements: null, firstAccept: null };\n return {\n requirements: { accepts: obj.accepts, x402Version: obj.x402Version ?? 2, resource: obj.resource },\n firstAccept: obj.accepts[0] as Record<string, unknown> || null,\n };\n}\n\nasync function createQrSession(\n accept: Record<string, unknown>,\n resourceUrl: string,\n dev: boolean,\n): Promise<Record<string, unknown>> {\n const sessionRes = await fetch(`${getApiBase(dev)}/v2/pay/session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n payTo: accept.payTo,\n amount: String(accept.amount || accept.maxAmountRequired),\n asset: accept.asset,\n feePayer: (accept.extra as Record<string, unknown>)?.feePayer || \"\",\n resourceUrl,\n }),\n });\n return await sessionRes.json() as Record<string, unknown>;\n}\n\nasync function pollSessionStatus(nonce: string, dev: boolean, maxAttempts = 60): Promise<Record<string, unknown>> {\n for (let i = 0; i < maxAttempts; i++) {\n await new Promise((r) => setTimeout(r, 2000));\n const res = await fetch(`${getApiBase(dev)}/v2/pay/status/${nonce}`);\n const status = await res.json() as Record<string, unknown>;\n if (status.state === \"paid\" || status.state === \"expired\") return status;\n }\n return { state: \"timeout\" };\n}\n\nasync function x402Fetch(\n params: { url: string; method: string; body?: string; headers?: Record<string, string> },\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): Promise<Record<string, unknown>> {\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(params.headers || {}),\n };\n const fetchOpts: RequestInit = {\n method: params.method || \"GET\",\n headers: requestHeaders,\n };\n if (params.body && params.method !== \"GET\") {\n fetchOpts.body = params.body;\n }\n\n const probeRes = await fetch(params.url, { ...fetchOpts, signal: AbortSignal.timeout(15_000) });\n\n if (probeRes.status !== 402) {\n return { status: probeRes.status, data: await parseResponse(probeRes) };\n }\n\n let body402: unknown = null;\n try { body402 = await probeRes.json(); } catch {\n try { body402 = await probeRes.text(); } catch {}\n }\n\n const { requirements, firstAccept } = parse402(body402);\n\n // Mode 1: Local wallet auto-pay\n if (wallet) {\n try {\n const { wrapFetch } = await import(\"@dexterai/x402/client\");\n const x402FetchFn = wrapFetch(fetch, {\n walletPrivateKey: wallet.info.solanaPrivateKey,\n });\n\n const paidRes = await x402FetchFn(params.url, fetchOpts);\n const data = await parseResponse(paidRes);\n const settlement = extractSettlement(paidRes);\n\n return {\n status: paidRes.status,\n data,\n payment: settlement ? { settled: true, details: settlement } : { settled: false },\n };\n } catch (err: any) {\n return { status: 402, error: `Payment failed: ${err.message}`, requirements };\n }\n }\n\n // Mode 2: QR pay (no local wallet)\n if (firstAccept && String(firstAccept.network || \"\").startsWith(\"solana\")) {\n try {\n const session = await createQrSession(firstAccept, params.url, opts.dev);\n\n if (!session.ok) {\n return { status: 402, error: \"Failed to create payment session\", requirements };\n }\n\n return {\n status: 402,\n mode: \"qr\",\n message: \"Scan the QR code with Phantom or Solflare to pay, then this tool will automatically complete the request.\",\n qr: {\n solanaPayUrl: session.solanaPayUrl,\n nonce: session.nonce,\n expiresAt: session.expiresAt,\n },\n pollUrl: `${getApiBase(opts.dev)}/v2/pay/status/${session.nonce}`,\n requirements,\n };\n } catch {\n // Fall through to manual mode\n }\n }\n\n // Fallback: return raw requirements\n return {\n status: 402,\n message: \"Payment required. Set DEXTER_PRIVATE_KEY for auto-pay, or use a Solana wallet to pay manually.\",\n requirements,\n };\n}\n\nexport function registerFetchTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: FetchOpts,\n): void {\n const hasWallet = wallet !== null;\n\n server.tool(\n \"x402_fetch\",\n hasWallet\n ? \"Call any x402-protected API with automatic payment. \" +\n \"Signs and pays using your local wallet. Returns the API response directly.\"\n : \"Call any x402-protected API. Returns payment requirements. \" +\n \"Configure DEXTER_PRIVATE_KEY to enable automatic payment.\",\n {\n url: z.string().url().describe(\"The x402 resource URL to call\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method\"),\n body: z.string().optional().describe(\"JSON request body for POST/PUT\"),\n },\n async (args) => {\n try {\n const result = await x402Fetch(\n { url: args.url, method: args.method, body: args.body },\n wallet,\n opts,\n );\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n ],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n\nexport async function cliFetch(\n url: string,\n opts: { method: string; body?: string; dev: boolean },\n): Promise<void> {\n try {\n const { loadOrCreateWallet } = await import(\"../wallet/index.js\");\n const wallet = await loadOrCreateWallet();\n const result = await x402Fetch(\n { url, method: opts.method, body: opts.body },\n wallet,\n opts,\n );\n console.log(JSON.stringify(result, null, 2));\n } catch (err: any) {\n const msg = err.cause?.code === \"ENOTFOUND\"\n ? `Could not reach ${url} — DNS lookup failed`\n : err.name === \"TimeoutError\"\n ? `Request to ${url} timed out`\n : err.message || String(err);\n console.log(JSON.stringify({ error: msg }, null, 2));\n process.exit(1);\n }\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\ninterface CheckOpts {\n dev: boolean;\n}\n\nasync function checkEndpoint(url: string, method: string): Promise<Record<string, unknown>> {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: method !== \"GET\" ? \"{}\" : undefined,\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.status !== 402) {\n if (res.status >= 500) {\n return { error: true, statusCode: res.status, message: \"Server error\" };\n }\n if (res.status >= 400) {\n return { error: true, statusCode: res.status, message: `Client error: ${res.status}` };\n }\n return { requiresPayment: false, statusCode: res.status, free: true };\n }\n\n let body: Record<string, unknown> | null = null;\n try {\n body = await res.json() as Record<string, unknown>;\n } catch {}\n\n const accepts = body?.accepts as Array<Record<string, unknown>> | undefined;\n if (!accepts?.length) {\n return {\n requiresPayment: true,\n statusCode: 402,\n error: \"No payment options found in 402 response\",\n };\n }\n\n const paymentOptions = accepts.map((a) => {\n const amount = Number(a.amount || a.maxAmountRequired || 0);\n const decimals = Number(a.extra && typeof a.extra === \"object\" && \"decimals\" in a.extra\n ? (a.extra as Record<string, unknown>).decimals\n : 6);\n return {\n price: amount / Math.pow(10, decimals),\n priceFormatted: `$${(amount / Math.pow(10, decimals)).toFixed(decimals > 2 ? 4 : 2)}`,\n network: a.network,\n scheme: a.scheme,\n asset: a.asset,\n payTo: a.payTo,\n };\n });\n\n return {\n requiresPayment: true,\n statusCode: 402,\n x402Version: body?.x402Version ?? 2,\n paymentOptions,\n resource: body?.resource,\n };\n}\n\nexport function registerCheckTool(server: McpServer, opts: CheckOpts): void {\n server.tool(\n \"x402_check\",\n \"Check if an endpoint requires x402 payment and see its pricing. \" +\n \"Does NOT make a payment — just probes for requirements.\",\n {\n url: z.string().url().describe(\"The URL to check\"),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"])\n .default(\"GET\")\n .describe(\"HTTP method to probe with\"),\n },\n async (args) => {\n try {\n const result = await checkEndpoint(args.url, args.method);\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n ],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: err.message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { LoadedWallet } from \"../wallet/index.js\";\nimport { getSolanaBalance } from \"../wallet/index.js\";\nimport { WALLET_FILE } from \"../config.js\";\n\ninterface WalletToolOpts {\n dev: boolean;\n}\n\nexport function registerWalletTool(\n server: McpServer,\n wallet: LoadedWallet | null,\n opts: WalletToolOpts,\n): void {\n server.tool(\n \"x402_wallet\",\n \"Show wallet address, USDC balance, and deposit instructions. \" +\n \"The wallet is used to automatically pay for x402 API calls.\",\n {},\n async () => {\n if (!wallet) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n error: \"No wallet configured\",\n tip: \"Set DEXTER_PRIVATE_KEY env var or run `npx @dexterai/mcp wallet` to create one.\",\n }, null, 2),\n },\n ],\n };\n }\n\n try {\n const balance = await getSolanaBalance(wallet.info.solanaAddress);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(\n {\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n networkName: \"Solana Mainnet\",\n balances: {\n sol: balance.sol,\n usdc: balance.usdc,\n },\n walletFile: WALLET_FILE,\n tip:\n balance.usdc === 0\n ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.`\n : undefined,\n },\n null,\n 2,\n ),\n },\n ],\n };\n } catch (err: any) {\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify({ error: err.message }) },\n ],\n isError: true,\n };\n }\n },\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VERSION } from \"../config.js\";\nimport { registerSearchTool } from \"../tools/search.js\";\nimport { registerFetchTool } from \"../tools/fetch.js\";\nimport { registerCheckTool } from \"../tools/check.js\";\nimport { registerWalletTool } from \"../tools/wallet-tool.js\";\nimport { loadOrCreateWallet } from \"../wallet/index.js\";\n\nexport interface ServerOptions {\n transport: \"stdio\" | \"http\";\n dev: boolean;\n}\n\nexport async function startServer(opts: ServerOptions): Promise<void> {\n let wallet;\n try {\n wallet = await loadOrCreateWallet();\n } catch (err: any) {\n console.error(`[dexter-mcp] Wallet initialization failed: ${err.message}`);\n console.error(\"[dexter-mcp] Starting in search-only mode. Set DEXTER_PRIVATE_KEY or fix ~/.dexterai-mcp/wallet.json to enable payments.\");\n wallet = null;\n }\n\n const server = new McpServer({\n name: \"Dexter x402 Gateway\",\n version: VERSION,\n });\n\n registerSearchTool(server, opts);\n registerFetchTool(server, wallet, opts);\n registerCheckTool(server, opts);\n registerWalletTool(server, wallet, opts);\n\n if (opts.transport !== \"stdio\") {\n console.error(\"HTTP transport not yet implemented. Use --transport=stdio\");\n process.exit(1);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n const shutdown = async () => {\n await server.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport type ClientId =\n | \"cursor\"\n | \"claude-code\"\n | \"codex\"\n | \"vscode\"\n | \"windsurf\"\n | \"gemini-cli\";\n\ninterface ClientMeta {\n name: string;\n description: string;\n}\n\nexport const CLIENTS: Record<ClientId, ClientMeta> = {\n cursor: {\n name: \"Cursor\",\n description: \"Cursor AI code editor\",\n },\n \"claude-code\": {\n name: \"Claude Code\",\n description: \"Anthropic Claude Code CLI\",\n },\n codex: {\n name: \"Codex\",\n description: \"OpenAI Codex CLI\",\n },\n vscode: {\n name: \"VS Code\",\n description: \"Visual Studio Code with MCP support\",\n },\n windsurf: {\n name: \"Windsurf\",\n description: \"Codeium Windsurf editor\",\n },\n \"gemini-cli\": {\n name: \"Gemini CLI\",\n description: \"Google Gemini CLI\",\n },\n};\n\ninterface ClientConfig {\n configPath: string;\n sectionKey: string;\n entry: Record<string, unknown>;\n manual?: boolean;\n}\n\nconst SERVER_CMD = {\n command: \"npx\",\n args: [\"-y\", \"@dexterai/mcp@latest\"],\n};\n\nconst SERVER_CMD_DEV = {\n command: \"node\",\n args: [process.cwd() + \"/dist/index.js\", \"--dev\"],\n};\n\nfunction getConfigDir(): string {\n const platform = process.platform;\n if (platform === \"win32\") {\n return process.env.APPDATA || join(homedir(), \"AppData\", \"Roaming\");\n }\n if (platform === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\");\n }\n return process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n}\n\nexport function getClientConfig(client: ClientId, dev: boolean): ClientConfig {\n const cmd = dev ? SERVER_CMD_DEV : SERVER_CMD;\n\n switch (client) {\n case \"cursor\":\n return {\n configPath: join(homedir(), \".cursor\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"claude-code\":\n return {\n configPath: join(homedir(), \".claude.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"codex\": {\n const codexHome = process.env.CODEX_HOME || join(homedir(), \".codex\");\n return {\n configPath: join(codexHome, \"config.toml\"),\n sectionKey: \"mcp_servers\",\n entry: cmd,\n manual: true, // TOML requires different handling\n };\n }\n\n case \"vscode\": {\n const configDir = getConfigDir();\n const vscodeDirs = [\"Code\", \"Code - Insiders\"];\n const dir = vscodeDirs.find((d) => existsSync(join(configDir, d))) || \"Code\";\n return {\n configPath: join(configDir, dir, \"User\", \"mcp.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n\n case \"windsurf\":\n return {\n configPath: join(homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n\n case \"gemini-cli\":\n return {\n configPath: join(homedir(), \".gemini\", \"settings.json\"),\n sectionKey: \"mcpServers\",\n entry: cmd,\n };\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { loadOrCreateWallet } from \"../../wallet/index.js\";\nimport { getClientConfig, CLIENTS, type ClientId } from \"./clients.js\";\n\ninterface InstallOpts {\n client?: string;\n yes: boolean;\n dev: boolean;\n}\n\nexport async function runInstall(opts: InstallOpts): Promise<void> {\n // Step 1: ensure wallet exists\n console.log(\"Setting up wallet...\");\n const wallet = await loadOrCreateWallet();\n if (!wallet) {\n console.error(\"Failed to create wallet. Exiting.\");\n process.exit(1);\n }\n console.log(`Wallet: ${wallet.info.solanaAddress}\\n`);\n\n // Step 2: pick client\n let clientId = opts.client as ClientId | undefined;\n\n if (!clientId) {\n if (opts.yes) {\n console.error(\"--client is required when using --yes\");\n process.exit(1);\n }\n\n console.log(\"Select an AI client to install into:\\n\");\n const ids = Object.keys(CLIENTS) as ClientId[];\n ids.forEach((id, i) => console.log(` ${i + 1}. ${CLIENTS[id].name}`));\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\"Choice (number): \", resolve);\n });\n rl.close();\n\n const idx = parseInt(answer, 10) - 1;\n if (idx < 0 || idx >= ids.length) {\n console.error(\"Invalid choice.\");\n process.exit(1);\n }\n clientId = ids[idx];\n }\n\n if (!CLIENTS[clientId]) {\n console.error(`Unknown client: ${clientId}`);\n console.error(`Available: ${Object.keys(CLIENTS).join(\", \")}`);\n process.exit(1);\n }\n\n // Step 3: write config\n const config = getClientConfig(clientId, opts.dev);\n\n if (config.manual) {\n console.log(`\\n${CLIENTS[clientId].name} requires manual configuration.\\n`);\n console.log(\"Add this to your MCP config:\\n\");\n console.log(JSON.stringify(config.entry, null, 2));\n console.log(`\\nConfig file: ${config.configPath}`);\n return;\n }\n\n console.log(`\\nInstalling into ${CLIENTS[clientId].name}...`);\n\n mkdirSync(dirname(config.configPath), { recursive: true });\n\n let existing: Record<string, unknown> = {};\n if (existsSync(config.configPath)) {\n const raw = readFileSync(config.configPath, \"utf-8\");\n try {\n existing = JSON.parse(raw);\n } catch {\n console.error(`Warning: ${config.configPath} contains invalid JSON. Backing up and creating fresh.`);\n copyFileSync(config.configPath, config.configPath + \".bak\");\n existing = {};\n }\n // Back up valid configs too\n if (Object.keys(existing).length > 0) {\n copyFileSync(config.configPath, config.configPath + \".bak\");\n }\n }\n\n const section = (existing[config.sectionKey] as Record<string, unknown>) || {};\n section[\"dexter-x402\"] = config.entry;\n existing[config.sectionKey] = section;\n\n writeFileSync(config.configPath, JSON.stringify(existing, null, 2) + \"\\n\");\n\n console.log(`Written to ${config.configPath}`);\n console.log(`\\nDexter x402 Gateway installed for ${CLIENTS[clientId].name}.`);\n console.log(`Wallet: ${wallet.info.solanaAddress}`);\n console.log(`\\nDeposit USDC (Solana) to start paying for x402 APIs.`);\n}\n","import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\nasync function main() {\n await yargs(hideBin(process.argv))\n .scriptName(\"@dexterai/mcp\")\n .usage(\"$0 [command] [options]\")\n .option(\"dev\", {\n type: \"boolean\",\n description: \"Use localhost endpoints instead of production\",\n default: false,\n })\n .command(\n [\"$0\", \"server\"],\n \"Start the MCP server (default)\",\n (y) =>\n y.option(\"transport\", {\n choices: [\"stdio\", \"http\"] as const,\n default: \"stdio\" as const,\n description: \"Transport mode\",\n }),\n async (args) => {\n const { startServer } = await import(\"./server/index.js\");\n await startServer({\n transport: args.transport,\n dev: args.dev,\n });\n },\n )\n .command(\n \"install\",\n \"Install Dexter MCP into an AI client (Cursor, Claude, Codex, etc.)\",\n (y) =>\n y\n .option(\"client\", {\n type: \"string\",\n description: \"Client to install into\",\n })\n .option(\"yes\", {\n alias: \"y\",\n type: \"boolean\",\n description: \"Skip prompts\",\n default: false,\n }),\n async (args) => {\n const { runInstall } = await import(\"./cli/install/index.js\");\n await runInstall({ client: args.client, yes: args.yes, dev: args.dev });\n },\n )\n .command(\n \"wallet\",\n \"Show wallet address and balances\",\n () => {},\n async (args) => {\n const { showWalletInfo } = await import(\"./wallet/index.js\");\n await showWalletInfo({ dev: args.dev });\n },\n )\n .command(\n \"search <query>\",\n \"Search the Dexter x402 marketplace\",\n (y) =>\n y.positional(\"query\", { type: \"string\", demandOption: true }),\n async (args) => {\n const { cliSearch } = await import(\"./tools/search.js\");\n await cliSearch(args.query!, { dev: args.dev });\n },\n )\n .command(\n \"fetch <url>\",\n \"Fetch an x402-protected resource with automatic payment\",\n (y) =>\n y\n .positional(\"url\", { type: \"string\", demandOption: true })\n .option(\"method\", {\n choices: [\"GET\", \"POST\", \"PUT\", \"DELETE\"] as const,\n default: \"GET\" as const,\n })\n .option(\"body\", { type: \"string\", description: \"JSON request body\" }),\n async (args) => {\n const { cliFetch } = await import(\"./tools/fetch.js\");\n await cliFetch(args.url!, {\n method: args.method,\n body: args.body,\n dev: args.dev,\n });\n },\n )\n .strict()\n .help()\n .parseAsync();\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":"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","names":["readFileSync","keypair","z","loadOrCreateWallet","z","homedir","join","existsSync","existsSync","readFileSync","writeFileSync","mkdirSync","copyFileSync","startServer","runInstall","showWalletInfo","cliSearch","cliFetch"]}
|