@valeo-mcp/server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/budget/manager.ts","../src/receipts/store.ts","../src/clients/x402-base.ts","../src/clients/x402-solana.ts","../src/clients/ace.ts","../src/clients/sentinel.ts","../src/clients/four02md.ts","../src/server.ts","../src/tools/pay.ts","../src/tools/helpers.ts","../src/tools/wallet-balance.ts","../src/tools/get-credit.ts","../src/tools/repay-credit.ts","../src/tools/spending-history.ts","../src/tools/discover-apis.ts","../src/tools/set-budget.ts","../src/tools/estimate-cost.ts","../src/index.ts"],"sourcesContent":["import bs58 from \"bs58\";\nimport type { ValeoConfig } from \"./types.js\";\n\nexport function loadConfig(): ValeoConfig {\n const privateKey = process.env.VALEO_PRIVATE_KEY;\n if (!privateKey) {\n throw new Error(\n \"VALEO_PRIVATE_KEY is required.\\n\" +\n \" For Base/EVM: set a 0x-prefixed hex private key (66 chars)\\n\" +\n \" For Solana: set a base58-encoded secret key\\n\" +\n \" Example: VALEO_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n );\n }\n\n const chain = (process.env.VALEO_CHAIN || \"base\") as ValeoConfig[\"chain\"];\n const validChains: ValeoConfig[\"chain\"][] = [\"base\", \"base-sepolia\", \"solana\", \"solana-devnet\"];\n if (!validChains.includes(chain)) {\n throw new Error(`VALEO_CHAIN must be one of: ${validChains.join(\", \")}. Got: \"${chain}\"`);\n }\n\n if (chain.startsWith(\"base\")) {\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n throw new Error(\n `EVM private key must start with 0x and be 66 characters. Got ${privateKey.length} chars.`\n );\n }\n } else {\n try {\n const decoded = bs58.decode(privateKey);\n if (decoded.length !== 64) {\n throw new Error(`Solana secret key must decode to 64 bytes. Got ${decoded.length}.`);\n }\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n throw new Error(`Invalid Solana private key (base58 decode failed): ${err.message}`);\n }\n }\n\n return {\n privateKey,\n chain,\n aceApiKey: process.env.VALEO_ACE_API_KEY || undefined,\n aceBaseUrl: process.env.VALEO_ACE_BASE_URL || \"https://api.agentcreditengine.com\",\n sentinelApiKey: process.env.VALEO_SENTINEL_API_KEY || undefined,\n sentinelBaseUrl: process.env.VALEO_SENTINEL_BASE_URL || \"https://sentinel.valeocash.com\",\n four02mdBaseUrl: process.env.VALEO_402MD_BASE_URL || \"https://402md.valeoprotocol.io\",\n facilitatorUrl: process.env.VALEO_FACILITATOR_URL || \"https://x402.org/facilitator\",\n defaultMaxPerCall: parseFloat(process.env.VALEO_MAX_PER_CALL || \"1.00\"),\n defaultDailyLimit: parseFloat(process.env.VALEO_DAILY_LIMIT || \"50.00\"),\n defaultSessionLimit: parseFloat(process.env.VALEO_SESSION_LIMIT || \"10.00\"),\n };\n}\n","import type { BudgetConfig, BudgetStatus, SpendCheck, ValeoConfig } from \"../types.js\";\n\nexport class BudgetManager {\n private config: BudgetConfig;\n private sessionSpent = 0;\n private dailySpent = 0;\n private dailyResetAt: number;\n\n constructor(valeoConfig: ValeoConfig) {\n this.config = {\n maxPerCall: valeoConfig.defaultMaxPerCall,\n dailyLimit: valeoConfig.defaultDailyLimit,\n sessionLimit: valeoConfig.defaultSessionLimit,\n blockedEndpoints: [],\n allowedEndpoints: [],\n };\n this.dailyResetAt = this.getNextMidnightUTC();\n }\n\n private getNextMidnightUTC(): number {\n const now = new Date();\n const tomorrow = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() + 1));\n return tomorrow.getTime();\n }\n\n private checkDailyReset(): void {\n if (Date.now() >= this.dailyResetAt) {\n this.dailySpent = 0;\n this.dailyResetAt = this.getNextMidnightUTC();\n }\n }\n\n canSpend(amount: number, endpoint: string): SpendCheck {\n this.checkDailyReset();\n\n if (this.config.allowedEndpoints.length > 0) {\n const allowed = this.config.allowedEndpoints.some((pattern) => this.matchWildcard(endpoint, pattern));\n if (!allowed) {\n return {\n allowed: false,\n reason: `Endpoint \"${endpoint}\" is not in the allowlist. Use set_budget to update allowed_endpoints.`,\n };\n }\n }\n\n if (this.config.allowedEndpoints.length === 0 && this.config.blockedEndpoints.length > 0) {\n const blocked = this.config.blockedEndpoints.some((pattern) => this.matchWildcard(endpoint, pattern));\n if (blocked) {\n return {\n allowed: false,\n reason: `Endpoint \"${endpoint}\" is blocked. Use set_budget to update blocked_endpoints.`,\n };\n }\n }\n\n if (amount > this.config.maxPerCall) {\n return {\n allowed: false,\n reason: `Call costs $${amount.toFixed(4)} but max_per_call is $${this.config.maxPerCall.toFixed(2)}. Use set_budget to increase.`,\n };\n }\n\n if (this.sessionSpent + amount > this.config.sessionLimit) {\n return {\n allowed: false,\n reason: `Session limit reached. Spent $${this.sessionSpent.toFixed(4)} of $${this.config.sessionLimit.toFixed(2)}. Use set_budget to increase session_limit.`,\n };\n }\n\n if (this.dailySpent + amount > this.config.dailyLimit) {\n return {\n allowed: false,\n reason: `Daily limit reached. Spent $${this.dailySpent.toFixed(4)} of $${this.config.dailyLimit.toFixed(2)} today. Use set_budget to increase daily_limit.`,\n };\n }\n\n return { allowed: true };\n }\n\n recordSpend(amount: number): void {\n this.checkDailyReset();\n this.sessionSpent += amount;\n this.dailySpent += amount;\n }\n\n getStatus(): BudgetStatus {\n this.checkDailyReset();\n return {\n config: { ...this.config },\n spending: {\n session: this.sessionSpent,\n today: this.dailySpent,\n remainingSession: Math.max(0, this.config.sessionLimit - this.sessionSpent),\n remainingDaily: Math.max(0, this.config.dailyLimit - this.dailySpent),\n },\n };\n }\n\n updateConfig(updates: Partial<BudgetConfig>): void {\n if (updates.maxPerCall !== undefined) this.config.maxPerCall = updates.maxPerCall;\n if (updates.dailyLimit !== undefined) this.config.dailyLimit = updates.dailyLimit;\n if (updates.sessionLimit !== undefined) this.config.sessionLimit = updates.sessionLimit;\n if (updates.blockedEndpoints !== undefined) this.config.blockedEndpoints = updates.blockedEndpoints;\n if (updates.allowedEndpoints !== undefined) this.config.allowedEndpoints = updates.allowedEndpoints;\n }\n\n private matchWildcard(value: string, pattern: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`, \"i\").test(value);\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Receipt } from \"../types.js\";\n\nexport class ReceiptStore {\n private receipts: Receipt[] = [];\n\n add(data: Omit<Receipt, \"id\" | \"timestamp\">): Receipt {\n const receipt: Receipt = {\n ...data,\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n this.receipts.push(receipt);\n return receipt;\n }\n\n getAll(options?: { limit?: number; since?: string; endpoint?: string }): Receipt[] {\n let results = [...this.receipts];\n\n if (options?.since) {\n const sinceTime = new Date(options.since).getTime();\n results = results.filter((r) => new Date(r.timestamp).getTime() >= sinceTime);\n }\n\n if (options?.endpoint) {\n const ep = options.endpoint.toLowerCase();\n results = results.filter((r) => r.endpoint.toLowerCase().includes(ep));\n }\n\n results.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n\n if (options?.limit) {\n results = results.slice(0, options.limit);\n }\n\n return results;\n }\n\n getTotalSpent(): number {\n return this.receipts.filter((r) => r.status === \"settled\").reduce((sum, r) => sum + r.amount, 0);\n }\n\n getTotalSpentToday(): number {\n const startOfDayUTC = new Date();\n startOfDayUTC.setUTCHours(0, 0, 0, 0);\n const startMs = startOfDayUTC.getTime();\n\n return this.receipts\n .filter((r) => r.status === \"settled\" && new Date(r.timestamp).getTime() >= startMs)\n .reduce((sum, r) => sum + r.amount, 0);\n }\n}\n","import { wrapFetchWithPayment } from \"x402-fetch\";\nimport type { Signer } from \"x402/types\";\nimport { createWalletClient, createPublicClient, http, parseAbi } from \"viem\";\nimport type { PublicClient, WalletClient } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base, baseSepolia } from \"viem/chains\";\n\nconst ERC20_BALANCE_ABI = parseAbi([\"function balanceOf(address owner) view returns (uint256)\"]);\n\nconst USDC_ADDRESSES: Record<\"base\" | \"base-sepolia\", `0x${string}`> = {\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"base-sepolia\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n};\n\nexport class X402BaseClient {\n private walletClient: WalletClient;\n private publicClient: PublicClient;\n private walletAddress: `0x${string}`;\n private chainName: \"base\" | \"base-sepolia\";\n\n constructor(privateKey: string, chain: \"base\" | \"base-sepolia\") {\n this.chainName = chain;\n const chainConfig = chain === \"base\" ? base : baseSepolia;\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n this.walletAddress = account.address;\n\n this.walletClient = createWalletClient({\n account,\n chain: chainConfig,\n transport: http(),\n }) as WalletClient;\n\n this.publicClient = createPublicClient({\n chain: chainConfig,\n transport: http(),\n }) as PublicClient;\n }\n\n createPaidFetch(maxUsd?: number): typeof globalThis.fetch {\n const maxValue = maxUsd !== undefined ? BigInt(Math.round(maxUsd * 1e6)) : undefined;\n\n return wrapFetchWithPayment(globalThis.fetch, this.walletClient as Signer, maxValue) as unknown as typeof globalThis.fetch;\n }\n\n async getUsdcBalance(): Promise<string> {\n const usdcAddress = USDC_ADDRESSES[this.chainName];\n const balance = await this.publicClient.readContract({\n address: usdcAddress,\n abi: ERC20_BALANCE_ABI,\n functionName: \"balanceOf\",\n args: [this.walletAddress],\n });\n return (Number(balance) / 1e6).toFixed(6);\n }\n\n async getEthBalance(): Promise<string> {\n const balance = await this.publicClient.getBalance({\n address: this.walletAddress,\n });\n return (Number(balance) / 1e18).toFixed(6);\n }\n\n getAddress(): string {\n return this.walletAddress;\n }\n\n getChain(): string {\n return this.chainName;\n }\n}\n","import { createX402Client } from \"x402-solana\";\nimport { Connection, Keypair, PublicKey } from \"@solana/web3.js\";\nimport { getAssociatedTokenAddress, getAccount } from \"@solana/spl-token\";\nimport bs58 from \"bs58\";\n\nconst USDC_MINTS: Record<\"solana\" | \"solana-devnet\", PublicKey> = {\n solana: new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"),\n \"solana-devnet\": new PublicKey(\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\"),\n};\n\nexport class X402SolanaClient {\n private keypair: Keypair;\n private connection: Connection;\n private network: \"solana\" | \"solana-devnet\";\n\n constructor(privateKeyBase58: string, chain: \"solana\" | \"solana-devnet\", rpcUrl?: string) {\n this.keypair = Keypair.fromSecretKey(bs58.decode(privateKeyBase58));\n this.network = chain;\n\n const defaultRpc =\n chain === \"solana\" ? \"https://api.mainnet-beta.solana.com\" : \"https://api.devnet.solana.com\";\n\n this.connection = new Connection(rpcUrl || defaultRpc);\n }\n\n createPaidFetch(maxUsd?: number): typeof globalThis.fetch {\n const amount = maxUsd !== undefined ? BigInt(Math.round(maxUsd * 1e6)) : BigInt(0);\n\n const client = createX402Client({\n wallet: {\n address: this.keypair.publicKey.toBase58(),\n signTransaction: async (tx) => {\n tx.sign([this.keypair]);\n return tx;\n },\n },\n network: this.network,\n amount,\n });\n\n const inner = client.fetch.bind(client);\n return ((input: RequestInfo | URL, init?: RequestInit) =>\n inner(input as unknown as RequestInfo, {\n ...init,\n signal: init?.signal ?? AbortSignal.timeout(15000),\n })) as typeof globalThis.fetch;\n }\n\n async getUsdcBalance(): Promise<string> {\n const mint = USDC_MINTS[this.network];\n try {\n const ata = await getAssociatedTokenAddress(mint, this.keypair.publicKey);\n const account = await getAccount(this.connection, ata);\n return (Number(account.amount) / 1e6).toFixed(6);\n } catch {\n return \"0.000000\";\n }\n }\n\n async getSolBalance(): Promise<string> {\n const balance = await this.connection.getBalance(this.keypair.publicKey);\n return (balance / 1e9).toFixed(4);\n }\n\n getAddress(): string {\n return this.keypair.publicKey.toBase58();\n }\n\n getChain(): string {\n return this.network;\n }\n}\n","export class ACEClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n this.apiKey = apiKey;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(15000),\n });\n\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text) as unknown;\n } catch {\n data = { raw: text };\n }\n\n if (!response.ok) {\n const rec = data as Record<string, unknown>;\n const msg = rec?.message ?? rec?.error ?? response.statusText;\n throw new Error(`ACE API error (${response.status}): ${String(msg)}`);\n }\n\n return data as T;\n }\n\n async requestCredit(amount: number, walletAddress: string, purpose?: string): Promise<unknown> {\n return this.request(\"POST\", \"/api/v1/credit/request\", {\n amount,\n walletAddress,\n purpose,\n });\n }\n\n async repayLoan(loanId: string, amount?: number): Promise<unknown> {\n return this.request(\"POST\", `/api/v1/loans/${encodeURIComponent(loanId)}/repay`, {\n ...(amount !== undefined ? { amount } : {}),\n });\n }\n\n async getLoans(): Promise<unknown> {\n return this.request(\"GET\", \"/api/v1/loans\");\n }\n}\n","export class SentinelClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n this.apiKey = apiKey;\n }\n\n async getTransactions(options?: { limit?: number; since?: string; endpoint?: string }): Promise<unknown> {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set(\"limit\", String(options.limit));\n if (options?.since) params.set(\"since\", options.since);\n if (options?.endpoint) params.set(\"endpoint\", options.endpoint);\n\n const qs = params.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/transactions${qs ? `?${qs}` : \"\"}`, {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n signal: AbortSignal.timeout(15000),\n });\n\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text) as unknown;\n } catch {\n data = { raw: text };\n }\n\n if (!response.ok) {\n throw new Error(`Sentinel API error (${response.status}): ${JSON.stringify(data).slice(0, 200)}`);\n }\n\n return data;\n }\n}\n","export class Four02mdClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n }\n\n async search(options?: {\n query?: string;\n category?: string;\n chain?: string;\n maxPrice?: number;\n }): Promise<unknown> {\n const params = new URLSearchParams();\n if (options?.query) params.set(\"q\", options.query);\n if (options?.category) params.set(\"category\", options.category);\n if (options?.chain && options.chain !== \"any\") params.set(\"chain\", options.chain);\n\n const qs = params.toString();\n const response = await fetch(`${this.baseUrl}/api/manifests${qs ? `?${qs}` : \"\"}`, {\n signal: AbortSignal.timeout(15000),\n });\n\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text) as unknown;\n } catch {\n data = { raw: text };\n }\n\n if (!response.ok) {\n throw new Error(`402.md API error (${response.status}): ${JSON.stringify(data).slice(0, 200)}`);\n }\n\n if (options?.maxPrice && data !== null && typeof data === \"object\" && \"results\" in data) {\n const root = data as Record<string, unknown>;\n const results = root.results;\n if (Array.isArray(results)) {\n const filtered = (results as Array<Record<string, unknown>>).filter((manifest) => {\n const endpoints = manifest.endpoints as Array<Record<string, unknown>> | undefined;\n if (!endpoints) return true;\n return endpoints.some((ep) => {\n const priceStr = String(ep.price ?? \"0\").replace(\"$\", \"\");\n const n = parseFloat(priceStr);\n return !Number.isNaN(n) && n <= (options.maxPrice ?? Infinity);\n });\n });\n root.results = filtered;\n }\n }\n\n return data;\n }\n\n async getManifest(domain: string): Promise<unknown> {\n const response = await fetch(`${this.baseUrl}/api/manifests/${encodeURIComponent(domain)}`, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new Error(`Manifest not found for ${domain}`);\n }\n\n return response.json() as Promise<unknown>;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport type { ValeoContext } from \"./types.js\";\nimport { payTool } from \"./tools/pay.js\";\nimport { walletBalanceTool } from \"./tools/wallet-balance.js\";\nimport { getCreditTool } from \"./tools/get-credit.js\";\nimport { repayCreditTool } from \"./tools/repay-credit.js\";\nimport { spendingHistoryTool } from \"./tools/spending-history.js\";\nimport { discoverApisTool } from \"./tools/discover-apis.js\";\nimport { setBudgetTool } from \"./tools/set-budget.js\";\nimport { estimateCostTool } from \"./tools/estimate-cost.js\";\n\nfunction readPackageVersion(): string {\n const here =\n typeof __dirname !== \"undefined\"\n ? __dirname\n : dirname(fileURLToPath(import.meta.url));\n const pkgPath = join(here, \"..\", \"package.json\");\n const raw = readFileSync(pkgPath, \"utf8\");\n return (JSON.parse(raw) as { version: string }).version;\n}\n\nconst pkgVersion = readPackageVersion();\n\nexport async function createAndRunMcpServer(ctx: ValeoContext): Promise<void> {\n const server = new McpServer({\n name: \"valeo\",\n version: pkgVersion,\n });\n\n server.tool(\n \"pay\",\n \"Call any x402-enabled paid API endpoint. Automatically handles payment negotiation, signing, and settlement.\",\n {\n url: z.string().describe(\"The full URL of the x402 API endpoint\"),\n method: z.enum([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"]).default(\"GET\"),\n headers: z.record(z.string()).optional(),\n body: z.string().optional(),\n },\n async (args) => payTool(ctx, args)\n );\n\n server.tool(\n \"wallet_balance\",\n \"Check the current USDC balance of the agent's wallet on the configured chain (Base or Solana). Also shows ETH or SOL for gas.\",\n {\n chain: z.enum([\"base\", \"base-sepolia\", \"solana\", \"solana-devnet\"]).optional(),\n },\n async (args) => walletBalanceTool(ctx, args)\n );\n\n server.tool(\n \"get_credit\",\n \"Borrow USDC from Valeo ACE when wallet balance is insufficient. Requires VALEO_ACE_API_KEY.\",\n {\n amount: z.number().describe(\"Amount of USDC to borrow\"),\n purpose: z.string().optional().describe(\"Brief description of what the credit is for\"),\n },\n async (args) => getCreditTool(ctx, args)\n );\n\n server.tool(\n \"repay_credit\",\n \"Manually repay an outstanding ACE credit line.\",\n {\n loan_id: z.string().describe(\"The loan ID to repay\"),\n amount: z.number().optional().describe(\"Amount to repay. Omit for full balance.\"),\n },\n async (args) => repayCreditTool(ctx, args)\n );\n\n server.tool(\n \"spending_history\",\n \"View recent spending history via Sentinel (if configured) or session receipts.\",\n {\n limit: z.number().default(20).describe(\"Number of recent transactions\"),\n since: z.string().optional().describe(\"ISO timestamp — only show transactions after this time\"),\n endpoint: z.string().optional().describe(\"Filter by endpoint URL substring\"),\n },\n async (args) => spendingHistoryTool(ctx, args)\n );\n\n server.tool(\n \"discover_apis\",\n \"Search the 402.md registry for x402-enabled APIs by keyword, category, or chain.\",\n {\n query: z.string().optional(),\n category: z.string().optional(),\n max_price: z.number().optional(),\n chain: z.enum([\"base\", \"solana\", \"any\"]).default(\"any\"),\n },\n async (args) => discoverApisTool(ctx, args)\n );\n\n server.tool(\n \"set_budget\",\n \"Configure per-call, daily, and session spending limits and optional endpoint allow/block lists.\",\n {\n max_per_call: z.number().optional(),\n daily_limit: z.number().optional(),\n session_limit: z.number().optional(),\n blocked_endpoints: z.array(z.string()).optional(),\n allowed_endpoints: z.array(z.string()).optional(),\n },\n async (args) => setBudgetTool(ctx, args)\n );\n\n server.tool(\n \"estimate_cost\",\n \"Probe an x402 endpoint for pricing without paying (GET, no payment header).\",\n {\n url: z.string().describe(\"The x402 endpoint URL to probe\"),\n },\n async (args) => estimateCostTool(ctx, args)\n );\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(\"✓ Valeo MCP server running\");\n console.error(` Chain: ${ctx.config.chain}`);\n console.error(` Wallet: ${ctx.x402Client.getAddress()}`);\n console.error(` ACE: ${ctx.aceClient ? \"enabled\" : \"not configured\"}`);\n console.error(` Sentinel: ${ctx.sentinelClient ? \"enabled\" : \"not configured\"}`);\n console.error(` Budget: $${ctx.config.defaultSessionLimit}/session, $${ctx.config.defaultDailyLimit}/day`);\n}\n","import { decodeXPaymentResponse } from \"x402-fetch\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { PaymentInfo, ValeoContext } from \"../types.js\";\nimport { getBudgetRemaining, jsonError, jsonResult } from \"./helpers.js\";\n\nfunction buildRequestInit(\n method: string,\n headers: Record<string, string> | undefined,\n body: string | undefined\n): Omit<RequestInit, \"signal\"> {\n const h = new Headers();\n h.set(\"Accept\", \"application/json, text/plain, */*\");\n if (headers) {\n for (const [k, v] of Object.entries(headers)) {\n h.set(k, v);\n }\n }\n if (body !== undefined && method !== \"GET\" && method !== \"HEAD\") {\n if (!h.has(\"Content-Type\")) {\n h.set(\"Content-Type\", \"application/json\");\n }\n }\n return {\n method,\n headers: h,\n ...(body !== undefined && method !== \"GET\" && method !== \"HEAD\" ? { body } : {}),\n };\n}\n\nasync function fetchWithRetry(url: string, base: Omit<RequestInit, \"signal\">): Promise<Response> {\n const run = () => fetch(url, { ...base, signal: AbortSignal.timeout(15000) });\n try {\n return await run();\n } catch {\n return await run();\n }\n}\n\nfunction parseX402FromBody(body: unknown): {\n priceUsd: number;\n maxAmountAtomic: bigint;\n payTo: string;\n description: string;\n chainLabel: string;\n} | null {\n if (!body || typeof body !== \"object\") return null;\n const o = body as Record<string, unknown>;\n const accepts = o.accepts;\n if (!Array.isArray(accepts) || accepts.length === 0) return null;\n const first = accepts[0] as Record<string, unknown>;\n const raw = first.maxAmountRequired;\n if (raw === undefined || raw === null) return null;\n let maxAmountAtomic: bigint;\n try {\n maxAmountAtomic = BigInt(String(raw));\n } catch {\n return null;\n }\n const priceUsd = Number(maxAmountAtomic) / 1e6;\n const payTo = typeof first.payTo === \"string\" ? first.payTo : \"\";\n let description = \"\";\n if (typeof first.extra === \"object\" && first.extra !== null && \"description\" in first.extra) {\n description = String((first.extra as Record<string, unknown>).description ?? \"\");\n } else if (typeof first.description === \"string\") {\n description = first.description;\n }\n const network = typeof first.network === \"string\" ? first.network : \"\";\n return { priceUsd, maxAmountAtomic, payTo, description, chainLabel: network };\n}\n\nasync function parseBodyData(response: Response): Promise<unknown> {\n const ct = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (ct.includes(\"application/json\")) {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n }\n return text;\n}\n\nfunction isInsufficientFunds(err: unknown): boolean {\n const s = err instanceof Error ? err.message : String(err);\n const lower = s.toLowerCase();\n return (\n lower.includes(\"insufficient\") ||\n lower.includes(\"balance\") ||\n lower.includes(\"exceeds maximum\") ||\n lower.includes(\"funds\")\n );\n}\n\nexport async function payTool(\n ctx: ValeoContext,\n input: {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n headers?: Record<string, string>;\n body?: string;\n }\n): Promise<CallToolResult> {\n const { url, method, headers, body } = input;\n\n const routeOnly = ctx.budget.canSpend(0, url);\n if (!routeOnly.allowed) {\n return jsonError(routeOnly.reason ?? \"Request blocked by budget rules.\", \"Use set_budget to adjust allowlists, blocklists, or limits.\");\n }\n\n const baseInit = buildRequestInit(method, headers, body);\n\n let first: Response;\n try {\n first = await fetchWithRetry(url, baseInit);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(\n `Network error calling ${url}: ${msg}`,\n \"Check connectivity and URL. Retry the pay tool once the endpoint is reachable.\"\n );\n }\n\n if (first.status !== 402) {\n if (!first.ok) {\n const snippet = (await first.text()).slice(0, 500);\n return jsonError(\n `HTTP ${first.status} from ${url}: ${snippet}`,\n \"The endpoint returned an error without requesting payment. Fix the URL, method, headers, or body, or authenticate if required.\"\n );\n }\n let data: unknown;\n try {\n data = await parseBodyData(first);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(`Failed to read response body: ${msg}`, \"Retry the pay tool or inspect the endpoint response format.\");\n }\n return jsonResult({\n success: true,\n data,\n payment: null,\n budget_remaining: getBudgetRemaining(ctx),\n });\n }\n\n let bodyJson: unknown;\n try {\n bodyJson = await first.json();\n } catch {\n return jsonError(\n \"Received HTTP 402 but could not parse JSON payment requirements.\",\n \"Use estimate_cost to inspect the endpoint, or verify the server implements x402 with a JSON 402 body.\"\n );\n }\n\n const pricing = parseX402FromBody(bodyJson);\n if (!pricing) {\n return jsonError(\n \"Could not extract x402 payment requirements from 402 response.\",\n \"Use estimate_cost on this URL to debug pricing, or contact the API provider.\"\n );\n }\n\n const spendCheck = ctx.budget.canSpend(pricing.priceUsd, url);\n if (!spendCheck.allowed) {\n return jsonError(\n spendCheck.reason ?? \"Payment blocked by budget.\",\n \"Use set_budget to increase limits, or use spending_history to review past spend.\"\n );\n }\n\n const maxPerCallUsd = ctx.budget.getStatus().config.maxPerCall;\n const paidFetch = ctx.x402Client.createPaidFetch(maxPerCallUsd);\n\n let paid: Response;\n try {\n paid = await paidFetch(url, baseInit);\n } catch (e) {\n if (isInsufficientFunds(e)) {\n return jsonError(\n e instanceof Error ? e.message : String(e),\n \"Use wallet_balance to confirm USDC and gas, then get_credit if ACE is configured, or add funds to the wallet.\"\n );\n }\n return jsonError(\n e instanceof Error ? e.message : String(e),\n \"Payment or signing failed. Verify VALEO_PRIVATE_KEY, chain, and endpoint compatibility with x402.\"\n );\n }\n\n if (!paid.ok) {\n let errText: string;\n try {\n errText = await paid.text();\n } catch {\n errText = \"\";\n }\n return jsonError(\n `Paid request failed with HTTP ${paid.status}: ${errText.slice(0, 500)}`,\n \"The resource may require different parameters after payment. Check the API documentation.\"\n );\n }\n\n let data: unknown;\n try {\n data = await parseBodyData(paid);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(`Paid response could not be read: ${msg}`, \"Retry the pay tool; the payment may still have settled on-chain.\");\n }\n\n let txHash: string | undefined;\n const payHeader =\n paid.headers.get(\"x-payment-response\") ?? paid.headers.get(\"X-PAYMENT-RESPONSE\") ?? undefined;\n if (payHeader) {\n try {\n const decoded = decodeXPaymentResponse(payHeader);\n if (decoded?.transaction) {\n txHash = String(decoded.transaction);\n }\n } catch {\n /* optional metadata */\n }\n }\n\n const timestamp = new Date().toISOString();\n const payment: PaymentInfo = {\n amount: pricing.priceUsd.toFixed(6),\n currency: \"USDC\",\n chain: ctx.config.chain,\n endpoint: url,\n timestamp,\n ...(txHash ? { txHash } : {}),\n };\n\n ctx.receipts.add({\n endpoint: url,\n method,\n amount: pricing.priceUsd,\n currency: \"USDC\",\n chain: ctx.config.chain,\n status: \"settled\",\n responseStatus: paid.status,\n ...(txHash ? { txHash } : {}),\n });\n\n ctx.budget.recordSpend(pricing.priceUsd);\n\n return jsonResult({\n success: true,\n data,\n payment,\n budget_remaining: getBudgetRemaining(ctx),\n });\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BudgetRemaining, ValeoContext } from \"../types.js\";\n\nexport function jsonResult(data: unknown): CallToolResult {\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n}\n\nexport function jsonError(message: string, suggestion: string): CallToolResult {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: true, message, suggestion }, null, 2),\n },\n ],\n isError: true,\n };\n}\n\nexport function getBudgetRemaining(ctx: ValeoContext): BudgetRemaining {\n const s = ctx.budget.getStatus();\n return {\n session: s.spending.remainingSession,\n daily: s.spending.remainingDaily,\n };\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ValeoContext } from \"../types.js\";\nimport { X402BaseClient } from \"../clients/x402-base.js\";\nimport { X402SolanaClient } from \"../clients/x402-solana.js\";\nimport { getBudgetRemaining, jsonError, jsonResult } from \"./helpers.js\";\n\nconst EVM_CHAINS = new Set<string>([\"base\", \"base-sepolia\"]);\nconst SOL_CHAINS = new Set<string>([\"solana\", \"solana-devnet\"]);\n\nfunction familyOf(chain: string): \"evm\" | \"solana\" {\n if (EVM_CHAINS.has(chain)) return \"evm\";\n if (SOL_CHAINS.has(chain)) return \"solana\";\n return \"evm\";\n}\n\nexport async function walletBalanceTool(\n ctx: ValeoContext,\n input: { chain?: \"base\" | \"base-sepolia\" | \"solana\" | \"solana-devnet\" }\n): Promise<CallToolResult> {\n const target = input.chain ?? ctx.config.chain;\n\n if (familyOf(target) !== familyOf(ctx.config.chain)) {\n return jsonError(\n `Cannot check ${target} balance: configured VALEO_CHAIN is ${ctx.config.chain}. The same private key cannot be used for both EVM and Solana.`,\n \"Run a separate MCP server instance with VALEO_CHAIN set to the target chain family and a key for that chain.\"\n );\n }\n\n try {\n if (target === \"base\" || target === \"base-sepolia\") {\n const client = new X402BaseClient(ctx.config.privateKey, target);\n const usdc = await client.getUsdcBalance();\n const eth = await client.getEthBalance();\n return jsonResult({\n chain: target,\n wallet: client.getAddress(),\n usdc,\n gas_token: `${eth} ETH`,\n budget_remaining: getBudgetRemaining(ctx),\n });\n }\n\n const client = new X402SolanaClient(\n ctx.config.privateKey,\n target as \"solana\" | \"solana-devnet\",\n process.env.VALEO_SOLANA_RPC_URL\n );\n const usdc = await client.getUsdcBalance();\n const sol = await client.getSolBalance();\n return jsonResult({\n chain: target,\n wallet: client.getAddress(),\n usdc,\n gas_token: `${sol} SOL`,\n budget_remaining: getBudgetRemaining(ctx),\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(\n `Failed to read balances: ${msg}`,\n \"Verify VALEO_PRIVATE_KEY matches the chain, RPC is reachable, and try wallet_balance again.\"\n );\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ValeoContext } from \"../types.js\";\nimport { jsonError, jsonResult } from \"./helpers.js\";\n\nfunction pickString(obj: Record<string, unknown>, keys: string[]): string | undefined {\n for (const k of keys) {\n const v = obj[k];\n if (typeof v === \"string\" && v.length > 0) return v;\n }\n return undefined;\n}\n\nexport async function getCreditTool(\n ctx: ValeoContext,\n input: { amount: number; purpose?: string }\n): Promise<CallToolResult> {\n if (!ctx.aceClient) {\n return jsonError(\n \"ACE integration not configured. Set VALEO_ACE_API_KEY environment variable.\",\n \"Get an API key at https://agentcreditengine.com and add VALEO_ACE_API_KEY to your MCP server env.\"\n );\n }\n\n const wallet = ctx.x402Client.getAddress();\n\n try {\n const raw = (await ctx.aceClient.requestCredit(input.amount, wallet, input.purpose)) as unknown;\n if (!raw || typeof raw !== \"object\") {\n return jsonResult({\n approved: true,\n note: \"ACE returned a non-object response; raw payload attached.\",\n raw,\n message: \"Credit request completed; verify balances with wallet_balance.\",\n });\n }\n\n const o = raw as Record<string, unknown>;\n const approved =\n typeof o.approved === \"boolean\"\n ? o.approved\n : typeof o.status === \"string\"\n ? o.status.toLowerCase() === \"approved\"\n : true;\n\n if (!approved) {\n return jsonResult({\n approved: false,\n reason: pickString(o, [\"reason\", \"message\", \"error\"]) ?? \"Credit not approved\",\n current_exposure: pickString(o, [\"current_exposure\", \"currentExposure\"]),\n max_exposure: pickString(o, [\"max_exposure\", \"maxExposure\"]),\n raw_note: \"See raw for full ACE response.\",\n raw: o,\n });\n }\n\n return jsonResult({\n approved: true,\n loan_id: pickString(o, [\"loan_id\", \"loanId\", \"id\"]),\n amount: pickString(o, [\"amount\", \"credit_amount\", \"creditAmount\"]) ?? String(input.amount),\n currency: pickString(o, [\"currency\"]) ?? \"USDC\",\n fee: pickString(o, [\"fee\"]),\n total_repayment: pickString(o, [\"total_repayment\", \"totalRepayment\"]),\n auto_repay: typeof o.auto_repay === \"boolean\" ? o.auto_repay : typeof o.autoRepay === \"boolean\" ? o.autoRepay : true,\n message:\n pickString(o, [\"message\"]) ??\n `${pickString(o, [\"amount\"]) ?? input.amount} USDC credited. Auto-repayment may apply per ACE terms.`,\n raw: o,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(\n msg,\n \"Verify VALEO_ACE_API_KEY, wallet address, and ACE account status; retry or contact ACE support.\"\n );\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ValeoContext } from \"../types.js\";\nimport { jsonError, jsonResult } from \"./helpers.js\";\n\nfunction pickString(obj: Record<string, unknown>, keys: string[]): string | undefined {\n for (const k of keys) {\n const v = obj[k];\n if (typeof v === \"string\" && v.length > 0) return v;\n }\n return undefined;\n}\n\nexport async function repayCreditTool(\n ctx: ValeoContext,\n input: { loan_id: string; amount?: number }\n): Promise<CallToolResult> {\n if (!ctx.aceClient) {\n return jsonError(\n \"ACE integration not configured. Set VALEO_ACE_API_KEY environment variable.\",\n \"Get an API key at https://agentcreditengine.com and add VALEO_ACE_API_KEY to your MCP server env.\"\n );\n }\n\n try {\n const raw = (await ctx.aceClient.repayLoan(input.loan_id, input.amount)) as unknown;\n if (!raw || typeof raw !== \"object\") {\n return jsonResult({\n success: true,\n note: \"ACE returned a non-object response.\",\n raw,\n });\n }\n\n const o = raw as Record<string, unknown>;\n return jsonResult({\n success: true,\n loan_id: input.loan_id,\n status: pickString(o, [\"status\", \"state\"]) ?? \"submitted\",\n message: pickString(o, [\"message\"]) ?? \"Repayment request processed.\",\n raw: o,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(msg, \"Verify loan_id, ACE balance, and VALEO_ACE_API_KEY; retry repay_credit.\");\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Receipt, ValeoContext } from \"../types.js\";\nimport { jsonError, jsonResult } from \"./helpers.js\";\n\nfunction receiptToRow(r: Receipt): Record<string, unknown> {\n return {\n timestamp: r.timestamp,\n endpoint: r.endpoint,\n amount: String(r.amount),\n currency: r.currency,\n chain: r.chain,\n status: r.status,\n ...(r.txHash ? { receipt_hash: r.txHash } : {}),\n };\n}\n\nfunction normalizeSentinelPayload(data: unknown): {\n transactions: Array<Record<string, unknown>>;\n extra: Record<string, unknown>;\n} {\n if (!data || typeof data !== \"object\") {\n return { transactions: [], extra: { raw: data } };\n }\n const o = data as Record<string, unknown>;\n const txs = o.transactions ?? o.data ?? o.items ?? o.results;\n if (Array.isArray(txs)) {\n return {\n transactions: txs.map((t) => (typeof t === \"object\" && t !== null ? (t as Record<string, unknown>) : { value: t })),\n extra: { ...o, transactions: undefined, data: undefined, items: undefined, results: undefined },\n };\n }\n return { transactions: [], extra: o };\n}\n\nexport async function spendingHistoryTool(\n ctx: ValeoContext,\n input: { limit: number; since?: string; endpoint?: string }\n): Promise<CallToolResult> {\n const totalSession = ctx.receipts.getTotalSpent();\n const totalToday = ctx.receipts.getTotalSpentToday();\n\n if (ctx.sentinelClient) {\n try {\n const raw = await ctx.sentinelClient.getTransactions({\n limit: input.limit,\n since: input.since,\n endpoint: input.endpoint,\n });\n const { transactions, extra } = normalizeSentinelPayload(raw);\n const mapped = transactions.map((t) => ({\n timestamp: String(t.timestamp ?? t.created_at ?? t.time ?? \"\"),\n endpoint: String(t.endpoint ?? t.url ?? t.resource ?? \"\"),\n amount: String(t.amount ?? t.value ?? \"\"),\n currency: String(t.currency ?? \"USDC\"),\n chain: String(t.chain ?? t.network ?? \"\"),\n status: String(t.status ?? \"settled\"),\n ...(t.receipt_hash || t.receiptHash\n ? { receipt_hash: String(t.receipt_hash ?? t.receiptHash) }\n : {}),\n }));\n\n return jsonResult({\n source: \"sentinel\",\n total_spent_session: totalSession.toFixed(2),\n total_spent_today: totalToday.toFixed(2),\n transaction_count: mapped.length,\n transactions: mapped,\n sentinel_meta: extra,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(\n msg,\n \"Check VALEO_SENTINEL_API_KEY and network access. You can temporarily rely on session receipts without Sentinel.\"\n );\n }\n }\n\n const local = ctx.receipts.getAll({\n limit: input.limit,\n since: input.since,\n endpoint: input.endpoint,\n });\n\n return jsonResult({\n source: \"session\",\n note: \"Showing session-only data. Configure VALEO_SENTINEL_API_KEY for full historical audit trail.\",\n total_spent_session: totalSession.toFixed(2),\n total_spent_today: totalToday.toFixed(2),\n transaction_count: local.length,\n transactions: local.map(receiptToRow),\n });\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ValeoContext } from \"../types.js\";\nimport { jsonError, jsonResult } from \"./helpers.js\";\n\nexport async function discoverApisTool(\n ctx: ValeoContext,\n input: {\n query?: string;\n category?: string;\n max_price?: number;\n chain: \"base\" | \"solana\" | \"any\";\n }\n): Promise<CallToolResult> {\n try {\n const data = await ctx.four02mdClient.search({\n query: input.query,\n category: input.category,\n chain: input.chain,\n maxPrice: input.max_price,\n });\n\n let total = 0;\n if (data && typeof data === \"object\" && \"results\" in data) {\n const r = (data as Record<string, unknown>).results;\n if (Array.isArray(r)) total = r.length;\n }\n\n return jsonResult({\n ...(typeof data === \"object\" && data !== null ? (data as Record<string, unknown>) : { results: data }),\n total,\n tip: \"Use the pay tool with any endpoint URL to make a paid call.\",\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(msg, \"Verify 402.md registry availability and VALEO_402MD_BASE_URL; retry discover_apis.\");\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ValeoContext } from \"../types.js\";\nimport { jsonResult } from \"./helpers.js\";\n\nexport function setBudgetTool(\n ctx: ValeoContext,\n input: {\n max_per_call?: number;\n daily_limit?: number;\n session_limit?: number;\n blocked_endpoints?: string[];\n allowed_endpoints?: string[];\n }\n): CallToolResult {\n ctx.budget.updateConfig({\n ...(input.max_per_call !== undefined ? { maxPerCall: input.max_per_call } : {}),\n ...(input.daily_limit !== undefined ? { dailyLimit: input.daily_limit } : {}),\n ...(input.session_limit !== undefined ? { sessionLimit: input.session_limit } : {}),\n ...(input.blocked_endpoints !== undefined ? { blockedEndpoints: input.blocked_endpoints } : {}),\n ...(input.allowed_endpoints !== undefined ? { allowedEndpoints: input.allowed_endpoints } : {}),\n });\n\n const st = ctx.budget.getStatus();\n return jsonResult({\n updated: true,\n budget: {\n max_per_call: st.config.maxPerCall,\n daily_limit: st.config.dailyLimit,\n session_limit: st.config.sessionLimit,\n blocked_endpoints: st.config.blockedEndpoints,\n allowed_endpoints: st.config.allowedEndpoints,\n },\n current_spending: {\n session: st.spending.session,\n today: st.spending.today,\n remaining_session: st.spending.remainingSession,\n remaining_daily: st.spending.remainingDaily,\n },\n });\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ValeoContext } from \"../types.js\";\nimport { jsonError, jsonResult } from \"./helpers.js\";\n\nfunction parseX402FromBody(body: unknown): {\n priceUsd: number;\n payTo: string;\n description: string;\n chainLabel: string;\n currency: string;\n} | null {\n if (!body || typeof body !== \"object\") return null;\n const o = body as Record<string, unknown>;\n const accepts = o.accepts;\n if (!Array.isArray(accepts) || accepts.length === 0) return null;\n const first = accepts[0] as Record<string, unknown>;\n const raw = first.maxAmountRequired;\n if (raw === undefined || raw === null) return null;\n let maxAmountAtomic: bigint;\n try {\n maxAmountAtomic = BigInt(String(raw));\n } catch {\n return null;\n }\n const priceUsd = Number(maxAmountAtomic) / 1e6;\n const payTo = typeof first.payTo === \"string\" ? first.payTo : \"\";\n let description = \"\";\n if (typeof first.extra === \"object\" && first.extra !== null && \"description\" in first.extra) {\n description = String((first.extra as Record<string, unknown>).description ?? \"\");\n } else if (typeof first.description === \"string\") {\n description = first.description;\n }\n const network = typeof first.network === \"string\" ? first.network : \"\";\n const asset = typeof first.asset === \"string\" ? first.asset : \"USDC\";\n return {\n priceUsd,\n payTo,\n description,\n chainLabel: network,\n currency: asset.length > 20 ? \"USDC\" : asset,\n };\n}\n\nexport async function estimateCostTool(ctx: ValeoContext, input: { url: string }): Promise<CallToolResult> {\n const { url } = input;\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: \"GET\",\n signal: AbortSignal.timeout(15000),\n headers: { Accept: \"application/json, text/plain, */*\" },\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return jsonError(\n `Probe failed for ${url}: ${msg}`,\n \"Check the URL, network, and TLS. Retry estimate_cost or use pay after confirming connectivity.\"\n );\n }\n\n if (res.status === 200) {\n const budgetCheck = ctx.budget.canSpend(0, url);\n return jsonResult({\n url,\n requires_payment: false,\n within_budget: budgetCheck.allowed,\n wallet_can_afford: true,\n wallet_balance: await readUsdcBalance(ctx).catch(() => \"unknown\"),\n note: \"Endpoint returned 200 without requesting payment (free or already authorized).\",\n });\n }\n\n if (res.status === 402) {\n let bodyJson: unknown;\n try {\n bodyJson = await res.json();\n } catch {\n return jsonError(\n \"HTTP 402 but body is not valid JSON.\",\n \"Inspect the endpoint manually or contact the provider for x402 pricing format.\"\n );\n }\n\n const pricing = parseX402FromBody(bodyJson);\n if (!pricing) {\n return jsonError(\n \"Could not parse x402 pricing from 402 response.\",\n \"Use pay with a small budget to test, or inspect the raw 402 JSON from the server.\"\n );\n }\n\n const spend = ctx.budget.canSpend(pricing.priceUsd, url);\n let walletBalanceStr = \"0\";\n let walletCanAfford = false;\n try {\n walletBalanceStr = await readUsdcBalance(ctx);\n const bal = parseFloat(walletBalanceStr);\n walletCanAfford = !Number.isNaN(bal) && bal + 1e-9 >= pricing.priceUsd;\n } catch {\n walletCanAfford = false;\n }\n\n return jsonResult({\n url,\n requires_payment: true,\n price: `$${pricing.priceUsd.toFixed(6)}`,\n currency: pricing.currency,\n chain: pricing.chainLabel || ctx.config.chain,\n pay_to: pricing.payTo,\n description: pricing.description,\n within_budget: spend.allowed,\n wallet_can_afford: walletCanAfford,\n wallet_balance: walletBalanceStr,\n ...(spend.allowed ? {} : { budget_reason: spend.reason }),\n });\n }\n\n const snippet = (await res.text()).slice(0, 400);\n return jsonResult({\n url,\n requires_payment: false,\n http_status: res.status,\n body_snippet: snippet,\n within_budget: ctx.budget.canSpend(0, url).allowed,\n wallet_can_afford: true,\n wallet_balance: await readUsdcBalance(ctx).catch(() => \"unknown\"),\n note: \"Non-402 response; endpoint may require auth, be misconfigured, or be unavailable.\",\n });\n}\n\nasync function readUsdcBalance(ctx: ValeoContext): Promise<string> {\n return ctx.x402Client.getUsdcBalance();\n}\n","import { loadConfig } from \"./config.js\";\nexport type { ValeoConfig, ValeoContext } from \"./types.js\";\nexport { loadConfig };\nimport { BudgetManager } from \"./budget/manager.js\";\nimport { ReceiptStore } from \"./receipts/store.js\";\nimport { X402BaseClient } from \"./clients/x402-base.js\";\nimport { X402SolanaClient } from \"./clients/x402-solana.js\";\nimport { ACEClient } from \"./clients/ace.js\";\nimport { SentinelClient } from \"./clients/sentinel.js\";\nimport { Four02mdClient } from \"./clients/four02md.js\";\nimport { createAndRunMcpServer } from \"./server.js\";\nimport type { ValeoContext } from \"./types.js\";\n\nasync function main(): Promise<void> {\n const config = loadConfig();\n const budget = new BudgetManager(config);\n const receipts = new ReceiptStore();\n\n const x402Client = config.chain.startsWith(\"solana\")\n ? new X402SolanaClient(\n config.privateKey,\n config.chain as \"solana\" | \"solana-devnet\",\n process.env.VALEO_SOLANA_RPC_URL\n )\n : new X402BaseClient(config.privateKey, config.chain as \"base\" | \"base-sepolia\");\n\n const aceClient = config.aceApiKey ? new ACEClient(config.aceBaseUrl, config.aceApiKey) : null;\n\n const sentinelClient = config.sentinelApiKey\n ? new SentinelClient(config.sentinelBaseUrl, config.sentinelApiKey)\n : null;\n\n const four02mdClient = new Four02mdClient(config.four02mdBaseUrl);\n\n const ctx: ValeoContext = {\n config,\n budget,\n receipts,\n x402Client,\n aceClient,\n sentinelClient,\n four02mdClient,\n };\n\n await createAndRunMcpServer(ctx);\n}\n\nprocess.on(\"uncaughtException\", (err) => {\n console.error(\"Uncaught exception:\", err);\n process.exit(1);\n});\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\"Unhandled rejection:\", reason);\n process.exit(1);\n});\n\nmain().catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(\"Fatal startup error:\", msg);\n process.exit(1);\n});\n"],"mappings":"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","names":["bs58","base","data","client","usdc","pickString","parseX402FromBody"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@valeo-mcp/server",
3
+ "version": "1.0.0",
4
+ "description": "Universal MCP server for AI agent payments — x402, credit, audit, discovery",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "valeo-mcp": "./bin/valeo-mcp.js"
10
+ },
11
+ "files": ["dist", "bin"],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "dev": "tsup --watch",
15
+ "start": "node bin/valeo-mcp.js",
16
+ "lint": "tsc --noEmit",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": ["mcp", "x402", "payments", "ai-agent", "usdc", "valeo", "sentinel", "ace"],
20
+ "license": "MIT",
21
+ "engines": { "node": ">=18.0.0" },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.12.1",
24
+ "zod": "^3.23.0",
25
+ "x402-fetch": "~1.1.0",
26
+ "x402-solana": "~2.0.0",
27
+ "viem": "^2.0.0",
28
+ "@solana/web3.js": "^1.95.0",
29
+ "@solana/spl-token": "^0.4.0",
30
+ "bs58": "^5.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "tsup": "^8.0.0",
34
+ "typescript": "^5.5.0",
35
+ "@types/node": "^20.0.0"
36
+ }
37
+ }