@dexterai/mcp 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +83 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -41,6 +41,59 @@ var init_config = __esm({
|
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
+
// src/widget-meta.ts
|
|
45
|
+
function widgetMeta(templateUri, invoking, invoked, description) {
|
|
46
|
+
return {
|
|
47
|
+
"openai/outputTemplate": templateUri,
|
|
48
|
+
"openai/resultCanProduceWidget": true,
|
|
49
|
+
"openai/widgetAccessible": true,
|
|
50
|
+
"openai/widgetDomain": WIDGET_DOMAIN,
|
|
51
|
+
"openai/widgetPrefersBorder": true,
|
|
52
|
+
"openai/widgetCSP": WIDGET_CSP,
|
|
53
|
+
"openai/toolInvocation/invoking": invoking,
|
|
54
|
+
"openai/toolInvocation/invoked": invoked,
|
|
55
|
+
"openai/widgetDescription": description
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
var WIDGET_DOMAIN, WIDGET_CSP, SEARCH_META, FETCH_META, CHECK_META, WALLET_META;
|
|
59
|
+
var init_widget_meta = __esm({
|
|
60
|
+
"src/widget-meta.ts"() {
|
|
61
|
+
"use strict";
|
|
62
|
+
WIDGET_DOMAIN = "https://dexter.cash";
|
|
63
|
+
WIDGET_CSP = {
|
|
64
|
+
resource_domains: [
|
|
65
|
+
"https://cdn.dexscreener.com",
|
|
66
|
+
"https://raw.githubusercontent.com",
|
|
67
|
+
"https://metadata.jup.ag"
|
|
68
|
+
]
|
|
69
|
+
};
|
|
70
|
+
SEARCH_META = widgetMeta(
|
|
71
|
+
"ui://dexter/x402-marketplace-search",
|
|
72
|
+
"Searching marketplace\u2026",
|
|
73
|
+
"Results ready",
|
|
74
|
+
"Shows paid API search results as interactive cards with quality rings, prices, and fetch buttons."
|
|
75
|
+
);
|
|
76
|
+
FETCH_META = widgetMeta(
|
|
77
|
+
"ui://dexter/x402-fetch-result",
|
|
78
|
+
"Calling API\u2026",
|
|
79
|
+
"Response received",
|
|
80
|
+
"Shows API response data with payment receipt, transaction link, and settlement status."
|
|
81
|
+
);
|
|
82
|
+
CHECK_META = widgetMeta(
|
|
83
|
+
"ui://dexter/x402-pricing",
|
|
84
|
+
"Checking pricing\u2026",
|
|
85
|
+
"Pricing loaded",
|
|
86
|
+
"Shows endpoint pricing per blockchain with payment amounts and a pay button."
|
|
87
|
+
);
|
|
88
|
+
WALLET_META = widgetMeta(
|
|
89
|
+
"ui://dexter/x402-wallet",
|
|
90
|
+
"Loading wallet\u2026",
|
|
91
|
+
"Wallet loaded",
|
|
92
|
+
"Shows wallet address with copy button, USDC/SOL balances, and deposit QR code."
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
44
97
|
// src/tools/search.ts
|
|
45
98
|
var search_exports = {};
|
|
46
99
|
__export(search_exports, {
|
|
@@ -103,22 +156,16 @@ function registerSearchTool(server, opts) {
|
|
|
103
156
|
async (args) => {
|
|
104
157
|
try {
|
|
105
158
|
const result = await searchMarketplace(args, opts);
|
|
159
|
+
const data = {
|
|
160
|
+
success: true,
|
|
161
|
+
count: result.total,
|
|
162
|
+
resources: result.resources,
|
|
163
|
+
tip: "Use x402_fetch to call any of these endpoints."
|
|
164
|
+
};
|
|
106
165
|
return {
|
|
107
|
-
content: [
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
text: JSON.stringify(
|
|
111
|
-
{
|
|
112
|
-
success: true,
|
|
113
|
-
count: result.total,
|
|
114
|
-
resources: result.resources,
|
|
115
|
-
tip: "Use x402_fetch to call any of these endpoints."
|
|
116
|
-
},
|
|
117
|
-
null,
|
|
118
|
-
2
|
|
119
|
-
)
|
|
120
|
-
}
|
|
121
|
-
]
|
|
166
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
167
|
+
structuredContent: data,
|
|
168
|
+
_meta: SEARCH_META
|
|
122
169
|
};
|
|
123
170
|
} catch (err) {
|
|
124
171
|
return {
|
|
@@ -142,6 +189,7 @@ var init_search = __esm({
|
|
|
142
189
|
"src/tools/search.ts"() {
|
|
143
190
|
"use strict";
|
|
144
191
|
init_config();
|
|
192
|
+
init_widget_meta();
|
|
145
193
|
}
|
|
146
194
|
});
|
|
147
195
|
|
|
@@ -405,9 +453,9 @@ function registerFetchTool(server, wallet, opts) {
|
|
|
405
453
|
opts
|
|
406
454
|
);
|
|
407
455
|
return {
|
|
408
|
-
content: [
|
|
409
|
-
|
|
410
|
-
|
|
456
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
457
|
+
structuredContent: result,
|
|
458
|
+
_meta: FETCH_META
|
|
411
459
|
};
|
|
412
460
|
} catch (err) {
|
|
413
461
|
return {
|
|
@@ -438,6 +486,7 @@ var init_fetch = __esm({
|
|
|
438
486
|
"src/tools/fetch.ts"() {
|
|
439
487
|
"use strict";
|
|
440
488
|
init_config();
|
|
489
|
+
init_widget_meta();
|
|
441
490
|
}
|
|
442
491
|
});
|
|
443
492
|
|
|
@@ -504,9 +553,9 @@ function registerCheckTool(server, opts) {
|
|
|
504
553
|
try {
|
|
505
554
|
const result = await checkEndpoint(args.url, args.method);
|
|
506
555
|
return {
|
|
507
|
-
content: [
|
|
508
|
-
|
|
509
|
-
|
|
556
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
557
|
+
structuredContent: result,
|
|
558
|
+
_meta: CHECK_META
|
|
510
559
|
};
|
|
511
560
|
} catch (err) {
|
|
512
561
|
return {
|
|
@@ -520,6 +569,7 @@ function registerCheckTool(server, opts) {
|
|
|
520
569
|
var init_check = __esm({
|
|
521
570
|
"src/tools/check.ts"() {
|
|
522
571
|
"use strict";
|
|
572
|
+
init_widget_meta();
|
|
523
573
|
}
|
|
524
574
|
});
|
|
525
575
|
|
|
@@ -545,27 +595,18 @@ function registerWalletTool(server, wallet, opts) {
|
|
|
545
595
|
}
|
|
546
596
|
try {
|
|
547
597
|
const balance = await getSolanaBalance(wallet.info.solanaAddress);
|
|
598
|
+
const data = {
|
|
599
|
+
address: wallet.info.solanaAddress,
|
|
600
|
+
network: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
601
|
+
networkName: "Solana Mainnet",
|
|
602
|
+
balances: { sol: balance.sol, usdc: balance.usdc },
|
|
603
|
+
walletFile: WALLET_FILE,
|
|
604
|
+
tip: balance.usdc === 0 ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.` : void 0
|
|
605
|
+
};
|
|
548
606
|
return {
|
|
549
|
-
content: [
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
text: JSON.stringify(
|
|
553
|
-
{
|
|
554
|
-
address: wallet.info.solanaAddress,
|
|
555
|
-
network: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
556
|
-
networkName: "Solana Mainnet",
|
|
557
|
-
balances: {
|
|
558
|
-
sol: balance.sol,
|
|
559
|
-
usdc: balance.usdc
|
|
560
|
-
},
|
|
561
|
-
walletFile: WALLET_FILE,
|
|
562
|
-
tip: balance.usdc === 0 ? `Deposit USDC (Solana) to ${wallet.info.solanaAddress} to start paying for x402 APIs.` : void 0
|
|
563
|
-
},
|
|
564
|
-
null,
|
|
565
|
-
2
|
|
566
|
-
)
|
|
567
|
-
}
|
|
568
|
-
]
|
|
607
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
608
|
+
structuredContent: data,
|
|
609
|
+
_meta: WALLET_META
|
|
569
610
|
};
|
|
570
611
|
} catch (err) {
|
|
571
612
|
return {
|
|
@@ -583,6 +624,7 @@ var init_wallet_tool = __esm({
|
|
|
583
624
|
"use strict";
|
|
584
625
|
init_wallet();
|
|
585
626
|
init_config();
|
|
627
|
+
init_widget_meta();
|
|
586
628
|
}
|
|
587
629
|
});
|
|
588
630
|
|
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://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"]}
|
|
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"]}
|