@dexterai/mcp 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -113,7 +113,11 @@ function formatResource(r) {
113
113
  qualityScore: r.qualityScore ?? null,
114
114
  verified: r.verificationStatus === "pass",
115
115
  totalCalls: r.totalSettlements ?? 0,
116
- seller: r.seller?.displayName || null
116
+ seller: r.seller?.displayName || null,
117
+ sellerReputation: r.reputationScore ?? null,
118
+ authRequired: Boolean(r.authRequired),
119
+ authType: r.authType ?? null,
120
+ authHint: r.authHint ?? null
117
121
  };
118
122
  }
119
123
  async function searchMarketplace(params, opts) {
@@ -123,8 +127,7 @@ async function searchMarketplace(params, opts) {
123
127
  if (params.network) qs.set("network", params.network);
124
128
  if (params.maxPriceUsdc != null) qs.set("maxPrice", String(params.maxPriceUsdc));
125
129
  if (params.verifiedOnly) qs.set("verified", "true");
126
- qs.set("sort", params.sort || "quality_score");
127
- qs.set("order", "desc");
130
+ qs.set("sort", params.sort || "marketplace");
128
131
  qs.set("limit", String(Math.min(params.limit || 20, 50)));
129
132
  const url = `${getApiBase(opts.dev)}${MARKETPLACE_PATH}?${qs}`;
130
133
  const res = await fetch(url, {
@@ -150,7 +153,7 @@ function registerSearchTool(server, opts) {
150
153
  network: z.string().optional().describe("Filter by payment network: 'solana', 'base', 'polygon'"),
151
154
  maxPriceUsdc: z.number().optional().describe("Maximum price per call in USDC"),
152
155
  verifiedOnly: z.boolean().optional().describe("Only return verified endpoints"),
153
- sort: z.enum(["relevance", "quality_score", "settlements", "volume", "recent"]).optional().describe("Sort order (default: quality_score)"),
156
+ sort: z.enum(["relevance", "quality_score", "settlements", "volume", "recent", "marketplace"]).optional().describe("Sort order (default: marketplace)"),
154
157
  limit: z.number().optional().default(20).describe("Max results (1-50)")
155
158
  },
156
159
  async (args) => {
@@ -168,8 +171,11 @@ function registerSearchTool(server, opts) {
168
171
  _meta: SEARCH_META
169
172
  };
170
173
  } catch (err) {
174
+ const payload = { error: err.message || "search_failed", success: false, count: 0, resources: [] };
171
175
  return {
172
- content: [{ type: "text", text: JSON.stringify({ error: err.message }) }],
176
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
177
+ structuredContent: payload,
178
+ _meta: SEARCH_META,
173
179
  isError: true
174
180
  };
175
181
  }
@@ -350,20 +356,6 @@ function parse402(body) {
350
356
  firstAccept: obj.accepts[0] || null
351
357
  };
352
358
  }
353
- async function createQrSession(accept, resourceUrl, dev) {
354
- const sessionRes = await fetch(`${getApiBase(dev)}/v2/pay/session`, {
355
- method: "POST",
356
- headers: { "Content-Type": "application/json" },
357
- body: JSON.stringify({
358
- payTo: accept.payTo,
359
- amount: String(accept.amount || accept.maxAmountRequired),
360
- asset: accept.asset,
361
- feePayer: accept.extra?.feePayer || "",
362
- resourceUrl
363
- })
364
- });
365
- return await sessionRes.json();
366
- }
367
359
  async function x402Fetch(params, wallet, opts) {
368
360
  const requestHeaders = {
369
361
  "Content-Type": "application/json",
@@ -408,30 +400,9 @@ async function x402Fetch(params, wallet, opts) {
408
400
  return { status: 402, error: `Payment failed: ${err.message}`, requirements };
409
401
  }
410
402
  }
411
- if (firstAccept && String(firstAccept.network || "").startsWith("solana")) {
412
- try {
413
- const session = await createQrSession(firstAccept, params.url, opts.dev);
414
- if (!session.ok) {
415
- return { status: 402, error: "Failed to create payment session", requirements };
416
- }
417
- return {
418
- status: 402,
419
- mode: "qr",
420
- message: "Scan the QR code with Phantom or Solflare to pay, then this tool will automatically complete the request.",
421
- qr: {
422
- solanaPayUrl: session.solanaPayUrl,
423
- nonce: session.nonce,
424
- expiresAt: session.expiresAt
425
- },
426
- pollUrl: `${getApiBase(opts.dev)}/v2/pay/status/${session.nonce}`,
427
- requirements
428
- };
429
- } catch {
430
- }
431
- }
432
403
  return {
433
404
  status: 402,
434
- message: "Payment required. Set DEXTER_PRIVATE_KEY for auto-pay, or use a Solana wallet to pay manually.",
405
+ message: "Payment required. Configure DEXTER_PRIVATE_KEY for canonical x402 settlement or provide payment-signature manually.",
435
406
  requirements
436
407
  };
437
408
  }
@@ -485,13 +456,35 @@ async function cliFetch(url, opts) {
485
456
  var init_fetch = __esm({
486
457
  "src/tools/fetch.ts"() {
487
458
  "use strict";
488
- init_config();
489
459
  init_widget_meta();
490
460
  }
491
461
  });
492
462
 
493
463
  // src/tools/check.ts
494
464
  import { z as z3 } from "zod";
465
+ function parsePaymentRequiredHeader(headerValue) {
466
+ if (!headerValue) return null;
467
+ const candidates = [headerValue];
468
+ try {
469
+ candidates.push(Buffer.from(headerValue, "base64").toString("utf-8"));
470
+ } catch {
471
+ }
472
+ try {
473
+ const normalized = headerValue.replace(/-/g, "+").replace(/_/g, "/");
474
+ candidates.push(Buffer.from(normalized, "base64").toString("utf-8"));
475
+ } catch {
476
+ }
477
+ for (const candidate of candidates) {
478
+ try {
479
+ const parsed = JSON.parse(candidate);
480
+ if (parsed && typeof parsed === "object") {
481
+ return parsed;
482
+ }
483
+ } catch {
484
+ }
485
+ }
486
+ return null;
487
+ }
495
488
  async function checkEndpoint(url, method) {
496
489
  const res = await fetch(url, {
497
490
  method,
@@ -500,6 +493,15 @@ async function checkEndpoint(url, method) {
500
493
  signal: AbortSignal.timeout(15e3)
501
494
  });
502
495
  if (res.status !== 402) {
496
+ if (res.status === 401 || res.status === 403) {
497
+ const bodyText = await res.text().catch(() => "");
498
+ return {
499
+ error: true,
500
+ statusCode: res.status,
501
+ authRequired: true,
502
+ message: bodyText || "Provider authentication required before x402 payment flow."
503
+ };
504
+ }
503
505
  if (res.status >= 500) {
504
506
  return { error: true, statusCode: res.status, message: "Server error" };
505
507
  }
@@ -513,15 +515,21 @@ async function checkEndpoint(url, method) {
513
515
  body = await res.json();
514
516
  } catch {
515
517
  }
518
+ const headerParsed = parsePaymentRequiredHeader(
519
+ res.headers.get("PAYMENT-REQUIRED") || res.headers.get("payment-required")
520
+ );
521
+ const source = headerParsed && typeof headerParsed === "object" ? headerParsed : body;
516
522
  const accepts = body?.accepts;
517
- if (!accepts?.length) {
523
+ const acceptsFromHeader = source?.accepts;
524
+ const effectiveAccepts = accepts?.length ? accepts : acceptsFromHeader;
525
+ if (!effectiveAccepts?.length) {
518
526
  return {
519
527
  requiresPayment: true,
520
528
  statusCode: 402,
521
529
  error: "No payment options found in 402 response"
522
530
  };
523
531
  }
524
- const paymentOptions = accepts.map((a) => {
532
+ const paymentOptions = effectiveAccepts.map((a) => {
525
533
  const amount = Number(a.amount || a.maxAmountRequired || 0);
526
534
  const decimals = Number(a.extra && typeof a.extra === "object" && "decimals" in a.extra ? a.extra.decimals : 6);
527
535
  return {
@@ -536,9 +544,9 @@ async function checkEndpoint(url, method) {
536
544
  return {
537
545
  requiresPayment: true,
538
546
  statusCode: 402,
539
- x402Version: body?.x402Version ?? 2,
547
+ x402Version: source?.x402Version ?? 2,
540
548
  paymentOptions,
541
- resource: body?.resource
549
+ resource: source?.resource
542
550
  };
543
551
  }
544
552
  function registerCheckTool(server, opts) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/widget-meta.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","const WIDGET_DOMAIN = \"https://dexter.cash\";\n\nconst WIDGET_CSP = {\n resource_domains: [\n \"https://cdn.dexscreener.com\",\n \"https://raw.githubusercontent.com\",\n \"https://metadata.jup.ag\",\n ],\n};\n\nexport function widgetMeta(templateUri: string, invoking: string, invoked: string, description: string) {\n return {\n \"openai/outputTemplate\": templateUri,\n \"openai/resultCanProduceWidget\": true,\n \"openai/widgetAccessible\": true,\n \"openai/widgetDomain\": WIDGET_DOMAIN,\n \"openai/widgetPrefersBorder\": true,\n \"openai/widgetCSP\": WIDGET_CSP,\n \"openai/toolInvocation/invoking\": invoking,\n \"openai/toolInvocation/invoked\": invoked,\n \"openai/widgetDescription\": description,\n };\n}\n\nexport const SEARCH_META = widgetMeta(\n \"ui://dexter/x402-marketplace-search\",\n \"Searching marketplace\\u2026\",\n \"Results ready\",\n \"Shows paid API search results as interactive cards with quality rings, prices, and fetch buttons.\",\n);\n\nexport const FETCH_META = widgetMeta(\n \"ui://dexter/x402-fetch-result\",\n \"Calling API\\u2026\",\n \"Response received\",\n \"Shows API response data with payment receipt, transaction link, and settlement status.\",\n);\n\nexport const CHECK_META = widgetMeta(\n \"ui://dexter/x402-pricing\",\n \"Checking pricing\\u2026\",\n \"Pricing loaded\",\n \"Shows endpoint pricing per blockchain with payment amounts and a pay button.\",\n);\n\nexport const WALLET_META = widgetMeta(\n \"ui://dexter/x402-wallet\",\n \"Loading wallet\\u2026\",\n \"Wallet loaded\",\n \"Shows wallet address with copy button, USDC/SOL balances, and deposit QR code.\",\n);\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getApiBase, MARKETPLACE_PATH } from \"../config.js\";\nimport { SEARCH_META } from \"../widget-meta.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 const data = {\n success: true,\n count: result.total,\n resources: result.resources,\n tip: \"Use x402_fetch to call any of these endpoints.\",\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: SEARCH_META,\n } as any;\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\";\nimport { FETCH_META } from \"../widget-meta.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: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: FETCH_META,\n } as any;\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\";\nimport { CHECK_META } from \"../widget-meta.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: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: CHECK_META,\n } as any;\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\";\nimport { WALLET_META } from \"../widget-meta.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 const data = {\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n networkName: \"Solana Mainnet\",\n balances: { sol: balance.sol, usdc: balance.usdc },\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 };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: WALLET_META,\n } as any;\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/widget-meta.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","const WIDGET_DOMAIN = \"https://dexter.cash\";\n\nconst WIDGET_CSP = {\n resource_domains: [\n \"https://cdn.dexscreener.com\",\n \"https://raw.githubusercontent.com\",\n \"https://metadata.jup.ag\",\n ],\n};\n\nexport function widgetMeta(templateUri: string, invoking: string, invoked: string, description: string) {\n return {\n \"openai/outputTemplate\": templateUri,\n \"openai/resultCanProduceWidget\": true,\n \"openai/widgetAccessible\": true,\n \"openai/widgetDomain\": WIDGET_DOMAIN,\n \"openai/widgetPrefersBorder\": true,\n \"openai/widgetCSP\": WIDGET_CSP,\n \"openai/toolInvocation/invoking\": invoking,\n \"openai/toolInvocation/invoked\": invoked,\n \"openai/widgetDescription\": description,\n };\n}\n\nexport const SEARCH_META = widgetMeta(\n \"ui://dexter/x402-marketplace-search\",\n \"Searching marketplace\\u2026\",\n \"Results ready\",\n \"Shows paid API search results as interactive cards with quality rings, prices, and fetch buttons.\",\n);\n\nexport const FETCH_META = widgetMeta(\n \"ui://dexter/x402-fetch-result\",\n \"Calling API\\u2026\",\n \"Response received\",\n \"Shows API response data with payment receipt, transaction link, and settlement status.\",\n);\n\nexport const CHECK_META = widgetMeta(\n \"ui://dexter/x402-pricing\",\n \"Checking pricing\\u2026\",\n \"Pricing loaded\",\n \"Shows endpoint pricing per blockchain with payment amounts and a pay button.\",\n);\n\nexport const WALLET_META = widgetMeta(\n \"ui://dexter/x402-wallet\",\n \"Loading wallet\\u2026\",\n \"Wallet loaded\",\n \"Shows wallet address with copy button, USDC/SOL balances, and deposit QR code.\",\n);\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getApiBase, MARKETPLACE_PATH } from \"../config.js\";\nimport { SEARCH_META } from \"../widget-meta.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 authRequired?: boolean;\n authType?: string | null;\n authHint?: string | 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 sellerReputation: r.reputationScore ?? null,\n authRequired: Boolean(r.authRequired),\n authType: r.authType ?? null,\n authHint: r.authHint ?? 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 || \"marketplace\");\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\", \"marketplace\"])\n .optional()\n .describe(\"Sort order (default: marketplace)\"),\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 const data = {\n success: true,\n count: result.total,\n resources: result.resources,\n tip: \"Use x402_fetch to call any of these endpoints.\",\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: SEARCH_META,\n } as any;\n } catch (err: any) {\n const payload = { error: err.message || \"search_failed\", success: false, count: 0, resources: [] };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(payload, null, 2) }],\n structuredContent: payload,\n _meta: SEARCH_META,\n isError: true,\n } as any;\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\";\nimport { FETCH_META } from \"../widget-meta.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 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 // No local signing wallet: return canonical x402 requirements only.\n // Clients must settle using x402 payment-signature flow and retry.\n return {\n status: 402,\n message: \"Payment required. Configure DEXTER_PRIVATE_KEY for canonical x402 settlement or provide payment-signature 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: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: FETCH_META,\n } as any;\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\";\nimport { CHECK_META } from \"../widget-meta.js\";\n\ninterface CheckOpts {\n dev: boolean;\n}\n\nfunction parsePaymentRequiredHeader(headerValue: string | null): Record<string, unknown> | null {\n if (!headerValue) return null;\n const candidates = [headerValue];\n try { candidates.push(Buffer.from(headerValue, \"base64\").toString(\"utf-8\")); } catch {}\n try {\n const normalized = headerValue.replace(/-/g, \"+\").replace(/_/g, \"/\");\n candidates.push(Buffer.from(normalized, \"base64\").toString(\"utf-8\"));\n } catch {}\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate);\n if (parsed && typeof parsed === \"object\") {\n return parsed as Record<string, unknown>;\n }\n } catch {}\n }\n return null;\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 === 401 || res.status === 403) {\n const bodyText = await res.text().catch(() => \"\");\n return {\n error: true,\n statusCode: res.status,\n authRequired: true,\n message: bodyText || \"Provider authentication required before x402 payment flow.\",\n };\n }\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 headerParsed = parsePaymentRequiredHeader(\n res.headers.get(\"PAYMENT-REQUIRED\") || res.headers.get(\"payment-required\"),\n );\n const source = (headerParsed && typeof headerParsed === \"object\") ? headerParsed : body;\n const accepts = body?.accepts as Array<Record<string, unknown>> | undefined;\n const acceptsFromHeader = source?.accepts as Array<Record<string, unknown>> | undefined;\n const effectiveAccepts = accepts?.length ? accepts : acceptsFromHeader;\n if (!effectiveAccepts?.length) {\n return {\n requiresPayment: true,\n statusCode: 402,\n error: \"No payment options found in 402 response\",\n };\n }\n\n const paymentOptions = effectiveAccepts.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: source?.x402Version ?? 2,\n paymentOptions,\n resource: source?.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: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n _meta: CHECK_META,\n } as any;\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\";\nimport { WALLET_META } from \"../widget-meta.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 const data = {\n address: wallet.info.solanaAddress,\n network: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n networkName: \"Solana Mainnet\",\n balances: { sol: balance.sol, usdc: balance.usdc },\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 };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data,\n _meta: WALLET_META,\n } as any;\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dexterai/mcp",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "x402 gateway for AI agents — search, pay, and call any x402 API through Dexter",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",