{"version":3,"sources":["../../src/client/x402MCPClient.ts","../../src/utils/encoding.ts","../../src/types/mcp.ts","../../src/server/paymentWrapper.ts","../../src/index.ts"],"sourcesContent":["import type {\n  PaymentPayload,\n  PaymentRequired,\n  SettleResponse,\n  Network,\n  SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport { parsePaymentRequired } from \"@x402/core/schemas\";\nimport { x402Client } from \"@x402/core/client\";\nimport type { x402ClientConfig } from \"@x402/core/client\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n\nimport type {\n  MCPResultWithMeta,\n  PaymentRequestedContext,\n  x402MCPClientOptions,\n  PaymentRequiredHook,\n  PaymentRequiredContext,\n} from \"../types\";\nimport {\n  MCP_PAYMENT_REQUIRED_CODE,\n  MCP_PAYMENT_META_KEY,\n  isPaymentRequiredError,\n} from \"../types\";\nimport { extractPaymentResponseFromMeta } from \"../utils\";\n\n// ============================================================================\n// MCP SDK Result Types\n// ============================================================================\n\n/**\n * MCP content item - using a flexible type that matches the MCP SDK's content format.\n * The MCP SDK returns content items with a `type` discriminator and type-specific fields.\n * We use this type to preserve the original response structure from the SDK.\n */\nexport type MCPContentItem = {\n  [key: string]: unknown;\n  type: string;\n};\n\n/**\n * Result returned by MCP SDK callTool method.\n * This mirrors the SDK's CallToolResult type to ensure compatibility.\n */\ninterface MCPCallToolResult {\n  content: MCPContentItem[];\n  isError?: boolean;\n  _meta?: Record<string, unknown>;\n  structuredContent?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for MCP text content\n *\n * @param content - The content item to check\n * @returns True if the content is a text content item with a string text field\n */\nfunction isMCPTextContent(content: MCPContentItem): content is MCPContentItem & { text: string } {\n  return content.type === \"text\" && typeof content.text === \"string\";\n}\n\n/**\n * Type guard for MCPCallToolResult\n *\n * @param result - The result to check\n * @returns True if the result is a valid MCP call tool result\n */\nfunction isMCPCallToolResult(result: unknown): result is MCPCallToolResult {\n  if (typeof result !== \"object\" || result === null) {\n    return false;\n  }\n\n  const obj = result as Record<string, unknown>;\n  return Array.isArray(obj.content);\n}\n\n// ============================================================================\n// Hook Types\n// ============================================================================\n\n/**\n * Hook called before payment is created\n */\nexport type BeforePaymentHook = (context: PaymentRequestedContext) => Promise<void> | void;\n\n/**\n * Hook called after payment is submitted\n */\nexport type AfterPaymentHook = (context: {\n  toolName: string;\n  paymentPayload: PaymentPayload;\n  result: MCPResultWithMeta;\n  settleResponse: SettleResponse | null;\n}) => Promise<void> | void;\n\n// ============================================================================\n// Public Types\n// ============================================================================\n\n/**\n * Result of a tool call with payment metadata.\n * Content is forwarded directly from the MCP SDK to preserve the original response structure.\n */\nexport interface x402MCPToolCallResult {\n  /** The tool result content, forwarded directly from MCP SDK */\n  content: MCPContentItem[];\n  /** Whether the tool returned an error */\n  isError?: boolean;\n  /** Payment settlement response if payment was made */\n  paymentResponse?: SettleResponse;\n  /** Whether payment was required and submitted */\n  paymentMade: boolean;\n}\n\n/**\n * x402-enabled MCP client that handles payment for tool calls.\n *\n * Wraps an MCP client to automatically detect 402 (payment required) errors\n * from tool calls, create payment payloads, and retry with payment attached.\n *\n * PROTOCOL COMPLIANCE:\n * This wrapper is a COMPLETE, TRANSPARENT passthrough exposing all 19 public methods\n * from the MCP SDK Client class. It's suitable for any MCP use case including:\n * - Chatbots and conversational agents\n * - IDE integrations (like Cursor, VSCode)\n * - Autonomous agents\n * - Custom MCP applications\n *\n * Only callTool() is enhanced with payment handling. All other methods are direct\n * passthroughs ensuring full MCP protocol compatibility.\n *\n * STABILITY:\n * Depends on formal MCP specification (JSON-RPC 2.0 based) with semantic versioning.\n * Proven stable across SDK versions: 1.9.0 → 1.12.1 → 1.15.1\n *\n * @example\n * ```typescript\n * import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n * import { x402MCPClient } from \"@x402/mcp\";\n * import { x402Client } from \"@x402/core/client\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n *\n * const paymentClient = new x402Client()\n *   .register(\"eip155:84532\", new ExactEvmScheme(account));\n *\n * const mcpClient = new Client({ name: \"my-agent\", version: \"1.0.0\" }, {...});\n * const x402Mcp = new x402MCPClient(mcpClient, paymentClient, {\n *   autoPayment: true,\n *   onPaymentRequested: async ({ paymentRequired }) => {\n *     return confirm(`Pay ${paymentRequired.accepts[0].amount}?`);\n *   },\n * });\n *\n * await x402Mcp.connect(transport);\n *\n * // Full MCP protocol access - all 19 methods available\n * const tools = await x402Mcp.listTools();\n * const resource = await x402Mcp.readResource({ uri: \"file://...\" });\n * const prompt = await x402Mcp.getPrompt({ name: \"code-review\" });\n * const result = await x402Mcp.callTool(\"financial_analysis\", { ticker: \"AAPL\" });\n * ```\n */\nexport class x402MCPClient {\n  private readonly mcpClient: Client;\n  private readonly _paymentClient: x402Client;\n  private readonly options: Required<x402MCPClientOptions>;\n  private readonly paymentRequiredHooks: PaymentRequiredHook[] = [];\n  private readonly beforePaymentHooks: BeforePaymentHook[] = [];\n  private readonly afterPaymentHooks: AfterPaymentHook[] = [];\n\n  /**\n   * Creates a new x402MCPClient instance.\n   *\n   * @param mcpClient - The underlying MCP client instance\n   * @param paymentClient - The x402 client for creating payment payloads\n   * @param options - Configuration options\n   */\n  constructor(\n    mcpClient: Client,\n    paymentClient: x402Client,\n    options: x402MCPClientOptions = {},\n  ) {\n    this.mcpClient = mcpClient;\n    this._paymentClient = paymentClient;\n    this.options = {\n      autoPayment: options.autoPayment ?? true,\n      onPaymentRequested: options.onPaymentRequested ?? (() => true),\n    };\n  }\n\n  /**\n   * Get the underlying MCP client instance.\n   *\n   * @returns The MCP client instance\n   */\n  get client(): Client {\n    return this.mcpClient;\n  }\n\n  /**\n   * Get the underlying x402 payment client instance.\n   *\n   * @returns The x402 client instance\n   */\n  get paymentClient(): x402Client {\n    return this._paymentClient;\n  }\n\n  /**\n   * Connect to an MCP server transport.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param transport - The transport to connect to\n   * @returns Promise that resolves when connected\n   */\n  async connect(transport: Parameters<Client[\"connect\"]>[0]): Promise<void> {\n    await this.mcpClient.connect(transport);\n  }\n\n  /**\n   * Close the MCP connection.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Promise that resolves when closed\n   */\n  async close(): Promise<void> {\n    await this.mcpClient.close();\n  }\n\n  /**\n   * List available tools from the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Promise resolving to the list of tools\n   */\n  async listTools(): ReturnType<Client[\"listTools\"]> {\n    return this.mcpClient.listTools();\n  }\n\n  /**\n   * List available resources from the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Promise resolving to the list of resources\n   */\n  async listResources(): ReturnType<Client[\"listResources\"]> {\n    return this.mcpClient.listResources();\n  }\n\n  /**\n   * List available prompts from the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Promise resolving to the list of prompts\n   */\n  async listPrompts(): ReturnType<Client[\"listPrompts\"]> {\n    return this.mcpClient.listPrompts();\n  }\n\n  /**\n   * Get a specific prompt from the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for getPrompt method\n   * @returns Promise resolving to the prompt\n   */\n  async getPrompt(...args: Parameters<Client[\"getPrompt\"]>): ReturnType<Client[\"getPrompt\"]> {\n    return this.mcpClient.getPrompt(...args);\n  }\n\n  /**\n   * Read a resource from the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for readResource method\n   * @returns Promise resolving to the resource content\n   */\n  async readResource(...args: Parameters<Client[\"readResource\"]>): ReturnType<Client[\"readResource\"]> {\n    return this.mcpClient.readResource(...args);\n  }\n\n  /**\n   * List resource templates from the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for listResourceTemplates method\n   * @returns Promise resolving to the list of resource templates\n   */\n  async listResourceTemplates(...args: Parameters<Client[\"listResourceTemplates\"]>): ReturnType<Client[\"listResourceTemplates\"]> {\n    return this.mcpClient.listResourceTemplates(...args);\n  }\n\n  /**\n   * Subscribe to resource updates.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for subscribeResource method\n   * @returns Promise resolving when subscribed\n   */\n  async subscribeResource(...args: Parameters<Client[\"subscribeResource\"]>): ReturnType<Client[\"subscribeResource\"]> {\n    return this.mcpClient.subscribeResource(...args);\n  }\n\n  /**\n   * Unsubscribe from resource updates.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for unsubscribeResource method\n   * @returns Promise resolving when unsubscribed\n   */\n  async unsubscribeResource(...args: Parameters<Client[\"unsubscribeResource\"]>): ReturnType<Client[\"unsubscribeResource\"]> {\n    return this.mcpClient.unsubscribeResource(...args);\n  }\n\n  /**\n   * Ping the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for ping method\n   * @returns Promise resolving to ping response\n   */\n  async ping(...args: Parameters<Client[\"ping\"]>): ReturnType<Client[\"ping\"]> {\n    return this.mcpClient.ping(...args);\n  }\n\n  /**\n   * Request completion suggestions.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for complete method\n   * @returns Promise resolving to completion suggestions\n   */\n  async complete(...args: Parameters<Client[\"complete\"]>): ReturnType<Client[\"complete\"]> {\n    return this.mcpClient.complete(...args);\n  }\n\n  /**\n   * Set the logging level on the server.\n   * Passthrough to the underlying MCP client.\n   *\n   * @param args - Arguments for setLoggingLevel method\n   * @returns Promise resolving when level is set\n   */\n  async setLoggingLevel(...args: Parameters<Client[\"setLoggingLevel\"]>): ReturnType<Client[\"setLoggingLevel\"]> {\n    return this.mcpClient.setLoggingLevel(...args);\n  }\n\n  /**\n   * Get server capabilities after initialization.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Server capabilities or undefined if not initialized\n   */\n  getServerCapabilities(): ReturnType<Client[\"getServerCapabilities\"]> {\n    return this.mcpClient.getServerCapabilities();\n  }\n\n  /**\n   * Get server version information after initialization.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Server version info or undefined if not initialized\n   */\n  getServerVersion(): ReturnType<Client[\"getServerVersion\"]> {\n    return this.mcpClient.getServerVersion();\n  }\n\n  /**\n   * Get server instructions after initialization.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Server instructions or undefined if not initialized\n   */\n  getInstructions(): ReturnType<Client[\"getInstructions\"]> {\n    return this.mcpClient.getInstructions();\n  }\n\n  /**\n   * Send notification that roots list has changed.\n   * Passthrough to the underlying MCP client.\n   *\n   * @returns Promise resolving when notification is sent\n   */\n  async sendRootsListChanged(): ReturnType<Client[\"sendRootsListChanged\"]> {\n    return this.mcpClient.sendRootsListChanged();\n  }\n\n  /**\n   * Register a hook to run when a 402 payment required is received.\n   * Hooks run in order; first to return a result wins.\n   *\n   * This can be used to:\n   * - Provide pre-existing payment payloads (implementation-specific, not part of x402 spec)\n   * - Abort the payment flow for certain tools\n   * - Log or track payment required events\n   *\n   * Note: Payment caching is an implementation pattern and not defined in the x402 MCP\n   * transport specification. Implementations that cache payments should ensure cached\n   * payloads are still valid (not expired, correct nonce, etc.).\n   *\n   * @param hook - Hook function\n   * @returns This instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Example: Custom payment handling (implementation-specific)\n   * client.onPaymentRequired(async ({ toolName, paymentRequired }) => {\n   *   // Custom logic to provide a payment or abort\n   *   if (shouldAbort(toolName)) {\n   *     return { abort: true };\n   *   }\n   *   // Return undefined to proceed with normal payment flow\n   * });\n   * ```\n   */\n  onPaymentRequired(hook: PaymentRequiredHook): this {\n    this.paymentRequiredHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook to run before payment is created.\n   *\n   * @param hook - Hook function\n   * @returns This instance for chaining\n   */\n  onBeforePayment(hook: BeforePaymentHook): this {\n    this.beforePaymentHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook to run after payment is submitted.\n   *\n   * @param hook - Hook function\n   * @returns This instance for chaining\n   */\n  onAfterPayment(hook: AfterPaymentHook): this {\n    this.afterPaymentHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Calls a tool, automatically handling 402 payment required errors.\n   *\n   * If the tool returns a 402 error and autoPayment is enabled, this method\n   * will automatically create a payment payload and retry the tool call.\n   *\n   * @param name - The name of the tool to call\n   * @param args - Arguments to pass to the tool\n   * @param options - Optional MCP request options (timeout, signal, etc.)\n   * @param options.timeout - Request timeout in milliseconds (default: 60000)\n   * @param options.signal - AbortSignal for cancellation\n   * @param options.resetTimeoutOnProgress - If true, progress notifications reset the timeout\n   * @returns The tool result with payment metadata\n   * @throws Error if payment is required but autoPayment is disabled and no payment provided\n   * @throws Error if payment approval is denied\n   * @throws Error if payment creation fails\n   */\n  async callTool(\n    name: string,\n    args: Record<string, unknown> = {},\n    options?: { timeout?: number; signal?: AbortSignal; resetTimeoutOnProgress?: boolean },\n  ): Promise<x402MCPToolCallResult> {\n    // First attempt without payment\n    let result: MCPCallToolResult;\n    let paymentRequired: PaymentRequired | null = null;\n\n    try {\n      const rawResult = await this.mcpClient.callTool(\n        { name, arguments: args },\n        undefined,\n        options,\n      );\n\n      if (!isMCPCallToolResult(rawResult)) {\n        throw new Error(\"Invalid MCP tool result: missing content array\");\n      }\n\n      result = rawResult;\n      paymentRequired = this.extractPaymentRequiredFromResult(result);\n    } catch (error: unknown) {\n      // Handle MCP UrlElicitationRequired (-32042) used for payment flows (SEP-1036).\n      // The MCP SDK throws McpError for -32042 with error.data preserved.\n      const extracted = this.extractPaymentRequiredFromError(error);\n      if (extracted) {\n        paymentRequired = extracted;\n        result = { content: [], isError: true };\n      } else {\n        throw error;\n      }\n    }\n\n    if (!paymentRequired) {\n      // Not a payment required response, forward original MCP response as-is\n      return {\n        content: result.content,\n        isError: result.isError,\n        paymentMade: false,\n      };\n    }\n\n    // Payment required - run onPaymentRequired hooks first\n    const paymentRequiredContext: PaymentRequiredContext = {\n      toolName: name,\n      arguments: args,\n      paymentRequired,\n    };\n\n    // Run payment required hooks - first to return a result wins\n    for (const hook of this.paymentRequiredHooks) {\n      const hookResult = await hook(paymentRequiredContext);\n      if (hookResult) {\n        if (hookResult.abort) {\n          throw new Error(\"Payment aborted by hook\");\n        }\n        if (hookResult.payment) {\n          // Use the hook-provided payment\n          return this.callToolWithPayment(name, args, hookResult.payment, options);\n        }\n      }\n    }\n\n    // No hook handled it, proceed with normal flow\n    if (!this.options.autoPayment) {\n      // Auto-payment disabled, throw with payment info\n      const err = new Error(\"Payment required\") as Error & {\n        code: number;\n        paymentRequired: PaymentRequired;\n      };\n      err.code = MCP_PAYMENT_REQUIRED_CODE;\n      err.paymentRequired = paymentRequired;\n      throw err;\n    }\n\n    // Create payment requested context\n    const paymentRequestedContext: PaymentRequestedContext = {\n      toolName: name,\n      arguments: args,\n      paymentRequired,\n    };\n\n    // Check if payment is approved via onPaymentRequested hook\n    const approved = await this.options.onPaymentRequested(paymentRequestedContext);\n    if (!approved) {\n      throw new Error(\"Payment request denied\");\n    }\n\n    // Run before payment hooks\n    for (const hook of this.beforePaymentHooks) {\n      await hook(paymentRequestedContext);\n    }\n\n    // Create payment payload\n    const paymentPayload = await this._paymentClient.createPaymentPayload(paymentRequired);\n\n    // Retry with payment\n    return this.callToolWithPayment(name, args, paymentPayload, options);\n  }\n\n  /**\n   * Calls a tool with an explicit payment payload.\n   *\n   * Use this method when you want to provide payment upfront or when\n   * implementing custom payment handling.\n   *\n   * @param name - The name of the tool to call\n   * @param args - Arguments to pass to the tool\n   * @param paymentPayload - The payment payload to include\n   * @param options - Optional MCP request options (timeout, signal, etc.)\n   * @param options.timeout - Request timeout in milliseconds (default: 60000)\n   * @param options.signal - AbortSignal for cancellation\n   * @param options.resetTimeoutOnProgress - If true, progress notifications reset the timeout\n   * @returns The tool result with payment metadata\n   */\n  async callToolWithPayment(\n    name: string,\n    args: Record<string, unknown>,\n    paymentPayload: PaymentPayload,\n    options?: { timeout?: number; signal?: AbortSignal; resetTimeoutOnProgress?: boolean },\n  ): Promise<x402MCPToolCallResult> {\n    // Build the call parameters with payment metadata\n    // Note: The MCP SDK's callTool accepts _meta but the types don't always expose it\n    const callParams = {\n      name,\n      arguments: args,\n      _meta: {\n        [MCP_PAYMENT_META_KEY]: paymentPayload,\n      },\n    };\n\n    // Call with payment in _meta\n    const result = await this.mcpClient.callTool(callParams, undefined, options);\n\n    // Validate result structure\n    if (!isMCPCallToolResult(result)) {\n      throw new Error(\"Invalid MCP tool result: missing content array\");\n    }\n\n    // Build result with meta for extraction (preserve _meta if present)\n    const resultWithMeta: MCPResultWithMeta = {\n      content: result.content,\n      isError: result.isError,\n      _meta: result._meta,\n    };\n\n    // Extract payment response from _meta\n    const paymentResponse = extractPaymentResponseFromMeta(resultWithMeta);\n\n    // Run after payment hooks\n    for (const hook of this.afterPaymentHooks) {\n      await hook({\n        toolName: name,\n        paymentPayload,\n        result: resultWithMeta,\n        settleResponse: paymentResponse,\n      });\n    }\n\n    const paymentRequired = this.extractPaymentRequiredFromResult(result);\n    const recoveryResult = paymentPayload.accepted\n      ? await this._paymentClient.handlePaymentResponse({\n        paymentPayload,\n        requirements: paymentPayload.accepted,\n        ...(paymentResponse ? { settleResponse: paymentResponse } : {}),\n        ...(paymentRequired ? { paymentRequired } : {}),\n      })\n      : undefined;\n\n    // A paid attempt can return a corrective 402. Scheme hooks recover local\n    // state from it, then we retry once with a fresh payload from that response.\n    if (recoveryResult?.recovered && paymentRequired) {\n      const freshPayload = await this._paymentClient.createPaymentPayload(paymentRequired);\n      const retryCallParams = {\n        name,\n        arguments: args,\n        _meta: {\n          [MCP_PAYMENT_META_KEY]: freshPayload,\n        },\n      };\n      const retryResult = await this.mcpClient.callTool(retryCallParams, undefined, options);\n\n      if (!isMCPCallToolResult(retryResult)) {\n        throw new Error(\"Invalid MCP tool result: missing content array\");\n      }\n\n      const retryResultWithMeta: MCPResultWithMeta = {\n        content: retryResult.content,\n        isError: retryResult.isError,\n        _meta: retryResult._meta,\n      };\n      const retryPaymentResponse = extractPaymentResponseFromMeta(retryResultWithMeta);\n\n      for (const hook of this.afterPaymentHooks) {\n        await hook({\n          toolName: name,\n          paymentPayload: freshPayload,\n          result: retryResultWithMeta,\n          settleResponse: retryPaymentResponse,\n        });\n      }\n\n      const retryCorrectivePaymentRequired = this.extractPaymentRequiredFromResult(retryResult);\n      if (freshPayload.accepted) {\n        await this._paymentClient.handlePaymentResponse({\n          paymentPayload: freshPayload,\n          requirements: freshPayload.accepted,\n          ...(retryPaymentResponse ? { settleResponse: retryPaymentResponse } : {}),\n          ...(retryCorrectivePaymentRequired\n            ? { paymentRequired: retryCorrectivePaymentRequired }\n            : {}),\n        });\n      }\n\n      return {\n        content: retryResult.content,\n        isError: retryResult.isError,\n        paymentResponse: retryPaymentResponse ?? undefined,\n        paymentMade: true,\n      };\n    }\n\n    // Forward original MCP response content as-is\n    return {\n      content: result.content,\n      isError: result.isError,\n      paymentResponse: paymentResponse ?? undefined,\n      paymentMade: true,\n    };\n  }\n\n  /**\n   * Probes a tool to discover its payment requirements.\n   *\n   * **WARNING: Side Effects** - This method actually calls the tool to trigger a 402 response.\n   * If the tool is free (no payment required), it will execute and return null.\n   * Use with caution on tools that have side effects or are expensive to run.\n   *\n   * Useful for displaying pricing information to users before calling paid tools.\n   *\n   * @param name - The name of the tool to probe\n   * @param args - Arguments that may affect pricing (for dynamic pricing scenarios)\n   * @returns The payment requirements if the tool requires payment, null if the tool is free\n   *\n   * @example\n   * ```typescript\n   * // Check if a tool requires payment before calling\n   * const requirements = await client.getToolPaymentRequirements(\"expensive_analysis\");\n   *\n   * if (requirements) {\n   *   const price = requirements.accepts[0];\n   *   console.log(`This tool costs ${price.amount} on ${price.network}`);\n   *   // Optionally show user and get confirmation before calling\n   * } else {\n   *   console.log(\"This tool is free\");\n   *   // Note: the tool has already executed!\n   * }\n   * ```\n   */\n  async getToolPaymentRequirements(\n    name: string,\n    args: Record<string, unknown> = {},\n  ): Promise<PaymentRequired | null> {\n    // Note: This actually calls the tool to trigger 402 if paid.\n    // If the tool is free, it will execute as a side effect.\n    try {\n      const result = await this.mcpClient.callTool({ name, arguments: args });\n\n      if (!isMCPCallToolResult(result)) {\n        return null;\n      }\n\n      return this.extractPaymentRequiredFromResult(result);\n    } catch (error: unknown) {\n      // Handle McpError(-32042) payment challenges; re-throw anything else\n      // so non-payment failures aren't indistinguishable from \"free tool\"\n      // (mirrors callTool's catch above).\n      const extracted = this.extractPaymentRequiredFromError(error);\n      if (extracted) {\n        return extracted;\n      }\n      throw error;\n    }\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  /**\n   * Extracts PaymentRequired from a tool result (structured 402 response).\n   *\n   * Per MCP transport spec, supports:\n   * 1. structuredContent with direct PaymentRequired object (optional, preferred)\n   * 2. content[0].text with JSON-encoded PaymentRequired object (required)\n   *\n   * @param result - The tool call result\n   * @returns PaymentRequired if this is a 402 response, null otherwise\n   */\n  private extractPaymentRequiredFromResult(result: MCPCallToolResult): PaymentRequired | null {\n    // Only check if isError is true\n    if (!result.isError) {\n      return null;\n    }\n\n    if (result.structuredContent) {\n      const extracted = this.extractPaymentRequiredFromObject(result.structuredContent);\n      if (extracted) {\n        return extracted;\n      }\n    }\n\n    const content = result.content;\n    if (content.length === 0) {\n      return null;\n    }\n\n    const firstItem = content[0];\n    if (!isMCPTextContent(firstItem)) {\n      return null;\n    }\n\n    try {\n      const parsed: unknown = JSON.parse(firstItem.text);\n      if (typeof parsed === \"object\" && parsed !== null) {\n        const extracted = this.extractPaymentRequiredFromObject(\n          parsed as Record<string, unknown>,\n        );\n        if (extracted) {\n          return extracted;\n        }\n      }\n    } catch {\n      // Not JSON, not our structured response\n    }\n\n    return null;\n  }\n\n  /**\n   * Extracts PaymentRequired from an object.\n   * Expects direct PaymentRequired format (per MCP transport spec).\n   *\n   * @param obj - The object to extract from\n   * @returns PaymentRequired if found, null otherwise\n   */\n  private extractPaymentRequiredFromObject(obj: Record<string, unknown>): PaymentRequired | null {\n    // parsePaymentRequired yields the schema (V1 | V2) union; cast to the transport PaymentRequired type\n    const result = parsePaymentRequired(obj);\n    return result.success ? (result.data as PaymentRequired) : null;\n  }\n\n  /**\n   * Extracts PaymentRequired from a thrown MCP error.\n   *\n   * Uses isPaymentRequiredError() to validate the error structure (supports\n   * both 402 and -32042 codes), then extracts PaymentRequired from the\n   * correct location (error.data directly or error.data.x402 for namespaced\n   * -32042 errors).\n   *\n   * @param error - The caught error\n   * @returns PaymentRequired if this is a payment error, null otherwise\n   */\n  private extractPaymentRequiredFromError(error: unknown): PaymentRequired | null {\n    if (!isPaymentRequiredError(error)) {\n      return null;\n    }\n\n    const data = \"x402\" in error.data ? error.data.x402 : error.data;\n    const result = parsePaymentRequired(data);\n    return result.success ? (result.data as PaymentRequired) : null;\n  }\n\n}\n\n/**\n * Configuration for createx402MCPClient factory\n */\nexport interface x402MCPClientConfig {\n  /** MCP client name */\n  name: string;\n\n  /** MCP client version */\n  version: string;\n\n  /**\n   * Payment scheme registrations.\n   * Each registration maps a network to its scheme client implementation.\n   */\n  schemes: Array<{\n    network: Network;\n    client: SchemeNetworkClient;\n    x402Version?: number;\n  }>;\n\n  /**\n   * Whether to automatically retry tool calls with payment on 402 errors.\n   *\n   * @default true\n   */\n  autoPayment?: boolean;\n\n  /**\n   * Hook called when a payment is requested.\n   * Return true to proceed with payment, false to abort.\n   */\n  onPaymentRequested?: (context: PaymentRequestedContext) => Promise<boolean> | boolean;\n\n  /**\n   * Additional MCP client options\n   */\n  mcpClientOptions?: Record<string, unknown>;\n}\n\n/**\n * Wraps an existing MCP client with x402 payment handling.\n *\n * Use this when you already have an MCP client instance and want to add\n * payment capabilities. For a simpler setup, use createx402MCPClient instead.\n *\n * @param mcpClient - The MCP client to wrap\n * @param paymentClient - The x402 client for payment handling\n * @param options - Configuration options\n * @returns An x402MCPClient instance\n *\n * @example\n * ```typescript\n * import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n * import { wrapMCPClientWithPayment } from \"@x402/mcp\";\n * import { x402Client } from \"@x402/core/client\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n *\n * const mcpClient = new Client({ name: \"my-agent\", version: \"1.0.0\" });\n * const paymentClient = new x402Client()\n *   .register(\"eip155:84532\", new ExactEvmScheme(account));\n *\n * const x402Mcp = wrapMCPClientWithPayment(mcpClient, paymentClient, {\n *   autoPayment: true,\n * });\n *\n * await x402Mcp.connect(transport);\n * const result = await x402Mcp.callTool(\"paid_tool\", { arg: \"value\" });\n * ```\n */\nexport function wrapMCPClientWithPayment(\n  mcpClient: Client,\n  paymentClient: x402Client,\n  options?: x402MCPClientOptions,\n): x402MCPClient {\n  return new x402MCPClient(mcpClient, paymentClient, options);\n}\n\n/**\n * Wraps an existing MCP client with x402 payment handling using a config object.\n *\n * Similar to wrapMCPClientWithPayment but uses a configuration object for\n * setting up the payment client, similar to the axios pattern.\n *\n * @param mcpClient - The MCP client to wrap\n * @param config - Payment client configuration\n * @param options - x402 MCP client options\n * @returns An x402MCPClient instance\n *\n * @example\n * ```typescript\n * import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n * import { wrapMCPClientWithPaymentFromConfig } from \"@x402/mcp\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n *\n * const mcpClient = new Client({ name: \"my-agent\", version: \"1.0.0\" });\n *\n * const x402Mcp = wrapMCPClientWithPaymentFromConfig(mcpClient, {\n *   schemes: [\n *     { network: \"eip155:84532\", client: new ExactEvmScheme(account) },\n *   ],\n * });\n *\n * await x402Mcp.connect(transport);\n * ```\n */\nexport function wrapMCPClientWithPaymentFromConfig(\n  mcpClient: Client,\n  config: x402ClientConfig,\n  options?: x402MCPClientOptions,\n): x402MCPClient {\n  const paymentClient = x402Client.fromConfig(config);\n  return new x402MCPClient(mcpClient, paymentClient, options);\n}\n\n/**\n * Creates a fully configured x402 MCP client with sensible defaults.\n *\n * This factory function provides the simplest way to create an x402-enabled MCP client.\n * It handles creation of both the underlying MCP Client and x402Client, making it\n * easy to get started with paid tool calls.\n *\n * @param config - Client configuration options\n * @returns A configured x402MCPClient instance\n *\n * @example\n * ```typescript\n * import { createx402MCPClient } from \"@x402/mcp\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n * import { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\n *\n * const client = createx402MCPClient({\n *   name: \"my-agent\",\n *   version: \"1.0.0\",\n *   schemes: [\n *     { network: \"eip155:84532\", client: new ExactEvmScheme(account) },\n *   ],\n *   autoPayment: true,\n *   onPaymentRequested: async ({ paymentRequired }) => {\n *     console.log(`Payment required: ${paymentRequired.accepts[0].amount}`);\n *     return true; // Auto-approve\n *   },\n * });\n *\n * // Connect to server\n * const transport = new SSEClientTransport(new URL(\"http://localhost:4022/sse\"));\n * await client.connect(transport);\n *\n * // List available tools\n * const { tools } = await client.listTools();\n *\n * // Call a paid tool (payment handled automatically)\n * const result = await client.callTool(\"get_weather\", { city: \"NYC\" });\n * ```\n */\nexport function createx402MCPClient(config: x402MCPClientConfig): x402MCPClient {\n  // Create MCP client\n  const mcpClient = new Client(\n    {\n      name: config.name,\n      version: config.version,\n    },\n    config.mcpClientOptions,\n  );\n\n  // Create x402 payment client\n  const paymentClient = new x402Client();\n\n  // Register schemes\n  for (const scheme of config.schemes) {\n    if (scheme.x402Version === 1) {\n      paymentClient.registerV1(scheme.network, scheme.client);\n    } else {\n      paymentClient.register(scheme.network, scheme.client);\n    }\n  }\n\n  // Create x402MCPClient with options\n  return new x402MCPClient(mcpClient, paymentClient, {\n    autoPayment: config.autoPayment,\n    onPaymentRequested: config.onPaymentRequested,\n  });\n}\n","import type { PaymentPayload, PaymentRequired, SettleResponse } from \"@x402/core/types\";\nimport { parsePaymentRequired } from \"@x402/core/schemas\";\nimport {\n  MCP_PAYMENT_META_KEY,\n  MCP_PAYMENT_REQUIRED_CODE,\n  MCP_PAYMENT_RESPONSE_META_KEY,\n  type MCPPaymentRequiredError,\n  type MCPRequestParamsWithMeta,\n  type MCPResultWithMeta,\n} from \"../types\";\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for checking if a value is a non-null object.\n * Exported for use in other modules.\n *\n * @param value - The value to check\n * @returns True if value is a non-null object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null;\n}\n\n/**\n * Type guard for PaymentPayload structure.\n * Only performs minimal structural validation - full validation happens in verifyPayment.\n *\n * @param value - The value to check\n * @returns True if value is a PaymentPayload structure\n */\nfunction isPaymentPayloadStructure(value: unknown): value is PaymentPayload {\n  if (!isObject(value)) {\n    return false;\n  }\n  // PaymentPayload must have x402Version and payload fields\n  return \"x402Version\" in value && \"payload\" in value;\n}\n\n/**\n * Type guard for SettleResponse structure.\n *\n * @param value - The value to check\n * @returns True if value is a SettleResponse structure\n */\nfunction isSettleResponseStructure(value: unknown): value is SettleResponse {\n  if (!isObject(value)) {\n    return false;\n  }\n  return \"success\" in value;\n}\n\n/**\n * Type guard for PaymentRequired structure.\n *\n * @param value - The value to check\n * @returns True if value is a PaymentRequired structure\n */\nfunction isPaymentRequiredStructure(value: unknown): value is PaymentRequired {\n  if (!isObject(value)) {\n    return false;\n  }\n  return (\n    \"x402Version\" in value &&\n    \"accepts\" in value &&\n    Array.isArray((value as { accepts: unknown }).accepts)\n  );\n}\n\n// ============================================================================\n// Extraction Functions\n// ============================================================================\n\n/**\n * Extracts payment payload from MCP request _meta field.\n * Matches HTTP transport's simple validation approach.\n *\n * @param params - MCP request parameters that may contain _meta\n * @returns The payment payload if present and valid, null otherwise\n */\nexport function extractPaymentFromMeta(\n  params: MCPRequestParamsWithMeta | undefined,\n): PaymentPayload | null {\n  if (!params?._meta) {\n    return null;\n  }\n\n  const payment = params._meta[MCP_PAYMENT_META_KEY];\n\n  // Simple validation - just check it has expected structure\n  // Full validation happens in verifyPayment\n  if (!isPaymentPayloadStructure(payment)) {\n    return null;\n  }\n\n  return payment;\n}\n\n/**\n * Attaches payment payload to MCP request params _meta field\n *\n * @param params - Original request params containing name and optional arguments\n * @param params.name - The tool name\n * @param params.arguments - Optional tool arguments\n * @param params._meta - Optional existing metadata to preserve\n * @param paymentPayload - Payment payload to attach\n * @returns New params object with payment in _meta\n */\nexport function attachPaymentToMeta(\n  params: { name: string; arguments?: Record<string, unknown>; _meta?: Record<string, unknown> },\n  paymentPayload: PaymentPayload,\n): MCPRequestParamsWithMeta {\n  return {\n    ...params,\n    _meta: {\n      ...params._meta,\n      [MCP_PAYMENT_META_KEY]: paymentPayload,\n    },\n  };\n}\n\n/**\n * Extracts payment response from MCP result _meta field\n *\n * @param result - MCP result that may contain _meta\n * @returns The settlement response if present, null otherwise\n */\nexport function extractPaymentResponseFromMeta(\n  result: MCPResultWithMeta | undefined,\n): SettleResponse | null {\n  if (!result?._meta) {\n    return null;\n  }\n\n  const response = result._meta[MCP_PAYMENT_RESPONSE_META_KEY];\n\n  // Validate it has the required structure\n  if (!isSettleResponseStructure(response)) {\n    return null;\n  }\n\n  return response;\n}\n\n/**\n * Result content item for MCP responses\n */\ninterface ResultContentItem {\n  [key: string]: unknown;\n  type: string;\n}\n\n/**\n * Attaches settlement response to MCP result _meta field\n *\n * @param result - Original result object containing content and optional isError flag\n * @param result.content - The tool result content array\n * @param result.isError - Optional flag indicating if the result is an error\n * @param result._meta - Optional existing metadata to preserve\n * @param settleResponse - Settlement response to attach\n * @returns New result object with payment response in _meta\n */\nexport function attachPaymentResponseToMeta(\n  result: { content: ResultContentItem[]; isError?: boolean; _meta?: Record<string, unknown> },\n  settleResponse: SettleResponse,\n): MCPResultWithMeta {\n  return {\n    ...result,\n    _meta: {\n      ...result._meta,\n      [MCP_PAYMENT_RESPONSE_META_KEY]: settleResponse,\n    },\n  };\n}\n\n/**\n * Creates an MCP JSON-RPC error for payment required (402)\n *\n * @param paymentRequired - The payment requirements\n * @param message - Optional custom error message\n * @returns JSON-RPC error object\n */\nexport function createPaymentRequiredError(\n  paymentRequired: PaymentRequired,\n  message?: string,\n): MCPPaymentRequiredError {\n  return {\n    code: MCP_PAYMENT_REQUIRED_CODE,\n    message: message || \"Payment required\",\n    data: paymentRequired,\n  };\n}\n\n/**\n * Extracts PaymentRequired from an MCP JSON-RPC error\n *\n * @param error - The error object from a JSON-RPC response\n * @returns The PaymentRequired if this is a 402 error, null otherwise\n */\nexport function extractPaymentRequiredFromError(error: unknown): PaymentRequired | null {\n  if (!isObject(error)) {\n    return null;\n  }\n\n  // Check if this is a 402 payment required error\n  if (error.code !== MCP_PAYMENT_REQUIRED_CODE) {\n    return null;\n  }\n\n  // Extract and validate the data field\n  const data = error.data;\n  if (!isPaymentRequiredStructure(data)) {\n    return null;\n  }\n\n  // parsePaymentRequired yields the schema (V1 | V2) union; cast to the transport PaymentRequired type\n  const result = parsePaymentRequired(data);\n  return result.success ? (result.data as PaymentRequired) : null;\n}\n\n/**\n * Creates a resource URL for an MCP tool\n *\n * @param toolName - The name of the tool\n * @param customUrl - Optional custom URL override\n * @returns The resource URL\n */\nexport function createToolResourceUrl(toolName: string, customUrl?: string): string {\n  if (customUrl) {\n    return customUrl;\n  }\n  return `mcp://tool/${toolName}`;\n}\n","import type {\n  Network,\n  PaymentPayload,\n  PaymentRequired,\n  PaymentRequirements,\n  Price,\n  SettleResponse,\n} from \"@x402/core/types\";\nimport { isObject } from \"../utils/encoding\";\n\n/**\n * MCP JSON-RPC error code for payment required (x402)\n */\nexport const MCP_PAYMENT_REQUIRED_CODE = 402;\n\n/**\n * MCP's UrlElicitationRequired JSON-RPC error code (-32042) from SEP-1036.\n *\n * SEP-1036 defines this code for flows where the server needs the client to\n * provide something before proceeding, explicitly including payment flows.\n * This is the only custom error code the MCP TypeScript SDK propagates with\n * error.data intact through McpServer's tool handler catch block.\n *\n * Using this code for payment challenges ensures error.data (containing\n * PaymentRequired) survives the McpServer round-trip, working around the\n * SDK limitation tracked in:\n * https://github.com/modelcontextprotocol/typescript-sdk/issues/774\n */\nexport const JSONRPC_PAYMENT_REQUIRED_CODE = -32042;\n\n/**\n * MCP _meta key for payment payload (client → server)\n */\nexport const MCP_PAYMENT_META_KEY = \"x402/payment\";\n\n/**\n * MCP _meta key for payment response (server → client)\n */\nexport const MCP_PAYMENT_RESPONSE_META_KEY = \"x402/payment-response\";\n\n/**\n * Dynamic function to resolve payTo address based on tool call context\n */\nexport type DynamicPayTo = (context: MCPToolContext) => string | Promise<string>;\n\n/**\n * Dynamic function to resolve price based on tool call context\n */\nexport type DynamicPrice = (context: MCPToolContext) => Price | Promise<Price>;\n\n/**\n * Context provided to dynamic functions and hooks during tool execution\n */\nexport interface MCPToolContext {\n  /** The name of the tool being called */\n  toolName: string;\n  /** The arguments passed to the tool */\n  arguments: Record<string, unknown>;\n  /** Optional metadata from the request */\n  meta?: Record<string, unknown>;\n}\n\n/**\n * Payment configuration for a paid MCP tool\n */\nexport interface MCPToolPaymentConfig {\n  /** Payment scheme identifier (e.g., \"exact\") */\n  scheme: string;\n\n  /** Blockchain network identifier in CAIP-2 format (e.g., \"eip155:84532\") */\n  network: Network;\n\n  /** Price for the tool call (e.g., \"$0.10\", \"1000000\") */\n  price: Price | DynamicPrice;\n\n  /** Recipient wallet address or dynamic resolver */\n  payTo: string | DynamicPayTo;\n\n  /** Maximum time allowed for payment completion in seconds */\n  maxTimeoutSeconds?: number;\n\n  /** Scheme-specific additional information */\n  extra?: Record<string, unknown>;\n\n  /** Resource metadata for the tool */\n  resource?: {\n    /** Custom URL for the resource (defaults to mcp://tool/{toolName}) */\n    url?: string;\n    /** Human-readable description of the tool */\n    description?: string;\n    /** MIME type of the tool response */\n    mimeType?: string;\n  };\n}\n\n/**\n * Result of processing an MCP tool request for payment\n */\nexport type MCPPaymentProcessResult =\n  | { type: \"no-payment-required\" }\n  | {\n      type: \"payment-verified\";\n      paymentPayload: PaymentPayload;\n      paymentRequirements: PaymentRequirements;\n    }\n  | {\n      type: \"payment-error\";\n      error: MCPPaymentError;\n    };\n\n/**\n * MCP payment error structure for JSON-RPC error responses\n */\nexport interface MCPPaymentError {\n  /** JSON-RPC error code (402 for payment required) */\n  code: number;\n  /** Human-readable error message */\n  message: string;\n  /** PaymentRequired data for 402 errors */\n  data?: PaymentRequired;\n}\n\n/**\n * Context provided to onPaymentRequired hooks\n */\nexport interface PaymentRequiredContext {\n  /** The tool name that returned 402 */\n  toolName: string;\n  /** The arguments that were passed to the tool */\n  arguments: Record<string, unknown>;\n  /** The payment requirements from the server */\n  paymentRequired: PaymentRequired;\n}\n\n/**\n * Result from onPaymentRequired hook\n */\nexport interface PaymentRequiredHookResult {\n  /** Custom payment payload to use instead of auto-generated */\n  payment?: PaymentPayload;\n  /** Skip payment and abort the call */\n  abort?: boolean;\n}\n\n/**\n * Hook called when a 402 response is received, before payment processing.\n * Return payment to use that instead of auto-generating, abort: true to stop.\n * Return void/undefined to proceed with normal payment flow.\n */\nexport type PaymentRequiredHook = (\n  context: PaymentRequiredContext,\n) => Promise<PaymentRequiredHookResult | void> | PaymentRequiredHookResult | void;\n\n/**\n * Options for x402MCPClient\n */\nexport interface x402MCPClientOptions {\n  /**\n   * Whether to automatically retry tool calls with payment on 402 errors.\n   * When true (default), the client will automatically create and submit\n   * payment when a 402 error is received.\n   * When false, the client will throw the 402 error for manual handling.\n   *\n   * @default true\n   */\n  autoPayment?: boolean;\n\n  /**\n   * Hook called when a payment is requested by the server (402 response).\n   * Return true to proceed with payment, false to abort.\n   * Only called when autoPayment is true.\n   *\n   * This can be used to implement human-in-the-loop approval.\n   */\n  onPaymentRequested?: (context: PaymentRequestedContext) => Promise<boolean> | boolean;\n}\n\n/**\n * Context provided to payment requested hook\n */\nexport interface PaymentRequestedContext {\n  /** The tool being called */\n  toolName: string;\n  /** The arguments passed to the tool */\n  arguments: Record<string, unknown>;\n  /** The payment requirements from the server */\n  paymentRequired: PaymentRequired;\n}\n\n// ============================================================================\n// Server Hooks\n// ============================================================================\n\n/**\n * Context provided to server-side hooks during tool execution\n */\nexport interface ServerHookContext {\n  /** The name of the tool being called */\n  toolName: string;\n  /** The arguments passed to the tool */\n  arguments: Record<string, unknown>;\n  /** The resolved payment requirements */\n  paymentRequirements: PaymentRequirements;\n  /** The payment payload from the client */\n  paymentPayload: PaymentPayload;\n}\n\n/**\n * Hook called before tool execution (after payment verification)\n * Return false to abort execution and return a 402 error\n */\nexport type BeforeExecutionHook = (\n  context: ServerHookContext,\n) => Promise<boolean | void> | boolean | void;\n\n/**\n * Context for after execution hook including the result\n */\nexport interface AfterExecutionContext extends ServerHookContext {\n  /** The tool execution result */\n  result: {\n    content: Array<{ type: \"text\"; text: string }>;\n    isError?: boolean;\n  };\n}\n\n/**\n * Hook called after tool execution (before settlement)\n */\nexport type AfterExecutionHook = (context: AfterExecutionContext) => Promise<void> | void;\n\n/**\n * Context for settlement hooks\n */\nexport interface SettlementContext extends ServerHookContext {\n  /** The settlement result */\n  settlement: SettleResponse;\n}\n\n/**\n * Hook called after successful settlement\n */\nexport type AfterSettlementHook = (context: SettlementContext) => Promise<void> | void;\n\n/**\n * Tool content item type\n */\nexport interface ToolContentItem {\n  [key: string]: unknown;\n  type: string;\n  text?: string;\n}\n\n/**\n * Result of a tool call that includes payment response metadata\n */\nexport interface MCPToolResultWithPayment {\n  /** Standard MCP tool result content */\n  content: ToolContentItem[];\n  /** Whether the tool execution resulted in an error */\n  isError?: boolean;\n  /** Payment response metadata (settlement info) */\n  paymentResponse?: SettleResponse;\n}\n\n/**\n * MCP metadata with payment\n */\nexport interface MCPMetaWithPayment {\n  [key: string]: unknown;\n  [MCP_PAYMENT_META_KEY]?: PaymentPayload;\n}\n\n/**\n * MCP request params with optional _meta field for payment\n */\nexport interface MCPRequestParamsWithMeta {\n  /** Tool name */\n  name: string;\n  /** Tool arguments */\n  arguments?: Record<string, unknown>;\n  /** Metadata including potential payment payload */\n  _meta?: MCPMetaWithPayment;\n}\n\n/**\n * MCP metadata with payment response\n */\nexport interface MCPMetaWithPaymentResponse {\n  [key: string]: unknown;\n  [MCP_PAYMENT_RESPONSE_META_KEY]?: SettleResponse;\n}\n\n/**\n * MCP result with optional _meta field for payment response\n */\nexport interface MCPResultWithMeta {\n  /** Tool result content */\n  content?: ToolContentItem[];\n  /** Whether the result is an error */\n  isError?: boolean;\n  /** Metadata including potential payment response */\n  _meta?: MCPMetaWithPaymentResponse;\n}\n\n/**\n * MCP JSON-RPC error with payment required data.\n *\n * Discriminated by `code`:\n * - `402` (legacy x402): PaymentRequired directly in `data`\n * - `-32042` (SEP-1036 UrlElicitationRequired): PaymentRequired in `data`, or\n *   namespaced under `data.x402` when servers carry additional payment-method\n *   data alongside x402 requirements.\n */\nexport type MCPPaymentRequiredError =\n  | {\n      code: typeof MCP_PAYMENT_REQUIRED_CODE;\n      message: string;\n      data: PaymentRequired;\n    }\n  | {\n      code: typeof JSONRPC_PAYMENT_REQUIRED_CODE;\n      message: string;\n      data: PaymentRequired;\n    }\n  | {\n      code: typeof JSONRPC_PAYMENT_REQUIRED_CODE;\n      message: string;\n      data: { x402: PaymentRequired } & Record<string, unknown>;\n    };\n\n/**\n * Type guard to check if an error is a payment required error.\n *\n * Supports both the legacy x402 error code (402) and the MCP standard\n * UrlElicitationRequired code (-32042) which covers payment flows per SEP-1036.\n *\n * For -32042 errors, PaymentRequired may be directly in error.data or\n * namespaced under error.data.x402 (for servers that include additional\n * payment method data alongside x402 requirements).\n *\n * @param error - The error to check\n * @returns True if the error is a payment required error\n */\nexport function isPaymentRequiredError(error: unknown): error is MCPPaymentRequiredError {\n  if (!isObject(error)) {\n    return false;\n  }\n\n  if (typeof error.message !== \"string\") {\n    return false;\n  }\n\n  // Legacy x402 error code (402) - PaymentRequired directly in error.data\n  if (error.code === MCP_PAYMENT_REQUIRED_CODE) {\n    if (!isObject(error.data)) return false;\n    return \"x402Version\" in error.data && \"accepts\" in error.data;\n  }\n\n  // MCP UrlElicitationRequired (-32042) - used for payment flows per SEP-1036\n  if (error.code === JSONRPC_PAYMENT_REQUIRED_CODE) {\n    if (!isObject(error.data)) return false;\n    // Direct PaymentRequired in error.data\n    if (\"x402Version\" in error.data && \"accepts\" in error.data) return true;\n    // Namespaced under error.data.x402\n    if (isObject(error.data.x402)) {\n      return \"x402Version\" in error.data.x402 && \"accepts\" in error.data.x402;\n    }\n    return false;\n  }\n\n  return false;\n}\n","/**\n * Payment wrapper for MCP tool handlers\n *\n * This module provides a functional API for adding x402 payment to MCP tool handlers.\n * Use createPaymentWrapper to wrap tool handlers with payment verification and settlement.\n */\n\nimport type { PaymentPayload, PaymentRequirements, ResourceInfo } from \"@x402/core/types\";\nimport { x402ResourceServer } from \"@x402/core/server\";\n\nimport type {\n  MCPToolContext,\n  BeforeExecutionHook,\n  AfterExecutionHook,\n  AfterSettlementHook,\n  ServerHookContext,\n  AfterExecutionContext,\n  SettlementContext,\n} from \"../types\";\nimport { MCP_PAYMENT_RESPONSE_META_KEY } from \"../types\";\nimport { createToolResourceUrl, extractPaymentFromMeta } from \"../utils\";\n\n/**\n * Configuration for payment wrapper.\n */\nexport interface PaymentWrapperConfig {\n  /**\n   * Payment requirements that must be satisfied to call the tool.\n   * Typically a single entry, but can support multiple payment options.\n   *\n   * Each requirement specifies:\n   * - scheme: Payment scheme identifier (e.g., \"exact\")\n   * - network: Blockchain network in CAIP-2 format (e.g., \"eip155:84532\")\n   * - amount: Payment amount in token's smallest unit\n   * - asset: Token contract address\n   * - payTo: Recipient wallet address\n   * - maxTimeoutSeconds: Payment timeout (optional)\n   * - extra: Scheme-specific data (optional)\n   */\n  accepts: PaymentRequirements[];\n\n  /** Resource metadata for the tool */\n  resource?: {\n    /** Custom URL for the resource (defaults to mcp://tool/{toolName}) */\n    url?: string;\n    /** Human-readable description of the tool */\n    description?: string;\n    /** MIME type of the tool response */\n    mimeType?: string;\n    /** Human-readable name for the service hosting the tool */\n    serviceName?: string;\n    /** Short topical tags for discovery search */\n    tags?: string[];\n    /** Absolute http(s) URL to a service icon */\n    iconUrl?: string;\n  };\n\n  /** Hooks for payment lifecycle events */\n  hooks?: {\n    /** Called after payment verification, before tool execution. Return false to abort. */\n    onBeforeExecution?: BeforeExecutionHook;\n    /** Called after tool execution, before settlement */\n    onAfterExecution?: AfterExecutionHook;\n    /** Called after successful settlement */\n    onAfterSettlement?: AfterSettlementHook;\n  };\n\n  /**\n   * x402 extensions to include in the PaymentRequired response.\n   * Use this to attach Bazaar discovery metadata so facilitators can index the tool.\n   *\n   * @example\n   * ```typescript\n   * import { declareDiscoveryExtension } from \"@x402/extensions/bazaar\";\n   *\n   * resource: { url: \"mcp://tool/get_weather\" },\n   * extensions: declareDiscoveryExtension({\n   *   toolName: \"get_weather\",\n   *   description: \"Get current weather for a city\",\n   *   inputSchema: {\n   *     properties: { city: { type: \"string\" } },\n   *     required: [\"city\"],\n   *   },\n   * })\n   * ```\n   */\n  extensions?: Record<string, unknown>;\n}\n\n/**\n * Result type for wrapped tool handlers.\n * Matches the MCP SDK's expected tool result format with optional _meta.\n */\nexport interface WrappedToolResult {\n  [key: string]: unknown;\n  content: Array<{ type: \"text\"; text: string }>;\n  isError?: boolean;\n  _meta?: Record<string, unknown>;\n  structuredContent?: Record<string, unknown>;\n}\n\n/**\n * Tool result type without payment metadata\n */\nexport interface ToolResult {\n  [key: string]: unknown;\n  content: Array<{ type: \"text\"; text: string }>;\n  isError?: boolean;\n}\n\ninterface MCPPaymentTransportContext {\n  toolName: string;\n  arguments: Record<string, unknown>;\n  meta?: Record<string, unknown>;\n  result?: ToolResult | WrappedToolResult;\n}\n\n/**\n * Handler function type for tools to be wrapped with payment.\n */\nexport type PaymentWrappedHandler<TArgs = Record<string, unknown>> = (\n  args: TArgs,\n  context: MCPToolContext,\n) => Promise<ToolResult> | ToolResult;\n\n/**\n * MCP SDK compatible tool callback type.\n * This type matches the signature expected by McpServer.tool() for tools with arguments.\n * The extra parameter contains _meta and other request context from the MCP SDK.\n */\nexport type MCPToolCallback<TArgs = Record<string, unknown>> = (\n  args: TArgs,\n  extra: unknown,\n) => WrappedToolResult | Promise<WrappedToolResult>;\n\n/**\n * Creates a reusable payment wrapper for adding x402 payment to MCP tool handlers.\n *\n * This is the primary API for integrating x402 payments with MCP servers.\n * Use this when you have an existing McpServer and want to add payment to specific tools.\n *\n * @param resourceServer - The x402 resource server for payment verification/settlement\n * @param config - Payment configuration with accepts array\n * @returns A function that wraps tool handlers with payment logic\n *\n * @example\n * ```typescript\n * // Build payment requirements using resource server\n * const accepts = await resourceServer.buildPaymentRequirements({\n *   scheme: \"exact\",\n *   network: \"eip155:84532\",\n *   payTo: \"0xRecipient\",\n *   price: \"$0.10\",\n * });\n *\n * // Create wrapper with payment requirements\n * const paid = createPaymentWrapper(resourceServer, {\n *   accepts,\n *   hooks: {\n *     onBeforeExecution: async ({ paymentPayload }) => {\n *       if (await isRateLimited(paymentPayload.payer)) return false;\n *     },\n *     onAfterSettlement: async ({ settlement }) => {\n *       await sendReceipt(settlement.transaction);\n *     },\n *   },\n * });\n *\n * // Use with McpServer.tool()\n * mcpServer.tool(\"search\", \"Premium search ($0.10)\", { query: z.string() },\n *   paid(async (args) => ({\n *     content: [{ type: \"text\", text: \"Search results...\" }]\n *   }))\n * );\n * ```\n */\nexport function createPaymentWrapper(\n  resourceServer: x402ResourceServer,\n  config: PaymentWrapperConfig,\n): <TArgs extends Record<string, unknown>>(\n  handler: PaymentWrappedHandler<TArgs>,\n) => MCPToolCallback<TArgs> {\n  // Validate accepts array\n  if (!config.accepts || config.accepts.length === 0) {\n    throw new Error(\"PaymentWrapperConfig.accepts must have at least one payment requirement\");\n  }\n\n  // Return wrapper function that takes only the handler\n  return <TArgs extends Record<string, unknown>>(\n    handler: PaymentWrappedHandler<TArgs>,\n  ): MCPToolCallback<TArgs> => {\n    return async (args: TArgs, extra: unknown): Promise<WrappedToolResult> => {\n      // Extract _meta from extra if it's an object\n      const _meta = (extra as { _meta?: Record<string, unknown> })?._meta;\n      // Derive toolName from resource URL if available, otherwise use placeholder\n      const toolName = config.resource?.url?.replace(\"mcp://tool/\", \"\") || \"paid_tool\";\n\n      const context: MCPToolContext = {\n        toolName,\n        arguments: args,\n        meta: _meta,\n      };\n      const transportContext: MCPPaymentTransportContext = {\n        toolName,\n        arguments: args,\n        meta: _meta,\n      };\n\n      // Extract payment from _meta if present\n      const paymentPayload = extractPaymentFromMeta({\n        name: toolName,\n        arguments: args,\n        _meta,\n      });\n\n      // If no payment provided, return 402 error\n      if (!paymentPayload) {\n        return createPaymentRequiredResult(\n          resourceServer,\n          toolName,\n          config,\n          \"Payment required to access this tool\",\n          transportContext,\n        );\n      }\n\n      const resourceInfoForMatch = buildToolResourceInfo(toolName, config);\n      // Match on post-enrichment accepts (same as HTTP): extensions may change payTo etc.\n      const paymentRequiredForMatch = await resourceServer.createPaymentRequiredResponse(\n        config.accepts,\n        resourceInfoForMatch,\n        undefined,\n        config.extensions,\n        transportContext,\n      );\n      const paymentRequirements = resourceServer.findMatchingRequirements(\n        paymentRequiredForMatch.accepts,\n        paymentPayload,\n      );\n\n      if (!paymentRequirements) {\n        return createPaymentRequiredResult(\n          resourceServer,\n          toolName,\n          config,\n          \"No matching payment requirements found\",\n          transportContext,\n        );\n      }\n\n      const extensionResult = resourceServer.validateExtensions(\n        paymentRequiredForMatch,\n        paymentPayload,\n      );\n      if (!extensionResult.valid) {\n        return createPaymentRequiredResult(\n          resourceServer,\n          toolName,\n          config,\n          extensionResult.invalidReason,\n          transportContext,\n          paymentPayload,\n        );\n      }\n\n      const extMap = config.extensions ?? {};\n      const verifyResult = await resourceServer.verifyPayment(\n        paymentPayload,\n        paymentRequirements,\n        extMap,\n        transportContext,\n      );\n\n      if (!verifyResult.isValid) {\n        return createPaymentRequiredResult(\n          resourceServer,\n          toolName,\n          config,\n          verifyResult.invalidReason || \"Payment verification failed\",\n          transportContext,\n          paymentPayload,\n        );\n      }\n\n      // Build hook context\n      const hookContext: ServerHookContext = {\n        toolName,\n        arguments: args,\n        paymentRequirements,\n        paymentPayload,\n      };\n      const cancellationDispatcher = resourceServer.createPaymentCancellationDispatcher(\n        paymentPayload,\n        paymentRequirements,\n        extMap,\n        transportContext,\n      );\n\n      if (verifyResult.skipHandler) {\n        return settlePaymentResult(\n          resourceServer,\n          toolName,\n          config,\n          hookContext,\n          paymentPayload,\n          paymentRequirements,\n          extMap,\n          transportContext,\n          createSkipHandlerResult(verifyResult.skipHandler.body),\n        );\n      }\n\n      // Run onBeforeExecution hook if present\n      if (config.hooks?.onBeforeExecution) {\n        const hookResult = await config.hooks.onBeforeExecution(hookContext);\n        if (hookResult === false) {\n          return createPaymentRequiredResult(\n            resourceServer,\n            toolName,\n            config,\n            \"Execution blocked by hook\",\n            transportContext,\n          );\n        }\n      }\n\n      // Execute the tool handler\n      let result: ToolResult;\n      try {\n        result = await handler(args, context);\n      } catch (error) {\n        await cancellationDispatcher.cancel({\n          reason: \"handler_threw\",\n          error: error instanceof Error ? error : new Error(String(error)),\n        });\n        throw error;\n      }\n      transportContext.result = result;\n\n      // Build after execution context\n      const afterExecContext: AfterExecutionContext = {\n        ...hookContext,\n        result,\n      };\n\n      // Run onAfterExecution hook if present\n      if (config.hooks?.onAfterExecution) {\n        await config.hooks.onAfterExecution(afterExecContext);\n      }\n\n      // If the tool handler returned an error, don't proceed to settlement\n      if (result.isError) {\n        await cancellationDispatcher.cancel({ reason: \"handler_failed\" });\n        return result;\n      }\n\n      return settlePaymentResult(\n        resourceServer,\n        toolName,\n        config,\n        hookContext,\n        paymentPayload,\n        paymentRequirements,\n        extMap,\n        transportContext,\n        result,\n      );\n    };\n  };\n}\n\n/**\n * Builds a tool result from the verifier's `skipHandler` body when the handler is skipped but settlement still runs.\n *\n * @param body - Verifier-supplied body to expose as text; objects become JSON text and optional structured content.\n * @returns MCP-compatible wrapped result with text content and optional structured content.\n */\nfunction createSkipHandlerResult(body: unknown): WrappedToolResult {\n  const result: WrappedToolResult = {\n    content: [\n      {\n        type: \"text\",\n        text: typeof body === \"string\" ? body : JSON.stringify(body ?? {}),\n      },\n    ],\n  };\n\n  if (typeof body === \"object\" && body !== null && !Array.isArray(body)) {\n    result.structuredContent = body as Record<string, unknown>;\n  }\n\n  return result;\n}\n\n/**\n * Settles payment after tool execution and attaches settlement metadata to the tool result.\n *\n * @param resourceServer - x402 resource server used to perform settlement.\n * @param toolName - Name of the MCP tool that produced the result.\n * @param config - Payment wrapper configuration (e.g. settlement hooks).\n * @param hookContext - Hook context for the current server invocation.\n * @param paymentPayload - Verified payment payload from the client.\n * @param paymentRequirements - Payment requirements satisfied for this call.\n * @param extMap - Extension map forwarded to the settlement call.\n * @param transportContext - MCP payment transport context for this invocation.\n * @param result - Successful tool result to merge settlement metadata into.\n * @returns Tool result including `_meta` with settlement details, or a settlement-failure error result.\n */\nasync function settlePaymentResult(\n  resourceServer: x402ResourceServer,\n  toolName: string,\n  config: PaymentWrapperConfig,\n  hookContext: ServerHookContext,\n  paymentPayload: PaymentPayload,\n  paymentRequirements: PaymentRequirements,\n  extMap: Record<string, unknown>,\n  transportContext: MCPPaymentTransportContext,\n  result: WrappedToolResult | ToolResult,\n): Promise<WrappedToolResult> {\n  try {\n    const settleResult = await resourceServer.settlePayment(\n      paymentPayload,\n      paymentRequirements,\n      extMap,\n      transportContext,\n    );\n\n    if (config.hooks?.onAfterSettlement) {\n      const settlementContext: SettlementContext = {\n        ...hookContext,\n        settlement: settleResult,\n      };\n      await config.hooks.onAfterSettlement(settlementContext);\n    }\n\n    return {\n      ...result,\n      _meta: {\n        ...(result._meta as Record<string, unknown> | undefined),\n        [MCP_PAYMENT_RESPONSE_META_KEY]: settleResult,\n      },\n    };\n  } catch (settleError) {\n    return createSettlementFailedResult(\n      resourceServer,\n      toolName,\n      config,\n      settleError instanceof Error ? settleError.message : \"Settlement failed\",\n      transportContext,\n    );\n  }\n}\n\n/**\n * Builds ResourceInfo for an MCP tool from wrapper config.\n *\n * @param toolName - Name of the MCP tool\n * @param config - Payment wrapper configuration\n * @returns Resource metadata for PaymentRequired / matching\n */\nfunction buildToolResourceInfo(toolName: string, config: PaymentWrapperConfig): ResourceInfo {\n  const resourceInfo: ResourceInfo = {\n    url: createToolResourceUrl(toolName, config.resource?.url),\n    description: config.resource?.description || `Tool: ${toolName}`,\n    mimeType: config.resource?.mimeType || \"application/json\",\n  };\n  if (config.resource?.serviceName !== undefined) {\n    resourceInfo.serviceName = config.resource.serviceName;\n  }\n  if (config.resource?.tags !== undefined) {\n    resourceInfo.tags = config.resource.tags;\n  }\n  if (config.resource?.iconUrl !== undefined) {\n    resourceInfo.iconUrl = config.resource.iconUrl;\n  }\n  return resourceInfo;\n}\n\n/**\n * Helper to create 402 payment required result from wrapper config.\n *\n * @param resourceServer - The x402 resource server for creating payment required response\n * @param toolName - Name of the tool for resource URL\n * @param config - Payment wrapper configuration\n * @param errorMessage - Error message describing why payment is required\n * @param transportContext - Optional MCP payment transport context for the current tool call.\n * @param paymentPayload - Optional client payment payload to include when building the 402 response.\n * @returns Promise resolving to structured 402 error result with payment requirements\n */\nasync function createPaymentRequiredResult(\n  resourceServer: x402ResourceServer,\n  toolName: string,\n  config: PaymentWrapperConfig,\n  errorMessage: string,\n  transportContext?: MCPPaymentTransportContext,\n  paymentPayload?: PaymentPayload,\n): Promise<WrappedToolResult> {\n  const resourceInfo = buildToolResourceInfo(toolName, config);\n\n  const paymentRequired = await resourceServer.createPaymentRequiredResponse(\n    config.accepts,\n    resourceInfo,\n    errorMessage,\n    config.extensions,\n    transportContext,\n    paymentPayload,\n  );\n\n  return {\n    structuredContent: paymentRequired as unknown as Record<string, unknown>,\n    content: [\n      {\n        type: \"text\" as const,\n        text: JSON.stringify(paymentRequired),\n      },\n    ],\n    isError: true,\n  };\n}\n\n/**\n * Helper to create 402 settlement failed result from wrapper config.\n *\n * @param resourceServer - The x402 resource server for creating error response\n * @param toolName - Name of the tool for resource URL\n * @param config - Payment wrapper configuration\n * @param errorMessage - Error message describing the settlement failure\n * @param transportContext - Optional MCP payment transport context forwarded into the error result.\n * @returns Promise resolving to structured 402 error result with settlement failure info\n */\nasync function createSettlementFailedResult(\n  resourceServer: x402ResourceServer,\n  toolName: string,\n  config: PaymentWrapperConfig,\n  errorMessage: string,\n  transportContext?: MCPPaymentTransportContext,\n): Promise<WrappedToolResult> {\n  // Per spec R5, settlement failure follows the same format as payment required\n  // (structuredContent + content[0].text + isError: true) with the error message\n  // describing the settlement failure. We intentionally do NOT embed the\n  // x402/payment-response in the PaymentRequired object to avoid clients\n  // misinterpreting it as a new 402 and attempting to pay again.\n  return createPaymentRequiredResult(\n    resourceServer,\n    toolName,\n    config,\n    `Payment settlement failed: ${errorMessage}`,\n    transportContext,\n  );\n}\n","// @x402/mcp - MCP (Model Context Protocol) integration for x402 payment protocol\n//\n// This package provides MCP-native payment handling for AI agents and MCP servers.\n// It enables paid tool calls following the x402 protocol over MCP transport.\n\n// Client exports\nexport {\n  x402MCPClient,\n  createx402MCPClient,\n  wrapMCPClientWithPayment,\n  wrapMCPClientWithPaymentFromConfig,\n} from \"./client\";\nexport type {\n  BeforePaymentHook,\n  AfterPaymentHook,\n  x402MCPToolCallResult,\n  x402MCPClientConfig,\n  MCPContentItem,\n} from \"./client\";\n\n// Server exports\nexport { createPaymentWrapper } from \"./server\";\nexport type {\n  PaymentWrapperConfig,\n  PaymentWrappedHandler,\n  WrappedToolResult,\n  ToolResult,\n  MCPToolCallback,\n} from \"./server\";\n\n// Type exports\nexport {\n  MCP_PAYMENT_REQUIRED_CODE,\n  MCP_PAYMENT_META_KEY,\n  MCP_PAYMENT_RESPONSE_META_KEY,\n  isPaymentRequiredError,\n} from \"./types\";\nexport type {\n  // Core MCP types\n  MCPToolContext,\n  MCPToolPaymentConfig,\n  MCPPaymentProcessResult,\n  MCPPaymentError,\n  x402MCPClientOptions,\n  PaymentRequestedContext,\n  MCPToolResultWithPayment,\n  MCPRequestParamsWithMeta,\n  MCPResultWithMeta,\n  MCPPaymentRequiredError,\n  DynamicPayTo,\n  DynamicPrice,\n  ToolContentItem,\n  // Server hook types\n  ServerHookContext,\n  BeforeExecutionHook,\n  AfterExecutionContext,\n  AfterExecutionHook,\n  SettlementContext,\n  AfterSettlementHook,\n  // Client hook types\n  PaymentRequiredContext,\n  PaymentRequiredHookResult,\n  PaymentRequiredHook,\n} from \"./types\";\n\n// Utility exports\nexport {\n  extractPaymentFromMeta,\n  attachPaymentToMeta,\n  extractPaymentResponseFromMeta,\n  attachPaymentResponseToMeta,\n  createPaymentRequiredError,\n  extractPaymentRequiredFromError,\n  createToolResourceUrl,\n} from \"./utils\";\n\n// ============================================================================\n// Convenience Re-exports from @x402/core\n// ============================================================================\n// These re-exports provide common types and classes that MCP users frequently need,\n// reducing the number of separate package imports required.\n\nexport { x402Client } from \"@x402/core/client\";\nexport type { x402ClientConfig, SelectPaymentRequirements, PaymentPolicy } from \"@x402/core/client\";\n\nexport { x402ResourceServer } from \"@x402/core/server\";\n\nexport type {\n  PaymentPayload,\n  PaymentRequired,\n  PaymentRequirements,\n  SettleResponse,\n  Network,\n  SchemeNetworkClient,\n  SchemeNetworkServer,\n} from \"@x402/core/types\";\n"],"mappings":"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","names":["parsePaymentRequired","parsePaymentRequired","x402Client"]}