@ar-agents/mercadopago 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/CHANGELOG.md +71 -0
- package/dist/index.cjs +689 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +279 -2
- package/dist/index.d.ts +279 -2
- package/dist/index.js +689 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/tools.ts","../src/state.ts","../src/types.ts","../src/webhook.ts"],"names":["text","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base class for any error originating from the Mercado Pago integration. All\n * specific error types extend this. Carries the MP HTTP status, the parsed\n * body when available, and the endpoint that failed for debugging.\n */\nexport class MercadoPagoError extends Error {\n constructor(\n message: string,\n public status: number,\n public endpoint: string,\n public mpResponse?: unknown,\n ) {\n super(message);\n this.name = \"MercadoPagoError\";\n }\n}\n\n/**\n * Thrown when the access token is missing, expired, or rejected by MP.\n */\nexport class MercadoPagoAuthError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the request as unauthorized. Check the access token (TEST- prefix for sandbox, APP_USR- for production).\",\n 401,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAuthError\";\n }\n}\n\n/**\n * Thrown when MP returns the \"back_url is not a valid URL\" rejection. Common\n * when devs pass localhost or http:// — MP requires HTTPS only, even in sandbox.\n */\nexport class MercadoPagoBackUrlInvalidError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"back_url must be a valid HTTPS URL. localhost and http:// URLs are rejected by Mercado Pago, including in sandbox. Use a placeholder like https://example.com/done for local testing.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoBackUrlInvalidError\";\n }\n}\n\n/**\n * Thrown when the buyer email matches the seller account's email. MP refuses\n * self-payment on subscriptions: the Confirmar button at the init_point UI\n * stays disabled with no surfaceable error message.\n */\nexport class MercadoPagoSelfPaymentError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"The buyer email cannot equal the seller account's email. Mercado Pago blocks self-payment on subscriptions.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoSelfPaymentError\";\n }\n}\n\n/**\n * Thrown when MP returns \"Cannot operate between different countries\". Despite\n * the error text, this generally signals an account-type mismatch (real\n * account-in-test-mode vs. test user account), not a literal country mismatch.\n */\nexport class MercadoPagoAccountTypeMismatchError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the operation: 'Cannot operate between different countries'. Despite the wording, this usually means the seller token and the buyer email are different account types (real-account-in-test-mode vs. test_user_*@testuser.com). Use a real consumer email as the buyer.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAccountTypeMismatchError\";\n }\n}\n\n/**\n * Thrown when MP's risk engine rejects the first payment of a subscription.\n * IMPORTANT: when this happens, MP automatically cancels the entire preapproval\n * — you cannot retry on the same subscription, you must create a fresh one.\n */\nexport class MercadoPagoPaymentRejectedError extends MercadoPagoError {\n constructor(\n public preapprovalId: string,\n public statusDetail: string | null,\n body?: unknown,\n ) {\n super(\n `Payment rejected by Mercado Pago risk engine on preapproval ${preapprovalId}. Status detail: ${statusDetail ?? \"unknown\"}. The preapproval was auto-cancelled by MP — create a fresh subscription to retry.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoPaymentRejectedError\";\n }\n}\n\n/**\n * Thrown when an attempt is made to authorize a preapproval via API. Only the\n * payer can authorize via the init_point UI; there is no admin override even\n * in sandbox.\n */\nexport class MercadoPagoAuthorizeForbiddenError extends MercadoPagoError {\n constructor(preapprovalId: string, body?: unknown) {\n super(\n `Cannot authorize preapproval ${preapprovalId} via API: only the payer can authorize through the init_point checkout. There is no API shortcut, even in sandbox.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoAuthorizeForbiddenError\";\n }\n}\n\n/**\n * Thrown when MP rate-limits the integration. Retry with exponential backoff.\n */\nexport class MercadoPagoRateLimitError extends MercadoPagoError {\n constructor(\n endpoint: string,\n public retryAfterSeconds: number | null,\n body?: unknown,\n ) {\n super(\n `Mercado Pago rate limit hit on ${endpoint}. ${\n retryAfterSeconds\n ? `Retry after ${retryAfterSeconds}s.`\n : \"Retry with exponential backoff.\"\n }`,\n 429,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoRateLimitError\";\n }\n}\n\n/**\n * Thrown when MP is overloaded and serves an HTML 503 page instead of a JSON\n * error. The library detects content-type !== application/json on 5xx and\n * raises this typed error so retry logic + agent UX can branch correctly.\n */\nexport class MercadoPagoOverloadedError extends MercadoPagoError {\n constructor(endpoint: string, status: number) {\n super(\n `Mercado Pago appears overloaded — returned a non-JSON ${status} response for ${endpoint}. Wait a few seconds and retry.`,\n status,\n endpoint,\n );\n this.name = \"MercadoPagoOverloadedError\";\n }\n}\n\n/**\n * Thrown when a request exceeds the configured `requestTimeoutMs`. Retried\n * automatically up to `maxRetries`; this surfaces only when the budget runs\n * out.\n */\nexport class MercadoPagoTimeoutError extends MercadoPagoError {\n constructor(endpoint: string, public readonly timeoutMs: number) {\n super(\n `Mercado Pago request timed out after ${timeoutMs}ms on ${endpoint}. Increase requestTimeoutMs or check connectivity.`,\n 0,\n endpoint,\n );\n this.name = \"MercadoPagoTimeoutError\";\n }\n}\n\n/**\n * Maps an MP error response body to the most specific known error class. Falls\n * back to the generic MercadoPagoError when no specific pattern matches.\n */\nexport function classifyError(\n status: number,\n endpoint: string,\n body: unknown,\n context?: { preapprovalId?: string; payerEmail?: string; sellerEmail?: string },\n): MercadoPagoError {\n const bodyText =\n typeof body === \"string\"\n ? body\n : body && typeof body === \"object\"\n ? JSON.stringify(body)\n : \"\";\n const lower = bodyText.toLowerCase();\n\n if (status === 401) return new MercadoPagoAuthError(endpoint, body);\n if (status === 429) {\n // Try to extract Retry-After from the body if it includes one.\n let retryAfter: number | null = null;\n const obj = body as { retry_after?: number; \"retry-after\"?: number } | undefined;\n if (obj?.retry_after) retryAfter = Number(obj.retry_after);\n else if (obj?.[\"retry-after\"]) retryAfter = Number(obj[\"retry-after\"]);\n return new MercadoPagoRateLimitError(endpoint, retryAfter, body);\n }\n if (status === 400) {\n if (lower.includes(\"back_url\") && lower.includes(\"not a valid url\")) {\n return new MercadoPagoBackUrlInvalidError(endpoint, body);\n }\n if (\n lower.includes(\"cannot operate\") &&\n lower.includes(\"different countries\")\n ) {\n return new MercadoPagoAccountTypeMismatchError(endpoint, body);\n }\n if (\n lower.includes(\"only the payer can\") &&\n context?.preapprovalId\n ) {\n return new MercadoPagoAuthorizeForbiddenError(context.preapprovalId, body);\n }\n if (\n context?.payerEmail &&\n context?.sellerEmail &&\n context.payerEmail.toLowerCase() === context.sellerEmail.toLowerCase()\n ) {\n return new MercadoPagoSelfPaymentError(endpoint, body);\n }\n }\n return new MercadoPagoError(\n `Mercado Pago ${endpoint} failed: ${status} ${bodyText.slice(0, 200)}`,\n status,\n endpoint,\n body,\n );\n}\n","import { classifyError, MercadoPagoError, MercadoPagoOverloadedError, MercadoPagoRateLimitError, MercadoPagoTimeoutError } from \"./errors\";\nimport type {\n AccountInfo,\n CardToken,\n CreateCardTokenParams,\n CreateCustomerParams,\n CreatePaymentParams,\n CreatePreapprovalParams,\n CreatePreferenceParams,\n CreateQrPaymentParams,\n CreateRefundParams,\n Customer,\n CustomerCard,\n InstallmentOffer,\n Payment,\n PaymentMethod,\n PaymentsSearchResult,\n Preapproval,\n Preference,\n QrOrder,\n Refund,\n SearchPaymentsParams,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.mercadopago.com\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface MercadoPagoClientOptions {\n /** Access token. TEST- prefix for sandbox, APP_USR- for production. */\n accessToken: string;\n /**\n * Override the API base URL. Mostly useful for tests against MSW or for\n * pointing at a regional MP host. Defaults to https://api.mercadopago.com.\n */\n baseUrl?: string;\n /**\n * Custom fetch implementation. Defaults to globalThis.fetch. Override to\n * inject your own retry/instrumentation layer or to test with MSW.\n */\n fetch?: typeof fetch;\n /**\n * Per-request timeout in ms. Aborts the request and throws if exceeded.\n * Default 30_000 (30s). MP can be slow under load; 30s is a safe upper bound.\n */\n requestTimeoutMs?: number;\n /**\n * Number of retries on 5xx + network errors. Default 1 (single retry).\n * 4xx errors are NEVER retried (they're user/config errors). Each retry\n * uses exponential backoff: 250ms, 500ms, 1000ms, ...\n */\n maxRetries?: number;\n /**\n * Observability hook fired AFTER every request (success or failure).\n * Useful for logging, metrics, tracing. Synchronous, fire-and-forget.\n */\n onCall?: (event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void;\n}\n\ninterface RequestOptions {\n /** Idempotency key. Required for POST/PUT to dedupe retries safely. */\n idempotencyKey?: string;\n /** Query string params. Object → URLSearchParams. */\n query?: Record<string, string | number | undefined>;\n /** Context for error classification. */\n classifyContext?: {\n preapprovalId?: string;\n paymentId?: string;\n customerId?: string;\n payerEmail?: string;\n sellerEmail?: string;\n };\n}\n\n/**\n * Thin, typed wrapper around Mercado Pago's REST API. Exposes the surface\n * the agent layer needs: Subscriptions (Preapprovals), Payments, Checkout Pro\n * (Preferences), Customers + saved Cards, Refunds, Payment Methods +\n * Installments, and Account info. Deliberately narrower than a full SDK\n * rebuild — we add endpoints when the agent layer needs them.\n */\nexport class MercadoPagoClient {\n private readonly accessToken: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch | undefined;\n private readonly requestTimeoutMs: number;\n private readonly maxRetries: number;\n private readonly onCall:\n | ((event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void)\n | undefined;\n\n constructor(options: MercadoPagoClientOptions) {\n if (!options.accessToken) {\n throw new Error(\n \"MercadoPagoClient requires an accessToken. Get one from https://www.mercadopago.com.ar/developers/panel/credentials\",\n );\n }\n this.accessToken = options.accessToken;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.fetchImpl = options.fetch;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;\n this.maxRetries = Math.max(0, options.maxRetries ?? 1);\n this.onCall = options.onCall;\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.accessToken}`,\n \"Content-Type\": \"application/json\",\n };\n if (options?.idempotencyKey) {\n headers[\"X-Idempotency-Key\"] = options.idempotencyKey;\n }\n\n let url = `${this.baseUrl}${path}`;\n if (options?.query) {\n const search = new URLSearchParams();\n for (const [k, v] of Object.entries(options.query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n search.set(k, String(v));\n }\n }\n const qs = search.toString();\n if (qs) url += `?${qs}`;\n }\n\n const fetchFn = this.fetchImpl ?? globalThis.fetch;\n const t0 = Date.now();\n let attempt = 0;\n let lastError: unknown;\n let lastStatus: number | null = null;\n\n while (attempt <= this.maxRetries) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n\n const init: RequestInit = { method, headers, signal: controller.signal };\n if (body !== undefined) init.body = JSON.stringify(body);\n\n try {\n const res = await fetchFn(url, init);\n clearTimeout(timer);\n lastStatus = res.status;\n\n if (res.ok) {\n const text = await res.text();\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: true,\n });\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Retry on 5xx and 429 (rate-limit); never on 4xx user/config errors\n const isRetryable = res.status >= 500 || res.status === 429;\n if (isRetryable && attempt < this.maxRetries) {\n // Honor Retry-After header on 429\n const retryAfter = res.headers.get(\"retry-after\");\n const waitMs = retryAfter\n ? Number(retryAfter) * 1000\n : 250 * Math.pow(2, attempt);\n attempt++;\n await sleep(waitMs);\n continue;\n }\n\n // Detect HTML / non-JSON 5xx (MP overloaded)\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (res.status >= 500 && !contentType.includes(\"application/json\")) {\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw new MercadoPagoOverloadedError(path, res.status);\n }\n\n let parsed: unknown;\n const text = await res.text();\n try { parsed = JSON.parse(text); } catch { parsed = text; }\n const err = classifyError(res.status, path, parsed, options?.classifyContext);\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw err;\n } catch (err) {\n clearTimeout(timer);\n // If err is a MercadoPagoError, the 5xx-final / 4xx branch already\n // fired onCall above — don't double-fire. Just re-throw.\n if (err instanceof MercadoPagoError) throw err;\n\n // Network error / abort / parse error — retry if budget remains\n const isAbort = err instanceof Error && err.name === \"AbortError\";\n const isNetwork = !lastStatus && !isAbort;\n if ((isNetwork || isAbort) && attempt < this.maxRetries) {\n lastError = err;\n attempt++;\n await sleep(250 * Math.pow(2, attempt - 1));\n continue;\n }\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: lastStatus,\n retried: attempt,\n success: false,\n });\n if (isAbort) {\n throw new MercadoPagoTimeoutError(path, this.requestTimeoutMs);\n }\n throw err;\n }\n }\n\n throw lastError ?? new Error(`MercadoPago request failed after ${this.maxRetries} retries`);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Subscriptions (Preapprovals) — v0.1 surface, kept stable\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a recurring subscription (preapproval). The returned `init_point`\n * URL is where the buyer must complete the FIRST payment with their card +\n * CVV — there is no API path that bypasses this human step.\n */\n async createPreapproval(\n params: CreatePreapprovalParams,\n ): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"POST\",\n \"/preapproval\",\n {\n reason: params.reason,\n payer_email: params.payerEmail,\n back_url: params.backUrl,\n external_reference: params.externalReference,\n auto_recurring: {\n frequency: params.frequency,\n frequency_type: params.frequencyType,\n transaction_amount: params.amount,\n currency_id: params.currency,\n },\n },\n { classifyContext: { payerEmail: params.payerEmail } },\n );\n }\n\n async getPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\"GET\", `/preapproval/${id}`, undefined, {\n classifyContext: { preapprovalId: id },\n });\n }\n\n async cancelPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async pausePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"paused\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async resumePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"authorized\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment. Two main flows:\n * - **Card payment**: pass `token` (from MP frontend Cardform) + payment_method_id.\n * - **Account money / cash**: omit token, pass payment_method_id like \"account_money\", \"rapipago\", \"pagofacil\".\n *\n * For credit card payments where you don't have a card token (i.e., you only\n * have a payer email and want to send them a payment link), use\n * `createPreference` (Checkout Pro) instead.\n *\n * Idempotency: pass `idempotencyKey` to safely retry. Required for production\n * to dedupe network-failed requests.\n */\n async createPayment(params: CreatePaymentParams): Promise<Payment> {\n const body: Record<string, unknown> = {\n transaction_amount: params.transactionAmount,\n payment_method_id: params.paymentMethodId,\n payer: {\n email: params.payerEmail,\n ...(params.identification ? { identification: params.identification } : {}),\n },\n };\n if (params.installments !== undefined) body.installments = params.installments;\n if (params.token !== undefined) body.token = params.token;\n if (params.description !== undefined) body.description = params.description;\n if (params.externalReference !== undefined) body.external_reference = params.externalReference;\n if (params.notificationUrl !== undefined) body.notification_url = params.notificationUrl;\n if (params.statementDescriptor !== undefined)\n body.statement_descriptor = params.statementDescriptor;\n if (params.capture !== undefined) body.capture = params.capture;\n if (params.additionalInfo !== undefined) body.additional_info = params.additionalInfo;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { payerEmail: params.payerEmail },\n });\n }\n\n /** Fetch a payment by ID. */\n async getPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\"GET\", `/v1/payments/${id}`, undefined, {\n classifyContext: { paymentId: id },\n });\n }\n\n /**\n * Search payments with filters. Common: by external_reference (your-system\n * id), by status, by date range. Pagination via offset + limit (max 100).\n */\n async searchPayments(params: SearchPaymentsParams = {}): Promise<PaymentsSearchResult> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n if (params.externalReference) query[\"external_reference\"] = params.externalReference;\n if (params.status) query[\"status\"] = params.status as string;\n if (params.payerEmail) query[\"payer.email\"] = params.payerEmail;\n if (params.beginDate) query[\"begin_date\"] = params.beginDate;\n if (params.endDate) query[\"end_date\"] = params.endDate;\n if (params.sort) query[\"sort\"] = params.sort;\n if (params.criteria) query[\"criteria\"] = params.criteria;\n\n return this.request<PaymentsSearchResult>(\n \"GET\",\n \"/v1/payments/search\",\n undefined,\n { query },\n );\n }\n\n /**\n * Capture a previously authorized payment. Only works for credit-card\n * payments created with `capture: false`. Optional partial capture amount.\n */\n async capturePayment(id: string, amount?: number): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n amount !== undefined ? { capture: true, transaction_amount: amount } : { capture: true },\n { classifyContext: { paymentId: id } },\n );\n }\n\n /**\n * Cancel a pending or in_process payment. Once approved, you must use\n * `createRefund` instead.\n */\n async cancelPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { paymentId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Refunds\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Refund a payment fully (omit `amount`) or partially. Idempotency key\n * recommended — refunds can fail mid-flight and you don't want double-refunds\n * on retry.\n */\n async createRefund(params: CreateRefundParams): Promise<Refund> {\n const body = params.amount !== undefined ? { amount: params.amount } : undefined;\n return this.request<Refund>(\n \"POST\",\n `/v1/payments/${params.paymentId}/refunds`,\n body,\n {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { paymentId: params.paymentId },\n },\n );\n }\n\n async listRefunds(paymentId: string): Promise<Refund[]> {\n const res = await this.request<Refund[] | { refunds: Refund[] }>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds`,\n undefined,\n { classifyContext: { paymentId } },\n );\n return Array.isArray(res) ? res : res.refunds ?? [];\n }\n\n async getRefund(paymentId: string, refundId: string): Promise<Refund> {\n return this.request<Refund>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds/${refundId}`,\n undefined,\n { classifyContext: { paymentId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Checkout Pro (Preferences)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment preference for Checkout Pro. Returns `init_point` URL\n * where the buyer completes payment on MP-hosted form. This is the\n * recommended flow when you don't have a card token (most common path for\n * agents — you don't want to handle PCI data).\n *\n * Sandbox: use `sandbox_init_point` instead of `init_point`.\n */\n async createPreference(params: CreatePreferenceParams): Promise<Preference> {\n const body: Record<string, unknown> = {\n items: params.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: it.currency_id ?? \"ARS\",\n ...(it.description ? { description: it.description } : {}),\n ...(it.picture_url ? { picture_url: it.picture_url } : {}),\n })),\n };\n if (params.payer) body.payer = params.payer;\n if (params.backUrls) body.back_urls = params.backUrls;\n if (params.autoReturn) body.auto_return = params.autoReturn;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.paymentMethods) body.payment_methods = params.paymentMethods;\n if (params.statementDescriptor)\n body.statement_descriptor = params.statementDescriptor;\n if (params.expires !== undefined) body.expires = params.expires;\n if (params.expirationDateFrom) body.expiration_date_from = params.expirationDateFrom;\n if (params.expirationDateTo) body.expiration_date_to = params.expirationDateTo;\n\n return this.request<Preference>(\"POST\", \"/checkout/preferences\", body);\n }\n\n async getPreference(id: string): Promise<Preference> {\n return this.request<Preference>(\"GET\", `/checkout/preferences/${id}`);\n }\n\n async updatePreference(\n id: string,\n patch: Partial<CreatePreferenceParams>,\n ): Promise<Preference> {\n return this.request<Preference>(\"PUT\", `/checkout/preferences/${id}`, patch);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ───────────────────────────────────────────────────────────────────────────\n\n async createCustomer(params: CreateCustomerParams): Promise<Customer> {\n const body: Record<string, unknown> = { email: params.email };\n if (params.firstName) body.first_name = params.firstName;\n if (params.lastName) body.last_name = params.lastName;\n if (params.phone) body.phone = { area_code: params.phone.areaCode, number: params.phone.number };\n if (params.identification) body.identification = params.identification;\n if (params.description) body.description = params.description;\n return this.request<Customer>(\"POST\", \"/v1/customers\", body, {\n classifyContext: { payerEmail: params.email },\n });\n }\n\n async getCustomer(id: string): Promise<Customer> {\n return this.request<Customer>(\"GET\", `/v1/customers/${id}`, undefined, {\n classifyContext: { customerId: id },\n });\n }\n\n /**\n * Search customers. Most common: by email (returns 0 or 1 result).\n * Note: MP's `/v1/customers/search` returns a paginated wrapper, not a flat array.\n */\n async searchCustomers(params: { email?: string; limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Customer[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 10,\n offset: params.offset ?? 0,\n };\n if (params.email) query[\"email\"] = params.email;\n return this.request(\"GET\", \"/v1/customers/search\", undefined, { query });\n }\n\n async listCustomerCards(customerId: string): Promise<CustomerCard[]> {\n return this.request<CustomerCard[]>(\n \"GET\",\n `/v1/customers/${customerId}/cards`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async getCustomerCard(customerId: string, cardId: string): Promise<CustomerCard> {\n return this.request<CustomerCard>(\n \"GET\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async deleteCustomerCard(customerId: string, cardId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List all payment methods enabled for the account's site (MLA = Argentina). */\n async listPaymentMethods(): Promise<PaymentMethod[]> {\n return this.request<PaymentMethod[]>(\"GET\", \"/v1/payment_methods\");\n }\n\n /**\n * Get installment options for an amount. THE killer AR feature — returns\n * `payer_costs` with `recommended_message` strings like \"12 cuotas sin\n * interés de $X\" that you should surface verbatim to the user.\n *\n * Pass `bin` (first 6 digits of card) for issuer-specific offers (e.g.,\n * Naranja's interest-free promotions). Without bin, returns generic offers.\n */\n async getInstallments(params: {\n amount: number;\n paymentMethodId?: string;\n bin?: string;\n issuerId?: string;\n }): Promise<InstallmentOffer[]> {\n const query: Record<string, string | number | undefined> = {\n amount: params.amount,\n };\n if (params.paymentMethodId) query[\"payment_method_id\"] = params.paymentMethodId;\n if (params.bin) query[\"bin\"] = params.bin;\n if (params.issuerId) query[\"issuer.id\"] = params.issuerId;\n return this.request<InstallmentOffer[]>(\n \"GET\",\n \"/v1/payment_methods/installments\",\n undefined,\n { query },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Account\n // ───────────────────────────────────────────────────────────────────────────\n\n /** Get info about the account that owns this access token. */\n async getMe(): Promise<AccountInfo> {\n return this.request<AccountInfo>(\"GET\", \"/users/me\");\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Card tokens (server-side, for saved-card retokenization)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a single-use card token from a saved card. This is the server-side\n * retokenization path (PCI-safe because the card data lives in MP's vault,\n * we only pass the saved card_id + customer_id + the user-supplied CVV).\n *\n * Tokens expire in 7 days but typically burn on first use. AR currently\n * REQUIRES CVV on every charge (MP doesn't store it); skipping CVV requires\n * a private MP product enablement, not a public API.\n */\n async createCardToken(params: CreateCardTokenParams): Promise<CardToken> {\n return this.request<CardToken>(\"POST\", \"/v1/card_tokens\", {\n card_id: params.cardId,\n customer_id: params.customerId,\n security_code: params.securityCode,\n });\n }\n\n /**\n * High-level helper: charge a saved card in 3 steps.\n * 1. Mint a card token from {customer_id, card_id, security_code}\n * 2. Lookup card to fill payment_method_id (avoids agent guessing)\n * 3. Create the payment with the token + idempotency key\n *\n * Returns the resulting Payment. Uses deterministic idempotency from\n * (card_id, amount, externalReference) so retries dedupe on MP's side.\n */\n async chargeSavedCard(params: {\n customerId: string;\n cardId: string;\n securityCode: string;\n amount: number;\n description: string;\n installments?: number;\n externalReference?: string;\n statementDescriptor?: string;\n idempotencyKey?: string;\n }): Promise<Payment> {\n // Step 1: Mint single-use token\n const token = await this.createCardToken({\n cardId: params.cardId,\n customerId: params.customerId,\n securityCode: params.securityCode,\n });\n\n // Step 2: Lookup the saved card to fill payment_method_id\n const card = await this.getCustomerCard(params.customerId, params.cardId);\n const paymentMethodId = card.payment_method?.id;\n if (!paymentMethodId) {\n throw new MercadoPagoError(\n `Saved card ${params.cardId} has no payment_method.id. Cannot charge.`,\n 0,\n `/v1/customers/${params.customerId}/cards/${params.cardId}`,\n );\n }\n\n // Step 3: Create payment\n const body: Record<string, unknown> = {\n transaction_amount: params.amount,\n token: token.id,\n payment_method_id: paymentMethodId,\n installments: params.installments ?? 1,\n description: params.description,\n payer: { type: \"customer\", id: params.customerId },\n };\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.statementDescriptor) body.statement_descriptor = params.statementDescriptor;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey !== undefined ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { customerId: params.customerId },\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // QR (in-store dynamic) — Section 2 of v0.3 spec\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a dynamic in-store QR order. Returns `qr_data` (EMVCo TLV string)\n * + `in_store_order_id`. The buyer scans the QR with any AR wallet (Modo,\n * BNA+, Cuenta DNI, Naranja X, etc. — interop is mandated by Transferencias\n * 3.0). On payment, MP fires `point_integration_wh` then `payment` topics.\n *\n * Requires a pre-configured POS (`external_pos_id` from MP dashboard or\n * `POST /pos`). The seller's `user_id` is auto-fetched from `/users/me`.\n *\n * The lib does NOT render the QR image — pass `qr_data` to a QR renderer\n * (e.g., `qrcode` package) to get a data URL. The agent tool layer wraps\n * this and returns both raw + data URL.\n */\n async createQrPayment(userId: string, params: CreateQrPaymentParams): Promise<QrOrder> {\n const body: Record<string, unknown> = {\n total_amount: params.totalAmount,\n title: params.title,\n };\n if (params.description) body.description = params.description;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.expirationDate) body.expiration_date = params.expirationDate;\n body.items = params.items ?? [\n {\n title: params.title,\n quantity: 1,\n unit_price: params.totalAmount,\n unit_measure: \"unit\",\n total_amount: params.totalAmount,\n },\n ];\n\n return this.request<QrOrder>(\n \"PUT\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(params.externalPosId)}/qrs`,\n body,\n );\n }\n\n /**\n * Cancel a pending QR order on a POS. Necessary if the buyer never scans\n * — otherwise the next `createQrPayment` on the same POS returns 409.\n */\n async cancelQrPayment(userId: string, externalPosId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(externalPosId)}/qrs`,\n );\n }\n}\n\nexport { MercadoPagoError };\n","import { createHash } from \"node:crypto\";\nimport { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport type { MercadoPagoClient } from \"./client\";\nimport type { SubscriptionStateAdapter } from \"./state\";\n\n/**\n * Deterministic idempotency key from caller-meaningful fields. Safe to retry:\n * the SAME inputs always produce the same key, so MP dedupes on its side\n * even if the client retries multiple times. Use a hash to keep keys short\n * + opaque (callers can't accidentally extract sensitive data from the key).\n */\nfunction deterministicIdempotencyKey(...parts: Array<string | number | undefined>): string {\n const payload = parts\n .filter((p) => p !== undefined && p !== null)\n .map(String)\n .join(\"|\");\n return createHash(\"sha256\").update(payload).digest(\"hex\").slice(0, 32);\n}\n\nexport interface MercadoPagoToolsOptions {\n /** State adapter for persisting subscription records. */\n state: SubscriptionStateAdapter;\n /**\n * Default back_url used when callers don't supply one. MUST be HTTPS — MP\n * rejects http:// and localhost back URLs even in sandbox.\n */\n backUrl: string;\n /**\n * Optionally override the agent-facing tool descriptions. Pass an object\n * with keys matching tool names; values replace the default description.\n * Useful for localizing the agent's tool reasoning.\n */\n descriptions?: Partial<Record<ToolName, string>>;\n /**\n * Default notification webhook URL used when callers don't supply one.\n * Optional — MP falls back to dashboard config if not set.\n */\n notificationUrl?: string;\n}\n\ntype ToolName =\n // Subscriptions (v0.1)\n | \"create_subscription\"\n | \"get_subscription_status\"\n | \"cancel_subscription\"\n | \"pause_subscription\"\n | \"resume_subscription\"\n // Payments (v0.2)\n | \"create_payment\"\n | \"get_payment\"\n | \"search_payments\"\n | \"cancel_payment\"\n | \"capture_payment\"\n // Refunds (v0.2)\n | \"refund_payment\"\n | \"list_refunds\"\n // Checkout Pro (v0.2)\n | \"create_payment_preference\"\n | \"get_payment_preference\"\n // Customers + Cards (v0.2)\n | \"create_customer\"\n | \"find_customer_by_email\"\n | \"list_customer_cards\"\n | \"delete_customer_card\"\n // Payment Methods + Installments (v0.2)\n | \"list_payment_methods\"\n | \"calculate_installments\"\n // Account (v0.2)\n | \"get_account_info\"\n // Saved-card charging (v0.3)\n | \"charge_saved_card\"\n // QR in-store (v0.3)\n | \"create_qr_payment\"\n | \"cancel_qr_payment\";\n\nconst DEFAULT_DESCRIPTIONS: Record<ToolName, string> = {\n // ── Subscriptions ────────────────────────────────────────────────────────\n create_subscription:\n \"Create a Mercado Pago recurring subscription. Returns an init_point URL where the customer must complete the FIRST payment with their card and CVV (this is a hard MP requirement; agents cannot bypass it). After they pay, MP will auto-charge at the configured frequency without further intervention.\",\n get_subscription_status:\n \"Check the current status of a Mercado Pago subscription. Use this to confirm the customer completed the first payment (status becomes 'authorized') or to inspect the next charge date.\",\n cancel_subscription:\n \"Cancel an active Mercado Pago subscription. After cancellation, MP will not charge the customer again. This action is irreversible — confirm with the user before calling.\",\n pause_subscription:\n \"Pause an authorized Mercado Pago subscription. Charges stop until resumed. Only works on subscriptions in 'authorized' status.\",\n resume_subscription:\n \"Resume a paused Mercado Pago subscription. Charges resume on the next scheduled date. Only works on subscriptions in 'paused' status.\",\n\n // ── Payments ─────────────────────────────────────────────────────────────\n create_payment:\n \"Create a one-time payment. Two flows: (a) with a card token from MP frontend Cardform — for transparent checkout; (b) without token, for non-card methods like 'account_money', 'rapipago', 'pagofacil'. For most agent flows where you only have a payer email and want to send them a payment link, use create_payment_preference instead (Checkout Pro hosted form). Returns the Payment object with status — typically 'approved' for account_money and 'pending' for tickets.\",\n get_payment:\n \"Fetch a single payment by ID. Use to confirm status after webhook arrives, or to inspect details (status_detail explains rejections).\",\n search_payments:\n \"Search payments with filters. Most common: by external_reference (your-system identifier) to find all payments for an order, or by status='approved' to list successful charges in a date range. Returns paginated results.\",\n cancel_payment:\n \"Cancel a pending or in_process payment (only works before approval). Once approved, use refund_payment instead. Common use: cancel an unpaid ticket payment that's still pending.\",\n capture_payment:\n \"Capture an authorized credit-card payment that was created with capture=false. Use for hold-then-capture flows (e.g., authorize on order, capture on shipment). Optional partial amount.\",\n\n // ── Refunds ──────────────────────────────────────────────────────────────\n refund_payment:\n \"Refund an approved payment. Pass amount for partial refund; omit for full refund. Idempotency key is auto-generated based on paymentId+amount to prevent double-refunds on retries.\",\n list_refunds:\n \"List all refunds for a given payment. Returns array of Refund objects. Useful to confirm a refund was processed or to inspect partial-refund history.\",\n\n // ── Checkout Pro ─────────────────────────────────────────────────────────\n create_payment_preference:\n \"Create a Mercado Pago Checkout Pro preference and get back a payment URL (init_point) to send to the customer. THIS is the recommended way for an agent to take a payment when you only have a payer email — the buyer enters card data on MP's hosted form (no PCI scope needed). Supports cuotas configuration, payment method exclusions, back URLs after success/failure/pending. In sandbox, use sandbox_init_point from the response.\",\n get_payment_preference:\n \"Fetch a Checkout Pro preference by ID. Returns the preference config and current init_point URLs. Use to inspect a previously-created link.\",\n\n // ── Customers + Cards ────────────────────────────────────────────────────\n create_customer:\n \"Create a Mercado Pago customer record so the buyer can save cards for future charges. Idempotent on email — if a customer with that email exists, MP returns it instead of creating a duplicate. Use find_customer_by_email first if you're unsure.\",\n find_customer_by_email:\n \"Find an existing customer by email address. Returns the customer object if found, or null. Use before create_customer to avoid duplicate records.\",\n list_customer_cards:\n \"List the saved cards for a customer. Returns array with last 4 digits, expiration, payment method (visa, master, naranja, etc.). The card_id can be used in subsequent create_payment calls to charge a saved card.\",\n delete_customer_card:\n \"Delete a saved card from a customer. Common use: customer requests removal, or expired card cleanup. Irreversible.\",\n\n // ── Payment Methods + Installments ───────────────────────────────────────\n list_payment_methods:\n \"List all payment methods enabled for the seller's MP account (visa, master, naranja, naranja_x, cabal, account_money, rapipago, pagofacil, etc.). Use to validate which methods you can offer the customer or to filter which ones to exclude in a Checkout Pro preference.\",\n calculate_installments:\n \"Calculate cuotas (installments) options for a given amount. THE killer Argentine feature — returns options like '12 cuotas sin interés de $X' (recommended_message field) which you should surface VERBATIM to the user. Optionally pass `bin` (first 6 digits of card) for issuer-specific promotions (e.g., Naranja's interest-free deals). Use before create_payment to let the user pick installments knowingly.\",\n\n // ── Account ──────────────────────────────────────────────────────────────\n get_account_info:\n \"Get info about the Mercado Pago account that owns the access token: site_id (MLA=Argentina), country_id, user_type (registered, partial, etc.). Useful to verify the agent is connected to the right account before taking actions.\",\n\n // ── Saved-card charging (v0.3) ───────────────────────────────────────────\n charge_saved_card:\n \"Charge a previously-saved card for a returning customer. Requires customer_id + card_id (from list_customer_cards) AND a fresh CVV the user provides this session. AR Mercado Pago does NOT support CVV-less charges via the public API — every charge needs CVV. Idempotent on (card_id, amount, external_reference): retries dedupe automatically. Returns the resulting Payment.\",\n\n // ── QR in-store (v0.3) ───────────────────────────────────────────────────\n create_qr_payment:\n \"Generate a dynamic in-store QR for a buyer to scan with any AR wallet (Modo, BNA+, Cuenta DNI, Naranja X, Mercado Pago, etc. — interop is mandated by Transferencias 3.0). Requires a pre-configured POS external_id (one-time setup in MP dashboard). Returns the qr_data string + a base64 PNG data URL ready to display. The QR expires in `expires_in_seconds` (default 600). MP fires `point_integration_wh` then `payment` webhooks when scanned.\",\n cancel_qr_payment:\n \"Cancel a pending QR order on a POS. Necessary if the buyer never scans — otherwise the next create_qr_payment on the same POS returns 409.\",\n};\n\n/**\n * Build a tool set for the Vercel AI SDK that exposes Mercado Pago to an\n * agent. Pass directly to `Experimental_Agent`'s `tools` option, or merge with\n * other tool sets.\n *\n * @example\n * ```ts\n * import { Experimental_Agent as Agent, stepCountIs } from 'ai';\n * import { MercadoPagoClient, mercadoPagoTools, InMemoryStateAdapter } from '@ar-agents/mercadopago';\n *\n * const mp = new MercadoPagoClient({ accessToken: process.env.MP_ACCESS_TOKEN! });\n * const agent = new Agent({\n * model: 'anthropic/claude-sonnet-4-6',\n * tools: mercadoPagoTools(mp, {\n * state: new InMemoryStateAdapter(),\n * backUrl: 'https://mysite.com/done',\n * }),\n * stopWhen: stepCountIs(8),\n * });\n * ```\n */\nexport function mercadoPagoTools(\n client: MercadoPagoClient,\n options: MercadoPagoToolsOptions,\n): ToolSet {\n const desc = (name: ToolName): string =>\n options.descriptions?.[name] ?? DEFAULT_DESCRIPTIONS[name];\n\n return {\n // ─────────────────────────────────────────────────────────────────────────\n // Subscriptions (v0.1 — kept identical for backward compatibility)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_subscription: tool({\n description: desc(\"create_subscription\"),\n inputSchema: z.object({\n customer_email: z.string().email().describe(\"Email of the customer who will be charged\"),\n amount_ars: z.number().positive().describe(\"Amount in Argentine Pesos per recurring charge\"),\n frequency_months: z.number().int().positive().max(12).describe(\"Frequency in months (1=monthly, 3=quarterly, 12=yearly)\"),\n reason: z.string().min(3).max(120).describe(\"Short description shown to the customer at checkout\"),\n external_reference: z.string().optional().describe(\"Optional id from your system to track this subscription\"),\n }),\n execute: async ({ customer_email, amount_ars, frequency_months, reason, external_reference }) => {\n const created = await client.createPreapproval({\n reason,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n backUrl: options.backUrl,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n });\n await options.state.set(created.id, {\n status: created.status,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n initPoint: created.init_point,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n createdAt: new Date().toISOString(),\n });\n return {\n subscription_id: created.id,\n status: created.status,\n init_point_url: created.init_point,\n next_step:\n \"Send init_point_url to the customer. They must complete the first payment with card+CVV. Use get_subscription_status to confirm activation after they pay.\",\n };\n },\n }),\n\n get_subscription_status: tool({\n description: desc(\"get_subscription_status\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID\"),\n }),\n execute: async ({ subscription_id }) => {\n const fresh = await client.getPreapproval(subscription_id);\n const cached = await options.state.get(subscription_id);\n return {\n subscription_id: fresh.id,\n status: fresh.status,\n payer_email: fresh.payer_email,\n amount: fresh.auto_recurring.transaction_amount,\n currency: fresh.auto_recurring.currency_id,\n next_payment_date: fresh.next_payment_date ?? null,\n last_webhook_status: cached?.lastWebhookStatus ?? null,\n last_webhook_at: cached?.lastWebhookAt ?? null,\n };\n },\n }),\n\n cancel_subscription: tool({\n description: desc(\"cancel_subscription\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID to cancel\"),\n }),\n execute: async ({ subscription_id }) => {\n const cancelled = await client.cancelPreapproval(subscription_id);\n await options.state.set(subscription_id, {\n status: cancelled.status,\n cancelledAt: new Date().toISOString(),\n });\n return {\n subscription_id: cancelled.id,\n status: cancelled.status,\n message: \"Subscription cancelled. No further charges will occur.\",\n };\n },\n }),\n\n pause_subscription: tool({\n description: desc(\"pause_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const paused = await client.pausePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: paused.status });\n return {\n subscription_id: paused.id,\n status: paused.status,\n message: \"Subscription paused. Use resume_subscription to reactivate.\",\n };\n },\n }),\n\n resume_subscription: tool({\n description: desc(\"resume_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const resumed = await client.resumePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: resumed.status });\n return {\n subscription_id: resumed.id,\n status: resumed.status,\n message: \"Subscription resumed. Charges will continue on next scheduled date.\",\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment: tool({\n description: desc(\"create_payment\"),\n inputSchema: z.object({\n amount_ars: z.number().positive().describe(\"Amount in ARS\"),\n payment_method_id: z.string().describe(\"MP payment method id (e.g. 'account_money', 'rapipago', 'visa', 'master', 'naranja')\"),\n payer_email: z.string().email().describe(\"Email of the payer. Cannot equal seller email.\"),\n token: z.string().optional().describe(\"Card token from MP frontend Cardform. Required for credit/debit; omit for cash/account_money.\"),\n installments: z.number().int().min(1).max(24).optional().describe(\"Number of installments (cuotas). Default 1. Use calculate_installments first to see options.\"),\n description: z.string().max(255).optional().describe(\"Short description\"),\n external_reference: z.string().optional().describe(\"Your-system identifier\"),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional().describe(\"Payer identification — required for some payment types in AR\"),\n statement_descriptor: z.string().max(13).optional().describe(\"Shows on buyer's card statement (max 13 chars)\"),\n }),\n execute: async (input) => {\n const payment = await client.createPayment({\n transactionAmount: input.amount_ars,\n paymentMethodId: input.payment_method_id,\n payerEmail: input.payer_email,\n ...(input.token !== undefined ? { token: input.token } : {}),\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n // Deterministic idempotency key — safe to retry, same inputs always\n // produce the same key (MP dedupes on its side).\n idempotencyKey: deterministicIdempotencyKey(\n \"create_payment\",\n input.external_reference ?? input.payer_email,\n input.amount_ars,\n input.payment_method_id,\n input.token,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n currency: payment.currency_id,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n payer_email: payment.payer?.email ?? null,\n external_reference: payment.external_reference,\n date_created: payment.date_created,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n get_payment: tool({\n description: desc(\"get_payment\"),\n inputSchema: z.object({\n payment_id: z.string().describe(\"The MP payment ID\"),\n }),\n execute: async ({ payment_id }) => {\n const p = await client.getPayment(payment_id);\n return {\n payment_id: p.id,\n status: p.status,\n status_detail: p.status_detail,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payment_method: p.payment_method_id,\n installments: p.installments,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n date_approved: p.date_approved,\n net_received: p.transaction_details?.net_received_amount ?? null,\n };\n },\n }),\n\n search_payments: tool({\n description: desc(\"search_payments\"),\n inputSchema: z.object({\n external_reference: z.string().optional(),\n status: z.string().optional().describe(\"'approved' | 'pending' | 'rejected' | 'cancelled' | 'refunded' etc.\"),\n payer_email: z.string().optional(),\n begin_date: z.string().optional().describe(\"ISO 8601, e.g. 2026-01-01T00:00:00Z\"),\n end_date: z.string().optional().describe(\"ISO 8601\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 30, max 100\"),\n offset: z.number().int().min(0).optional().describe(\"Pagination offset (default 0)\"),\n }),\n execute: async (input) => {\n const result = await client.searchPayments({\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.payer_email !== undefined ? { payerEmail: input.payer_email } : {}),\n ...(input.begin_date !== undefined ? { beginDate: input.begin_date } : {}),\n ...(input.end_date !== undefined ? { endDate: input.end_date } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n return {\n total: result.paging.total,\n returned: result.results.length,\n offset: result.paging.offset,\n payments: result.results.map((p) => ({\n payment_id: p.id,\n status: p.status,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n })),\n };\n },\n }),\n\n cancel_payment: tool({\n description: desc(\"cancel_payment\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const cancelled = await client.cancelPayment(payment_id);\n return {\n payment_id: cancelled.id,\n status: cancelled.status,\n message: \"Payment cancelled. If it was already approved, use refund_payment instead.\",\n };\n },\n }),\n\n capture_payment: tool({\n description: desc(\"capture_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Optional partial-capture amount. Omit to capture full authorized amount.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const captured = await client.capturePayment(payment_id, amount_ars);\n return {\n payment_id: captured.id,\n status: captured.status,\n amount: captured.transaction_amount,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Refunds\n // ─────────────────────────────────────────────────────────────────────────\n\n refund_payment: tool({\n description: desc(\"refund_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Partial-refund amount in ARS. Omit for full refund.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const refund = await client.createRefund({\n paymentId: payment_id,\n ...(amount_ars !== undefined ? { amount: amount_ars } : {}),\n idempotencyKey: deterministicIdempotencyKey(\"refund\", payment_id, amount_ars ?? \"full\"),\n });\n return {\n refund_id: refund.id,\n payment_id: refund.payment_id,\n amount: refund.amount,\n status: refund.status,\n message:\n amount_ars === undefined\n ? \"Full refund issued. Funds return to the buyer in 3-10 business days.\"\n : `Partial refund of ${amount_ars} ARS issued.`,\n };\n },\n }),\n\n list_refunds: tool({\n description: desc(\"list_refunds\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const refunds = await client.listRefunds(payment_id);\n return {\n payment_id,\n count: refunds.length,\n refunds: refunds.map((r) => ({\n refund_id: r.id,\n amount: r.amount,\n status: r.status,\n date_created: r.date_created,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Checkout Pro\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment_preference: tool({\n description: desc(\"create_payment_preference\"),\n inputSchema: z.object({\n items: z.array(z.object({\n title: z.string().min(1).max(256),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n })).min(1).describe(\"Items being charged. At least one required.\"),\n payer_email: z.string().email().optional().describe(\"Pre-fill the payer email on Checkout Pro form\"),\n external_reference: z.string().optional(),\n max_installments: z.number().int().min(1).max(24).optional().describe(\"Limit max cuotas offered. Defaults to MP account config.\"),\n statement_descriptor: z.string().max(13).optional(),\n excluded_payment_types: z.array(z.enum([\"credit_card\", \"debit_card\", \"ticket\", \"atm\", \"bank_transfer\"])).optional().describe(\"Block payment types — e.g., ['ticket'] to disable Rapipago/Pago Fácil\"),\n }),\n execute: async (input) => {\n const pref = await client.createPreference({\n items: input.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: \"ARS\",\n ...(it.description !== undefined ? { description: it.description } : {}),\n ...(it.picture_url !== undefined ? { picture_url: it.picture_url } : {}),\n })),\n ...(input.payer_email !== undefined ? { payer: { email: input.payer_email } } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n backUrls: { success: options.backUrl, failure: options.backUrl, pending: options.backUrl },\n autoReturn: \"approved\",\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n ...((input.max_installments !== undefined || input.excluded_payment_types !== undefined)\n ? {\n paymentMethods: {\n ...(input.max_installments !== undefined ? { installments: input.max_installments } : {}),\n ...(input.excluded_payment_types !== undefined\n ? { excluded_payment_types: input.excluded_payment_types.map((id) => ({ id })) }\n : {}),\n },\n }\n : {}),\n });\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n date_created: pref.date_created,\n next_step:\n \"Send init_point_url (or sandbox_init_point_url in sandbox) to the customer. After they pay, MP fires a webhook with the payment_id; use get_payment to confirm status.\",\n };\n },\n }),\n\n get_payment_preference: tool({\n description: desc(\"get_payment_preference\"),\n inputSchema: z.object({ preference_id: z.string() }),\n execute: async ({ preference_id }) => {\n const pref = await client.getPreference(preference_id);\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n items: pref.items,\n date_created: pref.date_created,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ─────────────────────────────────────────────────────────────────────────\n\n create_customer: tool({\n description: desc(\"create_customer\"),\n inputSchema: z.object({\n email: z.string().email(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional(),\n description: z.string().optional(),\n }),\n execute: async (input) => {\n const customer = await client.createCustomer({\n email: input.email,\n ...(input.first_name !== undefined ? { firstName: input.first_name } : {}),\n ...(input.last_name !== undefined ? { lastName: input.last_name } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n });\n return {\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n date_created: customer.date_created,\n };\n },\n }),\n\n find_customer_by_email: tool({\n description: desc(\"find_customer_by_email\"),\n inputSchema: z.object({ email: z.string().email() }),\n execute: async ({ email }) => {\n const result = await client.searchCustomers({ email, limit: 1 });\n const customer = result.results[0] ?? null;\n return customer\n ? {\n found: true,\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n }\n : { found: false, customer_id: null };\n },\n }),\n\n list_customer_cards: tool({\n description: desc(\"list_customer_cards\"),\n inputSchema: z.object({ customer_id: z.string() }),\n execute: async ({ customer_id }) => {\n const cards = await client.listCustomerCards(customer_id);\n return {\n customer_id,\n count: cards.length,\n cards: cards.map((c) => ({\n card_id: c.id,\n last_four_digits: c.last_four_digits,\n expiration_month: c.expiration_month,\n expiration_year: c.expiration_year,\n payment_method: c.payment_method?.id ?? null,\n payment_method_name: c.payment_method?.name ?? null,\n })),\n };\n },\n }),\n\n delete_customer_card: tool({\n description: desc(\"delete_customer_card\"),\n inputSchema: z.object({\n customer_id: z.string(),\n card_id: z.string(),\n }),\n execute: async ({ customer_id, card_id }) => {\n await client.deleteCustomerCard(customer_id, card_id);\n return { customer_id, card_id, deleted: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ─────────────────────────────────────────────────────────────────────────\n\n list_payment_methods: tool({\n description: desc(\"list_payment_methods\"),\n inputSchema: z.object({}),\n execute: async () => {\n const methods = await client.listPaymentMethods();\n return {\n count: methods.length,\n methods: methods.map((m) => ({\n id: m.id,\n name: m.name,\n payment_type: m.payment_type_id,\n status: m.status,\n min_amount: m.min_allowed_amount,\n max_amount: m.max_allowed_amount,\n })),\n };\n },\n }),\n\n calculate_installments: tool({\n description: desc(\"calculate_installments\"),\n inputSchema: z.object({\n amount_ars: z.number().positive(),\n payment_method_id: z.string().optional().describe(\"E.g. 'visa', 'master', 'naranja'. Omit for all available methods.\"),\n bin: z.string().min(6).max(8).optional().describe(\"First 6-8 digits of card for issuer-specific offers (e.g., Naranja interest-free promotions)\"),\n }),\n execute: async (input) => {\n const offers = await client.getInstallments({\n amount: input.amount_ars,\n ...(input.payment_method_id !== undefined ? { paymentMethodId: input.payment_method_id } : {}),\n ...(input.bin !== undefined ? { bin: input.bin } : {}),\n });\n return {\n amount: input.amount_ars,\n offers: offers.map((o) => ({\n payment_method_id: o.payment_method_id,\n payment_type_id: o.payment_type_id,\n issuer_name: o.issuer?.name ?? null,\n options: o.payer_costs.map((pc) => ({\n installments: pc.installments,\n installment_amount: pc.installment_amount,\n total_amount: pc.total_amount,\n installment_rate: pc.installment_rate,\n recommended_message: pc.recommended_message,\n })),\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Account\n // ─────────────────────────────────────────────────────────────────────────\n\n get_account_info: tool({\n description: desc(\"get_account_info\"),\n inputSchema: z.object({}),\n execute: async () => {\n const me = await client.getMe();\n return {\n account_id: me.id,\n email: me.email,\n nickname: me.nickname,\n country_id: me.country_id,\n site_id: me.site_id,\n user_type: me.user_type,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Saved-card charging (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n charge_saved_card: tool({\n description: desc(\"charge_saved_card\"),\n inputSchema: z.object({\n customer_id: z.string().describe(\"MP customer id (from create_customer / find_customer_by_email)\"),\n card_id: z.string().describe(\"Saved card id (from list_customer_cards)\"),\n security_code: z.string().regex(/^\\d{3,4}$/).describe(\"CVV — 3 digits (Visa/Master) or 4 (Amex). User must provide this each charge in AR.\"),\n amount_ars: z.number().positive(),\n description: z.string().min(1).max(255),\n installments: z.number().int().min(1).max(24).optional().describe(\"Default 1. Use calculate_installments first to pick a valid count.\"),\n external_reference: z.string().optional(),\n statement_descriptor: z.string().max(13).optional(),\n }),\n execute: async (input) => {\n const payment = await client.chargeSavedCard({\n customerId: input.customer_id,\n cardId: input.card_id,\n securityCode: input.security_code,\n amount: input.amount_ars,\n description: input.description,\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n idempotencyKey: deterministicIdempotencyKey(\n \"charge_saved_card\",\n input.card_id,\n input.amount_ars,\n input.external_reference,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n customer_id: input.customer_id,\n card_id: input.card_id,\n external_reference: payment.external_reference,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // QR in-store (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_qr_payment: tool({\n description: desc(\"create_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string().describe(\"Pre-configured POS external_id from MP dashboard. Required.\"),\n amount_ars: z.number().positive(),\n title: z.string().min(1).max(80).describe(\"Display title shown when scanning\"),\n description: z.string().max(255).optional(),\n external_reference: z.string().optional(),\n notification_url: z.string().url().optional().describe(\"Webhook URL — falls back to dashboard config if omitted\"),\n expires_in_seconds: z.number().int().min(60).max(3600).optional().describe(\"Default 600 (10 min)\"),\n }),\n execute: async (input) => {\n // Lazy-load qrcode to keep cold-start lean for users who don't use QR\n const QRCode = (await import(\"qrcode\")).default;\n const me = await client.getMe();\n const userId = String(me.id);\n const expiresAt = new Date(\n Date.now() + (input.expires_in_seconds ?? 600) * 1000,\n ).toISOString();\n\n const qr = await client.createQrPayment(userId, {\n externalPosId: input.external_pos_id,\n totalAmount: input.amount_ars,\n title: input.title,\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.notification_url !== undefined ? { notificationUrl: input.notification_url } : {}),\n expirationDate: expiresAt,\n });\n\n const qrDataUrl = await QRCode.toDataURL(qr.qr_data, {\n errorCorrectionLevel: \"M\",\n margin: 1,\n width: 512,\n });\n\n return {\n in_store_order_id: qr.in_store_order_id,\n qr_data: qr.qr_data,\n qr_data_url: qrDataUrl,\n expires_at: expiresAt,\n external_pos_id: input.external_pos_id,\n amount: input.amount_ars,\n next_step:\n \"Display the qr_data_url image to the buyer. Wait for the payment webhook (point_integration_wh fires first, then payment topic). If buyer doesn't scan in time, call cancel_qr_payment to free the POS.\",\n };\n },\n }),\n\n cancel_qr_payment: tool({\n description: desc(\"cancel_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string(),\n }),\n execute: async ({ external_pos_id }) => {\n const me = await client.getMe();\n await client.cancelQrPayment(String(me.id), external_pos_id);\n return { external_pos_id, cancelled: true };\n },\n }),\n } satisfies ToolSet;\n}\n","/**\n * In-memory record of a subscription. The lib persists the MP-side fields\n * needed to reason about a subscription without hitting the API every time\n * (status, last webhook info, customer email, etc.) plus a free-form metadata\n * bag for callers to attach business context (tenant id, plan name, etc.).\n */\nexport interface SubscriptionStateRecord {\n status?: string;\n payerEmail?: string;\n amount?: number;\n currency?: string;\n frequency?: number;\n frequencyType?: string;\n initPoint?: string;\n externalReference?: string;\n createdAt?: string;\n cancelledAt?: string;\n lastWebhookStatus?: string;\n lastWebhookAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Persistence surface for subscription state. Implementations may back this\n * with Upstash Redis, Vercel KV, Postgres, in-memory, or anything that\n * supports the three operations. The default `InMemoryStateAdapter` is\n * provided for tests and trivial single-process deployments; production\n * setups should plug in a durable store.\n */\nexport interface SubscriptionStateAdapter {\n set(id: string, state: Partial<SubscriptionStateRecord>): Promise<void>;\n get(id: string): Promise<SubscriptionStateRecord | null>;\n list?(): Promise<string[]>;\n}\n\n/**\n * Volatile, single-process state adapter. Useful for tests and demos. Do not\n * use in production: state is lost on restart and is not safe across tenants.\n */\nexport class InMemoryStateAdapter implements SubscriptionStateAdapter {\n private readonly store = new Map<string, SubscriptionStateRecord>();\n\n async set(\n id: string,\n state: Partial<SubscriptionStateRecord>,\n ): Promise<void> {\n const existing = this.store.get(id) ?? {};\n this.store.set(id, { ...existing, ...state });\n }\n\n async get(id: string): Promise<SubscriptionStateRecord | null> {\n return this.store.get(id) ?? null;\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.store.keys());\n }\n\n /** Test helper: drop everything. Not part of the adapter interface. */\n reset(): void {\n this.store.clear();\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Site IDs supported by Mercado Pago. The lib targets MLA (Argentina) primarily;\n * other LATAM sites may work for the read paths but the full Subscriptions flow\n * is only verified against MLA.\n */\nexport const SiteIdSchema = z.enum([\"MLA\", \"MLB\", \"MLM\", \"MCO\", \"MLC\", \"MLU\"]);\nexport type SiteId = z.infer<typeof SiteIdSchema>;\n\n/**\n * Currency identifiers MP exposes. ARS is the supported case for v0.1.\n */\nexport const CurrencyIdSchema = z.enum([\"ARS\", \"USD\", \"BRL\", \"MXN\"]);\nexport type CurrencyId = z.infer<typeof CurrencyIdSchema>;\n\n/**\n * Recurrence frequency unit for a subscription's auto_recurring config.\n */\nexport const FrequencyTypeSchema = z.enum([\"months\", \"days\"]);\nexport type FrequencyType = z.infer<typeof FrequencyTypeSchema>;\n\n/**\n * Lifecycle states a Mercado Pago preapproval can be in. The string is the\n * canonical MP value; we widen to `string` for forward compatibility because\n * MP has historically introduced new states without notice.\n */\nexport const PreapprovalStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"authorized\"),\n z.literal(\"paused\"),\n z.literal(\"cancelled\"),\n z.string(),\n]);\nexport type PreapprovalStatus = z.infer<typeof PreapprovalStatusSchema>;\n\nexport const AutoRecurringSchema = z.object({\n frequency: z.number().int().positive(),\n frequency_type: FrequencyTypeSchema,\n transaction_amount: z.number().positive(),\n currency_id: CurrencyIdSchema,\n start_date: z.string().optional(),\n end_date: z.string().optional(),\n});\nexport type AutoRecurring = z.infer<typeof AutoRecurringSchema>;\n\nexport const PreapprovalSchema = z.object({\n id: z.string(),\n status: PreapprovalStatusSchema,\n payer_email: z.string(),\n init_point: z.string().url(),\n external_reference: z.string().optional(),\n date_created: z.string(),\n last_modified: z.string(),\n next_payment_date: z.string().optional(),\n payer_id: z.union([z.string(), z.number()]).optional(),\n auto_recurring: AutoRecurringSchema,\n});\nexport type Preapproval = z.infer<typeof PreapprovalSchema>;\n\n/**\n * Input for creating a preapproval (subscription). Internal field names match\n * MP API semantics; the public client method maps from camelCase Naza-friendly\n * params to the snake_case payload MP expects.\n */\nexport interface CreatePreapprovalParams {\n /** Short customer-facing description shown at checkout. */\n reason: string;\n /** Email of the buyer. Cannot equal the seller account's email (MP rejects). */\n payerEmail: string;\n /** Recurring amount per cycle. */\n amount: number;\n /** ARS for Argentina. Other currencies depend on the seller account's site. */\n currency: CurrencyId;\n /** Recurrence frequency (e.g., 1 + months = monthly). */\n frequency: number;\n frequencyType: FrequencyType;\n /** HTTPS URL where MP redirects the buyer after first payment. localhost rejected. */\n backUrl: string;\n /** Optional client-side identifier for the subscription. */\n externalReference?: string;\n}\n\n/**\n * The shape of an MP webhook notification body for `topic=preapproval`. MP's\n * webhook payload varies by event type; this is the union of fields seen in\n * production.\n */\nexport const WebhookBodySchema = z\n .object({\n type: z.string().optional(),\n topic: z.string().optional(),\n action: z.string().optional(),\n data: z.object({ id: z.union([z.string(), z.number()]) }).optional(),\n resource: z.string().optional(),\n user_id: z.union([z.string(), z.number()]).optional(),\n api_version: z.string().optional(),\n date_created: z.string().optional(),\n id: z.union([z.string(), z.number()]).optional(),\n live_mode: z.boolean().optional(),\n })\n .passthrough();\nexport type WebhookBody = z.infer<typeof WebhookBodySchema>;\n\n/**\n * Normalized webhook event after parsing. The library extracts topic + dataId\n * from either query params or body, since MP sends them in either location\n * depending on integration version.\n */\nexport interface ParsedWebhookEvent {\n /** Topic of the event, e.g., \"preapproval\", \"payment\", \"subscription_authorized_payment\". */\n topic: string;\n /** ID of the affected resource. */\n dataId: string;\n /** Action descriptor when present (e.g., \"updated\", \"created\"). */\n action: string | null;\n /** Raw body MP sent, for caller inspection / debugging. */\n raw: WebhookBody;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payments (v0.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Top-level lifecycle status of a payment. MP-canonical values; widened to\n * string for forward compatibility.\n */\nexport const PaymentStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"approved\"),\n z.literal(\"authorized\"),\n z.literal(\"in_process\"),\n z.literal(\"in_mediation\"),\n z.literal(\"rejected\"),\n z.literal(\"cancelled\"),\n z.literal(\"refunded\"),\n z.literal(\"charged_back\"),\n z.string(),\n]);\nexport type PaymentStatus = z.infer<typeof PaymentStatusSchema>;\n\n/** Status detail — finer granularity inside a status (e.g., why rejected). */\nexport type PaymentStatusDetail = string;\n\n/**\n * The full Payment object MP returns. Many fields are optional because they\n * vary by payment method, status, and integration mode (Checkout Pro vs API).\n */\nexport const PaymentSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: PaymentStatusSchema,\n status_detail: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n date_approved: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n transaction_amount: z.number(),\n currency_id: z.string(),\n installments: z.number().int().nullable().optional(),\n payment_method_id: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n external_reference: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n payer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n email: z.string().nullable().optional(),\n identification: z\n .object({\n type: z.string().nullable().optional(),\n number: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n })\n .passthrough()\n .optional(),\n transaction_details: z\n .object({\n net_received_amount: z.number().nullable().optional(),\n total_paid_amount: z.number().nullable().optional(),\n installment_amount: z.number().nullable().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Payment = z.infer<typeof PaymentSchema>;\n\n/** Params for creating a payment (Checkout API / transparent flow). */\nexport interface CreatePaymentParams {\n /** Amount in account currency. ARS for Argentina. */\n transactionAmount: number;\n /** Number of installments. Use 1 for no cuotas; AR cards typically allow up to 12. */\n installments?: number;\n /** MP payment_method_id — `visa`, `master`, `naranja`, `account_money`, etc. */\n paymentMethodId: string;\n /** Payer email — REQUIRED. Cannot equal seller email. */\n payerEmail: string;\n /** Card token from MP frontend SDK (Cardform). Required for credit/debit; omit for `account_money` etc. */\n token?: string;\n /** Description shown in payer's MP statement. */\n description?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** Optional payer identification (DNI/CUIT) — required for some payment types. */\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n /** Webhook override URL. Falls back to dashboard config if omitted. */\n notificationUrl?: string;\n /** AFIP/ARCA discount/fee/tax additions. Used to discriminate IVA, marketplace fees, etc. */\n additionalInfo?: {\n items?: Array<{\n id?: string;\n title: string;\n quantity: number;\n unit_price: number;\n description?: string;\n }>;\n };\n /** Statement descriptor — what shows on the buyer's card statement. Max 13 chars. */\n statementDescriptor?: string;\n /** When true, capture is deferred (only for credit cards) — useful for hold flows. */\n capture?: boolean;\n /** Idempotency key — pass the same value on retries to dedupe. Required for non-GET. */\n idempotencyKey?: string;\n}\n\nexport interface SearchPaymentsParams {\n /** Filter by external_reference (your-system id). */\n externalReference?: string;\n /** Filter by payment status. */\n status?: PaymentStatus;\n /** Filter by payer email. */\n payerEmail?: string;\n /** Date range for date_created (ISO 8601). */\n beginDate?: string;\n endDate?: string;\n /** Result page (default 0). */\n offset?: number;\n /** Page size (default 30, max 100). */\n limit?: number;\n /** Sort: e.g. \"date_created\" desc. */\n sort?: string;\n criteria?: \"asc\" | \"desc\";\n}\n\nexport const PaymentsSearchResultSchema = z.object({\n paging: z.object({\n total: z.number(),\n limit: z.number(),\n offset: z.number(),\n }),\n results: z.array(PaymentSchema),\n});\nexport type PaymentsSearchResult = z.infer<typeof PaymentsSearchResultSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Refunds\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const RefundSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n payment_id: z.union([z.string(), z.number()]).transform(String),\n amount: z.number(),\n source: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n}).passthrough();\nexport type Refund = z.infer<typeof RefundSchema>;\n\nexport interface CreateRefundParams {\n paymentId: string;\n /** Partial refund amount. Omit for full refund. */\n amount?: number;\n /** Idempotency key — required for retry-safety. */\n idempotencyKey?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Checkout Pro (Preferences)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PreferenceItemSchema = z.object({\n id: z.string().optional(),\n title: z.string(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n category_id: z.string().optional(),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n currency_id: CurrencyIdSchema.optional(),\n});\nexport type PreferenceItem = z.infer<typeof PreferenceItemSchema>;\n\nexport const PreferenceSchema = z.object({\n id: z.string(),\n init_point: z.string().url().optional(),\n sandbox_init_point: z.string().url().optional(),\n client_id: z.union([z.string(), z.number()]).optional(),\n collector_id: z.union([z.string(), z.number()]).optional(),\n items: z.array(PreferenceItemSchema).optional(),\n external_reference: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n expires: z.boolean().optional(),\n expiration_date_from: z.string().nullable().optional(),\n expiration_date_to: z.string().nullable().optional(),\n}).passthrough();\nexport type Preference = z.infer<typeof PreferenceSchema>;\n\nexport interface CreatePreferenceParams {\n items: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n currency_id?: CurrencyId;\n description?: string;\n picture_url?: string;\n }>;\n payer?: {\n name?: string;\n surname?: string;\n email?: string;\n phone?: { area_code?: string; number?: string };\n identification?: { type: string; number: string };\n address?: { street_name?: string; street_number?: number; zip_code?: string };\n };\n /** Where to send the buyer after success/failure/pending. */\n backUrls?: { success?: string; failure?: string; pending?: string };\n /** \"approved\" → auto-redirect on success; \"all\" → always; \"\" → never. */\n autoReturn?: \"approved\" | \"all\";\n /** Webhook URL. */\n notificationUrl?: string;\n /** Your-system id for correlation. */\n externalReference?: string;\n /** Max installments offered. Defaults to MP account config. */\n paymentMethods?: {\n excluded_payment_types?: Array<{ id: string }>;\n excluded_payment_methods?: Array<{ id: string }>;\n installments?: number;\n default_installments?: number;\n };\n /** Statement descriptor — shows on buyer's card statement. */\n statementDescriptor?: string;\n /** Expiration window for the link itself. */\n expires?: boolean;\n expirationDateFrom?: string;\n expirationDateTo?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Customers + Saved Cards\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CustomerSchema = z.object({\n id: z.string(),\n email: z.string(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z\n .object({ area_code: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n identification: z\n .object({ type: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n}).passthrough();\nexport type Customer = z.infer<typeof CustomerSchema>;\n\nexport const CustomerCardSchema = z.object({\n id: z.string(),\n customer_id: z.string(),\n expiration_month: z.number().int().nullable().optional(),\n expiration_year: z.number().int().nullable().optional(),\n first_six_digits: z.string().nullable().optional(),\n last_four_digits: z.string().nullable().optional(),\n payment_method: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n}).passthrough();\nexport type CustomerCard = z.infer<typeof CustomerCardSchema>;\n\nexport interface CreateCustomerParams {\n email: string;\n firstName?: string;\n lastName?: string;\n phone?: { areaCode?: string; number?: string };\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n description?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payment Methods + Installments\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PaymentMethodSchema = z.object({\n id: z.string(),\n name: z.string(),\n payment_type_id: z.string(),\n status: z.string(),\n thumbnail: z.string().nullable().optional(),\n secure_thumbnail: z.string().nullable().optional(),\n min_allowed_amount: z.number().nullable().optional(),\n max_allowed_amount: z.number().nullable().optional(),\n}).passthrough();\nexport type PaymentMethod = z.infer<typeof PaymentMethodSchema>;\n\nexport const InstallmentOfferSchema = z.object({\n payment_method_id: z.string(),\n payment_type_id: z.string(),\n issuer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n name: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n payer_costs: z.array(\n z.object({\n installments: z.number().int(),\n installment_rate: z.number(),\n discount_rate: z.number().nullable().optional(),\n installment_amount: z.number(),\n total_amount: z.number(),\n recommended_message: z.string().nullable().optional(),\n }).passthrough(),\n ),\n}).passthrough();\nexport type InstallmentOffer = z.infer<typeof InstallmentOfferSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Account\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─────────────────────────────────────────────────────────────────────────────\n// QR (in-store dynamic)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const QrOrderSchema = z.object({\n in_store_order_id: z.string(),\n qr_data: z.string(),\n}).passthrough();\nexport type QrOrder = z.infer<typeof QrOrderSchema>;\n\nexport interface CreateQrPaymentParams {\n /** Pre-configured POS external_id from MP dashboard. Required. */\n externalPosId: string;\n /** Total amount in ARS. */\n totalAmount: number;\n /** Display title shown to the buyer when scanning. */\n title: string;\n description?: string;\n /** Webhook URL — MP fires `point_integration_wh` then `payment` topic. */\n notificationUrl?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** ISO 8601 expiration (default 10 min from now). */\n expirationDate?: string;\n /** Itemized line items (optional but improves analytics). */\n items?: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n unit_measure?: string;\n total_amount?: number;\n }>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Card tokens (for charge_saved_card)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CardTokenSchema = z.object({\n id: z.string(),\n status: z.string().optional(),\n date_due: z.string().optional(),\n card_id: z.string().optional(),\n cardholder: z.unknown().optional(),\n}).passthrough();\nexport type CardToken = z.infer<typeof CardTokenSchema>;\n\nexport interface CreateCardTokenParams {\n /** Saved card id (from list_customer_cards). */\n cardId: string;\n /** Customer that owns the card. */\n customerId: string;\n /** CVV — required for AR; MP doesn't store CVV. */\n securityCode: string;\n}\n\nexport const AccountInfoSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n email: z.string().nullable().optional(),\n nickname: z.string().nullable().optional(),\n country_id: z.string().nullable().optional(),\n site_id: z.string().nullable().optional(),\n user_type: z.string().nullable().optional(),\n status: z\n .object({ user_type: z.string().nullable().optional() })\n .passthrough()\n .nullable()\n .optional(),\n}).passthrough();\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>;\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookBodySchema, type ParsedWebhookEvent } from \"./types\";\n\n/**\n * Parse a Mercado Pago webhook from the raw request body and URL search params.\n * MP sends the topic and resource id in EITHER the URL query string OR the\n * body, depending on integration version — this normalizes both shapes into a\n * single structure.\n *\n * @example\n * ```ts\n * export async function POST(req: Request) {\n * const body = await req.json().catch(() => ({}));\n * const event = parseWebhookEvent(body, new URL(req.url).searchParams);\n * if (event && event.topic === 'preapproval') {\n * // refresh status from MP, update your store\n * }\n * return Response.json({ received: true });\n * }\n * ```\n */\nexport function parseWebhookEvent(\n body: unknown,\n searchParams?: URLSearchParams,\n): ParsedWebhookEvent | null {\n const parseResult = WebhookBodySchema.safeParse(body ?? {});\n const parsedBody = parseResult.success ? parseResult.data : {};\n\n const topic =\n searchParams?.get(\"topic\") ??\n parsedBody.topic ??\n parsedBody.type ??\n null;\n\n const dataId =\n searchParams?.get(\"id\") ??\n (parsedBody.data?.id !== undefined ? String(parsedBody.data.id) : null) ??\n parsedBody.resource ??\n null;\n\n if (!topic || !dataId) {\n return null;\n }\n\n return {\n topic,\n dataId: String(dataId),\n action: parsedBody.action ?? null,\n raw: parsedBody,\n };\n}\n\n/**\n * Verify the HMAC-SHA256 signature MP sends in the `x-signature` header for\n * webhook authenticity. Returns true if the signature matches the expected\n * value derived from the integration's secret key.\n *\n * @param requestId The value of the `x-request-id` request header.\n * @param dataId The id of the resource the webhook is about (from query or body).\n * @param signatureHeader The full `x-signature` header value MP sent.\n * @param secret Your integration's webhook secret (configured in MP dev panel).\n *\n * @remarks\n * MP's `x-signature` header has the form: `ts=NNNNNNNN,v1=HEXSIGNATURE`. We\n * extract the timestamp and the v1 signature, then compute\n * `HMAC-SHA256(secret, \"id:${dataId};request-id:${requestId};ts:${ts};\")`\n * and compare with constant-time equality.\n */\nexport function verifyWebhookSignature(params: {\n requestId: string | null;\n dataId: string;\n signatureHeader: string | null;\n secret: string;\n}): boolean {\n if (!params.signatureHeader || !params.requestId) return false;\n\n // Parse \"ts=...,v1=...\" into a map.\n const parts = Object.fromEntries(\n params.signatureHeader\n .split(\",\")\n .map((segment) => segment.trim().split(\"=\") as [string, string]),\n );\n const ts = parts.ts;\n const v1 = parts.v1;\n if (!ts || !v1) return false;\n\n const manifest = `id:${params.dataId};request-id:${params.requestId};ts:${ts};`;\n const expected = createHmac(\"sha256\", params.secret)\n .update(manifest)\n .digest(\"hex\");\n\n // Constant-time comparison; lengths must match for timingSafeEqual.\n if (expected.length !== v1.length) return false;\n return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/tools.ts","../src/state.ts","../src/types.ts","../src/webhook.ts"],"names":["text","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base class for any error originating from the Mercado Pago integration. All\n * specific error types extend this. Carries the MP HTTP status, the parsed\n * body when available, and the endpoint that failed for debugging.\n */\nexport class MercadoPagoError extends Error {\n constructor(\n message: string,\n public status: number,\n public endpoint: string,\n public mpResponse?: unknown,\n ) {\n super(message);\n this.name = \"MercadoPagoError\";\n }\n}\n\n/**\n * Thrown when the access token is missing, expired, or rejected by MP.\n */\nexport class MercadoPagoAuthError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the request as unauthorized. Check the access token (TEST- prefix for sandbox, APP_USR- for production).\",\n 401,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAuthError\";\n }\n}\n\n/**\n * Thrown when MP returns the \"back_url is not a valid URL\" rejection. Common\n * when devs pass localhost or http:// — MP requires HTTPS only, even in sandbox.\n */\nexport class MercadoPagoBackUrlInvalidError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"back_url must be a valid HTTPS URL. localhost and http:// URLs are rejected by Mercado Pago, including in sandbox. Use a placeholder like https://example.com/done for local testing.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoBackUrlInvalidError\";\n }\n}\n\n/**\n * Thrown when the buyer email matches the seller account's email. MP refuses\n * self-payment on subscriptions: the Confirmar button at the init_point UI\n * stays disabled with no surfaceable error message.\n */\nexport class MercadoPagoSelfPaymentError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"The buyer email cannot equal the seller account's email. Mercado Pago blocks self-payment on subscriptions.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoSelfPaymentError\";\n }\n}\n\n/**\n * Thrown when MP returns \"Cannot operate between different countries\". Despite\n * the error text, this generally signals an account-type mismatch (real\n * account-in-test-mode vs. test user account), not a literal country mismatch.\n */\nexport class MercadoPagoAccountTypeMismatchError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the operation: 'Cannot operate between different countries'. Despite the wording, this usually means the seller token and the buyer email are different account types (real-account-in-test-mode vs. test_user_*@testuser.com). Use a real consumer email as the buyer.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAccountTypeMismatchError\";\n }\n}\n\n/**\n * Thrown when MP's risk engine rejects the first payment of a subscription.\n * IMPORTANT: when this happens, MP automatically cancels the entire preapproval\n * — you cannot retry on the same subscription, you must create a fresh one.\n */\nexport class MercadoPagoPaymentRejectedError extends MercadoPagoError {\n constructor(\n public preapprovalId: string,\n public statusDetail: string | null,\n body?: unknown,\n ) {\n super(\n `Payment rejected by Mercado Pago risk engine on preapproval ${preapprovalId}. Status detail: ${statusDetail ?? \"unknown\"}. The preapproval was auto-cancelled by MP — create a fresh subscription to retry.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoPaymentRejectedError\";\n }\n}\n\n/**\n * Thrown when an attempt is made to authorize a preapproval via API. Only the\n * payer can authorize via the init_point UI; there is no admin override even\n * in sandbox.\n */\nexport class MercadoPagoAuthorizeForbiddenError extends MercadoPagoError {\n constructor(preapprovalId: string, body?: unknown) {\n super(\n `Cannot authorize preapproval ${preapprovalId} via API: only the payer can authorize through the init_point checkout. There is no API shortcut, even in sandbox.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoAuthorizeForbiddenError\";\n }\n}\n\n/**\n * Thrown when MP rate-limits the integration. Retry with exponential backoff.\n */\nexport class MercadoPagoRateLimitError extends MercadoPagoError {\n constructor(\n endpoint: string,\n public retryAfterSeconds: number | null,\n body?: unknown,\n ) {\n super(\n `Mercado Pago rate limit hit on ${endpoint}. ${\n retryAfterSeconds\n ? `Retry after ${retryAfterSeconds}s.`\n : \"Retry with exponential backoff.\"\n }`,\n 429,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoRateLimitError\";\n }\n}\n\n/**\n * Thrown when MP is overloaded and serves an HTML 503 page instead of a JSON\n * error. The library detects content-type !== application/json on 5xx and\n * raises this typed error so retry logic + agent UX can branch correctly.\n */\nexport class MercadoPagoOverloadedError extends MercadoPagoError {\n constructor(endpoint: string, status: number) {\n super(\n `Mercado Pago appears overloaded — returned a non-JSON ${status} response for ${endpoint}. Wait a few seconds and retry.`,\n status,\n endpoint,\n );\n this.name = \"MercadoPagoOverloadedError\";\n }\n}\n\n/**\n * Thrown when a request exceeds the configured `requestTimeoutMs`. Retried\n * automatically up to `maxRetries`; this surfaces only when the budget runs\n * out.\n */\nexport class MercadoPagoTimeoutError extends MercadoPagoError {\n constructor(endpoint: string, public readonly timeoutMs: number) {\n super(\n `Mercado Pago request timed out after ${timeoutMs}ms on ${endpoint}. Increase requestTimeoutMs or check connectivity.`,\n 0,\n endpoint,\n );\n this.name = \"MercadoPagoTimeoutError\";\n }\n}\n\n/**\n * Maps an MP error response body to the most specific known error class. Falls\n * back to the generic MercadoPagoError when no specific pattern matches.\n */\nexport function classifyError(\n status: number,\n endpoint: string,\n body: unknown,\n context?: { preapprovalId?: string; payerEmail?: string; sellerEmail?: string },\n): MercadoPagoError {\n const bodyText =\n typeof body === \"string\"\n ? body\n : body && typeof body === \"object\"\n ? JSON.stringify(body)\n : \"\";\n const lower = bodyText.toLowerCase();\n\n if (status === 401) return new MercadoPagoAuthError(endpoint, body);\n if (status === 429) {\n // Try to extract Retry-After from the body if it includes one.\n let retryAfter: number | null = null;\n const obj = body as { retry_after?: number; \"retry-after\"?: number } | undefined;\n if (obj?.retry_after) retryAfter = Number(obj.retry_after);\n else if (obj?.[\"retry-after\"]) retryAfter = Number(obj[\"retry-after\"]);\n return new MercadoPagoRateLimitError(endpoint, retryAfter, body);\n }\n if (status === 400) {\n if (lower.includes(\"back_url\") && lower.includes(\"not a valid url\")) {\n return new MercadoPagoBackUrlInvalidError(endpoint, body);\n }\n if (\n lower.includes(\"cannot operate\") &&\n lower.includes(\"different countries\")\n ) {\n return new MercadoPagoAccountTypeMismatchError(endpoint, body);\n }\n if (\n lower.includes(\"only the payer can\") &&\n context?.preapprovalId\n ) {\n return new MercadoPagoAuthorizeForbiddenError(context.preapprovalId, body);\n }\n if (\n context?.payerEmail &&\n context?.sellerEmail &&\n context.payerEmail.toLowerCase() === context.sellerEmail.toLowerCase()\n ) {\n return new MercadoPagoSelfPaymentError(endpoint, body);\n }\n }\n return new MercadoPagoError(\n `Mercado Pago ${endpoint} failed: ${status} ${bodyText.slice(0, 200)}`,\n status,\n endpoint,\n body,\n );\n}\n","import { classifyError, MercadoPagoError, MercadoPagoOverloadedError, MercadoPagoRateLimitError, MercadoPagoTimeoutError } from \"./errors\";\nimport type {\n AccountInfo,\n CardToken,\n CreateCardTokenParams,\n CreateCustomerParams,\n CreatePaymentParams,\n CreatePosParams,\n CreatePreapprovalParams,\n CreatePreferenceParams,\n CreateQrPaymentParams,\n CreateRefundParams,\n CreateStoreParams,\n CreateSubscriptionPlanParams,\n CreateWebhookParams,\n Customer,\n CustomerCard,\n Dispute,\n IdentificationType,\n InstallmentOffer,\n Issuer,\n Payment,\n PaymentMethod,\n PaymentsSearchResult,\n Pos,\n Preapproval,\n Preference,\n QrOrder,\n Refund,\n SearchPaymentsParams,\n Store,\n SubscriptionPayment,\n SubscriptionPlan,\n WebhookConfig,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.mercadopago.com\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface MercadoPagoClientOptions {\n /** Access token. TEST- prefix for sandbox, APP_USR- for production. */\n accessToken: string;\n /**\n * Override the API base URL. Mostly useful for tests against MSW or for\n * pointing at a regional MP host. Defaults to https://api.mercadopago.com.\n */\n baseUrl?: string;\n /**\n * Custom fetch implementation. Defaults to globalThis.fetch. Override to\n * inject your own retry/instrumentation layer or to test with MSW.\n */\n fetch?: typeof fetch;\n /**\n * Per-request timeout in ms. Aborts the request and throws if exceeded.\n * Default 30_000 (30s). MP can be slow under load; 30s is a safe upper bound.\n */\n requestTimeoutMs?: number;\n /**\n * Number of retries on 5xx + network errors. Default 1 (single retry).\n * 4xx errors are NEVER retried (they're user/config errors). Each retry\n * uses exponential backoff: 250ms, 500ms, 1000ms, ...\n */\n maxRetries?: number;\n /**\n * Observability hook fired AFTER every request (success or failure).\n * Useful for logging, metrics, tracing. Synchronous, fire-and-forget.\n */\n onCall?: (event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void;\n}\n\ninterface RequestOptions {\n /** Idempotency key. Required for POST/PUT to dedupe retries safely. */\n idempotencyKey?: string;\n /** Query string params. Object → URLSearchParams. */\n query?: Record<string, string | number | undefined>;\n /** Context for error classification. */\n classifyContext?: {\n preapprovalId?: string;\n paymentId?: string;\n customerId?: string;\n payerEmail?: string;\n sellerEmail?: string;\n };\n}\n\n/**\n * Thin, typed wrapper around Mercado Pago's REST API. Exposes the surface\n * the agent layer needs: Subscriptions (Preapprovals), Payments, Checkout Pro\n * (Preferences), Customers + saved Cards, Refunds, Payment Methods +\n * Installments, and Account info. Deliberately narrower than a full SDK\n * rebuild — we add endpoints when the agent layer needs them.\n */\nexport class MercadoPagoClient {\n private readonly accessToken: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch | undefined;\n private readonly requestTimeoutMs: number;\n private readonly maxRetries: number;\n private readonly onCall:\n | ((event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void)\n | undefined;\n\n constructor(options: MercadoPagoClientOptions) {\n if (!options.accessToken) {\n throw new Error(\n \"MercadoPagoClient requires an accessToken. Get one from https://www.mercadopago.com.ar/developers/panel/credentials\",\n );\n }\n this.accessToken = options.accessToken;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.fetchImpl = options.fetch;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;\n this.maxRetries = Math.max(0, options.maxRetries ?? 1);\n this.onCall = options.onCall;\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.accessToken}`,\n \"Content-Type\": \"application/json\",\n };\n if (options?.idempotencyKey) {\n headers[\"X-Idempotency-Key\"] = options.idempotencyKey;\n }\n\n let url = `${this.baseUrl}${path}`;\n if (options?.query) {\n const search = new URLSearchParams();\n for (const [k, v] of Object.entries(options.query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n search.set(k, String(v));\n }\n }\n const qs = search.toString();\n if (qs) url += `?${qs}`;\n }\n\n const fetchFn = this.fetchImpl ?? globalThis.fetch;\n const t0 = Date.now();\n let attempt = 0;\n let lastError: unknown;\n let lastStatus: number | null = null;\n\n while (attempt <= this.maxRetries) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n\n const init: RequestInit = { method, headers, signal: controller.signal };\n if (body !== undefined) init.body = JSON.stringify(body);\n\n try {\n const res = await fetchFn(url, init);\n clearTimeout(timer);\n lastStatus = res.status;\n\n if (res.ok) {\n const text = await res.text();\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: true,\n });\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Retry on 5xx and 429 (rate-limit); never on 4xx user/config errors\n const isRetryable = res.status >= 500 || res.status === 429;\n if (isRetryable && attempt < this.maxRetries) {\n // Honor Retry-After header on 429\n const retryAfter = res.headers.get(\"retry-after\");\n const waitMs = retryAfter\n ? Number(retryAfter) * 1000\n : 250 * Math.pow(2, attempt);\n attempt++;\n await sleep(waitMs);\n continue;\n }\n\n // Detect HTML / non-JSON 5xx (MP overloaded)\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (res.status >= 500 && !contentType.includes(\"application/json\")) {\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw new MercadoPagoOverloadedError(path, res.status);\n }\n\n let parsed: unknown;\n const text = await res.text();\n try { parsed = JSON.parse(text); } catch { parsed = text; }\n const err = classifyError(res.status, path, parsed, options?.classifyContext);\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw err;\n } catch (err) {\n clearTimeout(timer);\n // If err is a MercadoPagoError, the 5xx-final / 4xx branch already\n // fired onCall above — don't double-fire. Just re-throw.\n if (err instanceof MercadoPagoError) throw err;\n\n // Network error / abort / parse error — retry if budget remains\n const isAbort = err instanceof Error && err.name === \"AbortError\";\n const isNetwork = !lastStatus && !isAbort;\n if ((isNetwork || isAbort) && attempt < this.maxRetries) {\n lastError = err;\n attempt++;\n await sleep(250 * Math.pow(2, attempt - 1));\n continue;\n }\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: lastStatus,\n retried: attempt,\n success: false,\n });\n if (isAbort) {\n throw new MercadoPagoTimeoutError(path, this.requestTimeoutMs);\n }\n throw err;\n }\n }\n\n throw lastError ?? new Error(`MercadoPago request failed after ${this.maxRetries} retries`);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Subscriptions (Preapprovals) — v0.1 surface, kept stable\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a recurring subscription (preapproval). The returned `init_point`\n * URL is where the buyer must complete the FIRST payment with their card +\n * CVV — there is no API path that bypasses this human step.\n */\n async createPreapproval(\n params: CreatePreapprovalParams,\n ): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"POST\",\n \"/preapproval\",\n {\n reason: params.reason,\n payer_email: params.payerEmail,\n back_url: params.backUrl,\n external_reference: params.externalReference,\n auto_recurring: {\n frequency: params.frequency,\n frequency_type: params.frequencyType,\n transaction_amount: params.amount,\n currency_id: params.currency,\n },\n },\n { classifyContext: { payerEmail: params.payerEmail } },\n );\n }\n\n async getPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\"GET\", `/preapproval/${id}`, undefined, {\n classifyContext: { preapprovalId: id },\n });\n }\n\n async cancelPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async pausePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"paused\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async resumePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"authorized\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment. Two main flows:\n * - **Card payment**: pass `token` (from MP frontend Cardform) + payment_method_id.\n * - **Account money / cash**: omit token, pass payment_method_id like \"account_money\", \"rapipago\", \"pagofacil\".\n *\n * For credit card payments where you don't have a card token (i.e., you only\n * have a payer email and want to send them a payment link), use\n * `createPreference` (Checkout Pro) instead.\n *\n * Idempotency: pass `idempotencyKey` to safely retry. Required for production\n * to dedupe network-failed requests.\n */\n async createPayment(params: CreatePaymentParams): Promise<Payment> {\n const body: Record<string, unknown> = {\n transaction_amount: params.transactionAmount,\n payment_method_id: params.paymentMethodId,\n payer: {\n email: params.payerEmail,\n ...(params.identification ? { identification: params.identification } : {}),\n },\n };\n if (params.installments !== undefined) body.installments = params.installments;\n if (params.token !== undefined) body.token = params.token;\n if (params.description !== undefined) body.description = params.description;\n if (params.externalReference !== undefined) body.external_reference = params.externalReference;\n if (params.notificationUrl !== undefined) body.notification_url = params.notificationUrl;\n if (params.statementDescriptor !== undefined)\n body.statement_descriptor = params.statementDescriptor;\n if (params.capture !== undefined) body.capture = params.capture;\n if (params.additionalInfo !== undefined) body.additional_info = params.additionalInfo;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { payerEmail: params.payerEmail },\n });\n }\n\n /** Fetch a payment by ID. */\n async getPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\"GET\", `/v1/payments/${id}`, undefined, {\n classifyContext: { paymentId: id },\n });\n }\n\n /**\n * Search payments with filters. Common: by external_reference (your-system\n * id), by status, by date range. Pagination via offset + limit (max 100).\n */\n async searchPayments(params: SearchPaymentsParams = {}): Promise<PaymentsSearchResult> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n if (params.externalReference) query[\"external_reference\"] = params.externalReference;\n if (params.status) query[\"status\"] = params.status as string;\n if (params.payerEmail) query[\"payer.email\"] = params.payerEmail;\n if (params.beginDate) query[\"begin_date\"] = params.beginDate;\n if (params.endDate) query[\"end_date\"] = params.endDate;\n if (params.sort) query[\"sort\"] = params.sort;\n if (params.criteria) query[\"criteria\"] = params.criteria;\n\n return this.request<PaymentsSearchResult>(\n \"GET\",\n \"/v1/payments/search\",\n undefined,\n { query },\n );\n }\n\n /**\n * Capture a previously authorized payment. Only works for credit-card\n * payments created with `capture: false`. Optional partial capture amount.\n */\n async capturePayment(id: string, amount?: number): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n amount !== undefined ? { capture: true, transaction_amount: amount } : { capture: true },\n { classifyContext: { paymentId: id } },\n );\n }\n\n /**\n * Cancel a pending or in_process payment. Once approved, you must use\n * `createRefund` instead.\n */\n async cancelPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { paymentId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Refunds\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Refund a payment fully (omit `amount`) or partially. Idempotency key\n * recommended — refunds can fail mid-flight and you don't want double-refunds\n * on retry.\n */\n async createRefund(params: CreateRefundParams): Promise<Refund> {\n const body = params.amount !== undefined ? { amount: params.amount } : undefined;\n return this.request<Refund>(\n \"POST\",\n `/v1/payments/${params.paymentId}/refunds`,\n body,\n {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { paymentId: params.paymentId },\n },\n );\n }\n\n async listRefunds(paymentId: string): Promise<Refund[]> {\n const res = await this.request<Refund[] | { refunds: Refund[] }>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds`,\n undefined,\n { classifyContext: { paymentId } },\n );\n return Array.isArray(res) ? res : res.refunds ?? [];\n }\n\n async getRefund(paymentId: string, refundId: string): Promise<Refund> {\n return this.request<Refund>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds/${refundId}`,\n undefined,\n { classifyContext: { paymentId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Checkout Pro (Preferences)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment preference for Checkout Pro. Returns `init_point` URL\n * where the buyer completes payment on MP-hosted form. This is the\n * recommended flow when you don't have a card token (most common path for\n * agents — you don't want to handle PCI data).\n *\n * Sandbox: use `sandbox_init_point` instead of `init_point`.\n */\n async createPreference(params: CreatePreferenceParams): Promise<Preference> {\n const body: Record<string, unknown> = {\n items: params.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: it.currency_id ?? \"ARS\",\n ...(it.description ? { description: it.description } : {}),\n ...(it.picture_url ? { picture_url: it.picture_url } : {}),\n })),\n };\n if (params.payer) body.payer = params.payer;\n if (params.backUrls) body.back_urls = params.backUrls;\n if (params.autoReturn) body.auto_return = params.autoReturn;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.paymentMethods) body.payment_methods = params.paymentMethods;\n if (params.statementDescriptor)\n body.statement_descriptor = params.statementDescriptor;\n if (params.expires !== undefined) body.expires = params.expires;\n if (params.expirationDateFrom) body.expiration_date_from = params.expirationDateFrom;\n if (params.expirationDateTo) body.expiration_date_to = params.expirationDateTo;\n\n return this.request<Preference>(\"POST\", \"/checkout/preferences\", body);\n }\n\n async getPreference(id: string): Promise<Preference> {\n return this.request<Preference>(\"GET\", `/checkout/preferences/${id}`);\n }\n\n async updatePreference(\n id: string,\n patch: Partial<CreatePreferenceParams>,\n ): Promise<Preference> {\n return this.request<Preference>(\"PUT\", `/checkout/preferences/${id}`, patch);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ───────────────────────────────────────────────────────────────────────────\n\n async createCustomer(params: CreateCustomerParams): Promise<Customer> {\n const body: Record<string, unknown> = { email: params.email };\n if (params.firstName) body.first_name = params.firstName;\n if (params.lastName) body.last_name = params.lastName;\n if (params.phone) body.phone = { area_code: params.phone.areaCode, number: params.phone.number };\n if (params.identification) body.identification = params.identification;\n if (params.description) body.description = params.description;\n return this.request<Customer>(\"POST\", \"/v1/customers\", body, {\n classifyContext: { payerEmail: params.email },\n });\n }\n\n async getCustomer(id: string): Promise<Customer> {\n return this.request<Customer>(\"GET\", `/v1/customers/${id}`, undefined, {\n classifyContext: { customerId: id },\n });\n }\n\n /**\n * Search customers. Most common: by email (returns 0 or 1 result).\n * Note: MP's `/v1/customers/search` returns a paginated wrapper, not a flat array.\n */\n async searchCustomers(params: { email?: string; limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Customer[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 10,\n offset: params.offset ?? 0,\n };\n if (params.email) query[\"email\"] = params.email;\n return this.request(\"GET\", \"/v1/customers/search\", undefined, { query });\n }\n\n async listCustomerCards(customerId: string): Promise<CustomerCard[]> {\n return this.request<CustomerCard[]>(\n \"GET\",\n `/v1/customers/${customerId}/cards`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async getCustomerCard(customerId: string, cardId: string): Promise<CustomerCard> {\n return this.request<CustomerCard>(\n \"GET\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async deleteCustomerCard(customerId: string, cardId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List all payment methods enabled for the account's site (MLA = Argentina). */\n async listPaymentMethods(): Promise<PaymentMethod[]> {\n return this.request<PaymentMethod[]>(\"GET\", \"/v1/payment_methods\");\n }\n\n /**\n * Get installment options for an amount. THE killer AR feature — returns\n * `payer_costs` with `recommended_message` strings like \"12 cuotas sin\n * interés de $X\" that you should surface verbatim to the user.\n *\n * Pass `bin` (first 6 digits of card) for issuer-specific offers (e.g.,\n * Naranja's interest-free promotions). Without bin, returns generic offers.\n */\n async getInstallments(params: {\n amount: number;\n paymentMethodId?: string;\n bin?: string;\n issuerId?: string;\n }): Promise<InstallmentOffer[]> {\n const query: Record<string, string | number | undefined> = {\n amount: params.amount,\n };\n if (params.paymentMethodId) query[\"payment_method_id\"] = params.paymentMethodId;\n if (params.bin) query[\"bin\"] = params.bin;\n if (params.issuerId) query[\"issuer.id\"] = params.issuerId;\n return this.request<InstallmentOffer[]>(\n \"GET\",\n \"/v1/payment_methods/installments\",\n undefined,\n { query },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Account\n // ───────────────────────────────────────────────────────────────────────────\n\n /** Get info about the account that owns this access token. */\n async getMe(): Promise<AccountInfo> {\n return this.request<AccountInfo>(\"GET\", \"/users/me\");\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Card tokens (server-side, for saved-card retokenization)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a single-use card token from a saved card. This is the server-side\n * retokenization path (PCI-safe because the card data lives in MP's vault,\n * we only pass the saved card_id + customer_id + the user-supplied CVV).\n *\n * Tokens expire in 7 days but typically burn on first use. AR currently\n * REQUIRES CVV on every charge (MP doesn't store it); skipping CVV requires\n * a private MP product enablement, not a public API.\n */\n async createCardToken(params: CreateCardTokenParams): Promise<CardToken> {\n return this.request<CardToken>(\"POST\", \"/v1/card_tokens\", {\n card_id: params.cardId,\n customer_id: params.customerId,\n security_code: params.securityCode,\n });\n }\n\n /**\n * High-level helper: charge a saved card in 3 steps.\n * 1. Mint a card token from {customer_id, card_id, security_code}\n * 2. Lookup card to fill payment_method_id (avoids agent guessing)\n * 3. Create the payment with the token + idempotency key\n *\n * Returns the resulting Payment. Uses deterministic idempotency from\n * (card_id, amount, externalReference) so retries dedupe on MP's side.\n */\n async chargeSavedCard(params: {\n customerId: string;\n cardId: string;\n securityCode: string;\n amount: number;\n description: string;\n installments?: number;\n externalReference?: string;\n statementDescriptor?: string;\n idempotencyKey?: string;\n }): Promise<Payment> {\n // Step 1: Mint single-use token\n const token = await this.createCardToken({\n cardId: params.cardId,\n customerId: params.customerId,\n securityCode: params.securityCode,\n });\n\n // Step 2: Lookup the saved card to fill payment_method_id\n const card = await this.getCustomerCard(params.customerId, params.cardId);\n const paymentMethodId = card.payment_method?.id;\n if (!paymentMethodId) {\n throw new MercadoPagoError(\n `Saved card ${params.cardId} has no payment_method.id. Cannot charge.`,\n 0,\n `/v1/customers/${params.customerId}/cards/${params.cardId}`,\n );\n }\n\n // Step 3: Create payment\n const body: Record<string, unknown> = {\n transaction_amount: params.amount,\n token: token.id,\n payment_method_id: paymentMethodId,\n installments: params.installments ?? 1,\n description: params.description,\n payer: { type: \"customer\", id: params.customerId },\n };\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.statementDescriptor) body.statement_descriptor = params.statementDescriptor;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey !== undefined ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { customerId: params.customerId },\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // QR (in-store dynamic) — Section 2 of v0.3 spec\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a dynamic in-store QR order. Returns `qr_data` (EMVCo TLV string)\n * + `in_store_order_id`. The buyer scans the QR with any AR wallet (Modo,\n * BNA+, Cuenta DNI, Naranja X, etc. — interop is mandated by Transferencias\n * 3.0). On payment, MP fires `point_integration_wh` then `payment` topics.\n *\n * Requires a pre-configured POS (`external_pos_id` from MP dashboard or\n * `POST /pos`). The seller's `user_id` is auto-fetched from `/users/me`.\n *\n * The lib does NOT render the QR image — pass `qr_data` to a QR renderer\n * (e.g., `qrcode` package) to get a data URL. The agent tool layer wraps\n * this and returns both raw + data URL.\n */\n async createQrPayment(userId: string, params: CreateQrPaymentParams): Promise<QrOrder> {\n const body: Record<string, unknown> = {\n total_amount: params.totalAmount,\n title: params.title,\n };\n if (params.description) body.description = params.description;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.expirationDate) body.expiration_date = params.expirationDate;\n body.items = params.items ?? [\n {\n title: params.title,\n quantity: 1,\n unit_price: params.totalAmount,\n unit_measure: \"unit\",\n total_amount: params.totalAmount,\n },\n ];\n\n return this.request<QrOrder>(\n \"PUT\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(params.externalPosId)}/qrs`,\n body,\n );\n }\n\n /**\n * Cancel a pending QR order on a POS. Necessary if the buyer never scans\n * — otherwise the next `createQrPayment` on the same POS returns 409.\n */\n async cancelQrPayment(userId: string, externalPosId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(externalPosId)}/qrs`,\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Subscription Plans (preapproval_plan — reusable plans, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a reusable subscription plan. Customers later subscribe to it via\n * `subscribeToPlan` (which creates a preapproval pointing at the plan).\n *\n * Use this when you have fixed tiers (Básico/Pro/Enterprise). For custom\n * per-customer amounts, skip plans and use `createPreapproval` directly.\n */\n async createSubscriptionPlan(params: CreateSubscriptionPlanParams): Promise<SubscriptionPlan> {\n const body: Record<string, unknown> = {\n reason: params.reason,\n back_url: params.backUrl,\n auto_recurring: {\n frequency: params.frequency,\n frequency_type: params.frequencyType,\n transaction_amount: params.amount,\n currency_id: params.currency,\n ...(params.freeTrialFrequency !== undefined && params.freeTrialFrequencyType !== undefined\n ? {\n free_trial: {\n frequency: params.freeTrialFrequency,\n frequency_type: params.freeTrialFrequencyType,\n },\n }\n : {}),\n },\n };\n if (params.externalReference) body.external_reference = params.externalReference;\n return this.request<SubscriptionPlan>(\"POST\", \"/preapproval_plan\", body);\n }\n\n async getSubscriptionPlan(id: string): Promise<SubscriptionPlan> {\n return this.request<SubscriptionPlan>(\"GET\", `/preapproval_plan/${id}`);\n }\n\n async listSubscriptionPlans(params: { limit?: number; offset?: number; status?: string } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: SubscriptionPlan[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n if (params.status) query[\"status\"] = params.status;\n return this.request(\"GET\", \"/preapproval_plan/search\", undefined, { query });\n }\n\n async updateSubscriptionPlan(\n id: string,\n patch: { reason?: string; status?: \"active\" | \"cancelled\"; amount?: number; backUrl?: string },\n ): Promise<SubscriptionPlan> {\n const body: Record<string, unknown> = {};\n if (patch.reason !== undefined) body.reason = patch.reason;\n if (patch.status !== undefined) body.status = patch.status;\n if (patch.backUrl !== undefined) body.back_url = patch.backUrl;\n if (patch.amount !== undefined) {\n body.auto_recurring = { transaction_amount: patch.amount };\n }\n return this.request<SubscriptionPlan>(\"PUT\", `/preapproval_plan/${id}`, body);\n }\n\n /**\n * Subscribe a customer to an existing plan. Returns a Preapproval with\n * `init_point` URL where the buyer completes the first payment.\n */\n async subscribeToPlan(params: {\n planId: string;\n payerEmail: string;\n cardTokenId?: string;\n externalReference?: string;\n }): Promise<Preapproval> {\n const body: Record<string, unknown> = {\n preapproval_plan_id: params.planId,\n payer_email: params.payerEmail,\n };\n if (params.cardTokenId) body.card_token_id = params.cardTokenId;\n if (params.externalReference) body.external_reference = params.externalReference;\n return this.request<Preapproval>(\"POST\", \"/preapproval\", body, {\n classifyContext: { payerEmail: params.payerEmail },\n });\n }\n\n /**\n * List the auto-charge attempts (authorized_payments) under a preapproval.\n * Useful for \"show me the cobros of the last 6 months for this client\".\n */\n async listSubscriptionPayments(preapprovalId: string, params: { limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: SubscriptionPayment[];\n }> {\n const query: Record<string, string | number | undefined> = {\n preapproval_id: preapprovalId,\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n return this.request(\n \"GET\",\n `/authorized_payments/search`,\n undefined,\n { query, classifyContext: { preapprovalId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Stores + POS (for QR payments self-serve setup, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** Create a store for the seller. POSes (for QR) live under stores. */\n async createStore(userId: string, params: CreateStoreParams): Promise<Store> {\n const body: Record<string, unknown> = {\n name: params.name,\n external_id: params.externalId,\n };\n if (params.location) {\n body.location = {\n ...(params.location.addressLine ? { address_line: params.location.addressLine } : {}),\n ...(params.location.cityName ? { city_name: params.location.cityName } : {}),\n ...(params.location.stateName ? { state_name: params.location.stateName } : {}),\n ...(params.location.countryId ? { country_id: params.location.countryId } : {}),\n ...(params.location.latitude !== undefined ? { latitude: params.location.latitude } : {}),\n ...(params.location.longitude !== undefined ? { longitude: params.location.longitude } : {}),\n };\n }\n return this.request<Store>(\"POST\", `/users/${encodeURIComponent(userId)}/stores`, body);\n }\n\n async listStores(userId: string, params: { limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Store[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n };\n return this.request(\"GET\", `/users/${encodeURIComponent(userId)}/stores/search`, undefined, { query });\n }\n\n /** Create a POS under a store. The POS's `external_id` is what `createQrPayment` uses. */\n async createPos(params: CreatePosParams): Promise<Pos> {\n const body: Record<string, unknown> = {\n name: params.name,\n external_id: params.externalId,\n store_id: params.storeId,\n category: params.category ?? 621102, // \"Other Food and Beverage Services\" — generic default\n };\n if (params.fixedAmount !== undefined) body.fixed_amount = params.fixedAmount;\n return this.request<Pos>(\"POST\", \"/pos\", body);\n }\n\n async listPos(params: { storeId?: string | number; limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Pos[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n };\n if (params.storeId !== undefined) query[\"store_id\"] = String(params.storeId);\n return this.request(\"GET\", \"/pos\", undefined, { query });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Disputes (read-only, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n async listPaymentDisputes(paymentId: string): Promise<Dispute[]> {\n return this.request<Dispute[]>(\"GET\", `/v1/payments/${paymentId}/disputes`, undefined, {\n classifyContext: { paymentId },\n });\n }\n\n async getDispute(paymentId: string, disputeId: string): Promise<Dispute> {\n return this.request<Dispute>(\n \"GET\",\n `/v1/payments/${paymentId}/disputes/${disputeId}`,\n undefined,\n { classifyContext: { paymentId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Identification Types + Issuers (lookup helpers, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List valid identification types for the seller's site. AR returns DNI/CI/LE/LC/Otro/Pasaporte/CUIT/CUIL. */\n async listIdentificationTypes(): Promise<IdentificationType[]> {\n return this.request<IdentificationType[]>(\"GET\", \"/v1/identification_types\");\n }\n\n /** List card issuers for a payment method. Useful with `bin` for installments. */\n async listIssuers(params: { paymentMethodId: string; bin?: string }): Promise<Issuer[]> {\n const query: Record<string, string | number | undefined> = {\n payment_method_id: params.paymentMethodId,\n };\n if (params.bin) query[\"bin\"] = params.bin;\n return this.request<Issuer[]>(\"GET\", \"/v1/payment_methods/card_issuers\", undefined, { query });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Webhooks management (v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List configured webhook subscriptions. */\n async listWebhooks(): Promise<WebhookConfig[]> {\n return this.request<WebhookConfig[]>(\"GET\", \"/v1/webhooks\");\n }\n\n /** Create a webhook subscription for a topic. */\n async createWebhook(params: CreateWebhookParams): Promise<WebhookConfig> {\n return this.request<WebhookConfig>(\"POST\", \"/v1/webhooks\", {\n url: params.url,\n topic: params.topic,\n });\n }\n\n async updateWebhook(id: string, patch: { url?: string; topic?: string }): Promise<WebhookConfig> {\n return this.request<WebhookConfig>(\"PUT\", `/v1/webhooks/${id}`, patch);\n }\n\n async deleteWebhook(id: string): Promise<void> {\n await this.request(\"DELETE\", `/v1/webhooks/${id}`);\n }\n}\n\nexport { MercadoPagoError };\n","import { createHash } from \"node:crypto\";\nimport { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport type { MercadoPagoClient } from \"./client\";\nimport type { SubscriptionStateAdapter } from \"./state\";\n\n/**\n * Deterministic idempotency key from caller-meaningful fields. Safe to retry:\n * the SAME inputs always produce the same key, so MP dedupes on its side\n * even if the client retries multiple times. Use a hash to keep keys short\n * + opaque (callers can't accidentally extract sensitive data from the key).\n */\nfunction deterministicIdempotencyKey(...parts: Array<string | number | undefined>): string {\n const payload = parts\n .filter((p) => p !== undefined && p !== null)\n .map(String)\n .join(\"|\");\n return createHash(\"sha256\").update(payload).digest(\"hex\").slice(0, 32);\n}\n\nexport interface MercadoPagoToolsOptions {\n /** State adapter for persisting subscription records. */\n state: SubscriptionStateAdapter;\n /**\n * Default back_url used when callers don't supply one. MUST be HTTPS — MP\n * rejects http:// and localhost back URLs even in sandbox.\n */\n backUrl: string;\n /**\n * Optionally override the agent-facing tool descriptions. Pass an object\n * with keys matching tool names; values replace the default description.\n * Useful for localizing the agent's tool reasoning.\n */\n descriptions?: Partial<Record<ToolName, string>>;\n /**\n * Default notification webhook URL used when callers don't supply one.\n * Optional — MP falls back to dashboard config if not set.\n */\n notificationUrl?: string;\n}\n\ntype ToolName =\n // Subscriptions (v0.1)\n | \"create_subscription\"\n | \"get_subscription_status\"\n | \"cancel_subscription\"\n | \"pause_subscription\"\n | \"resume_subscription\"\n // Payments (v0.2)\n | \"create_payment\"\n | \"get_payment\"\n | \"search_payments\"\n | \"cancel_payment\"\n | \"capture_payment\"\n // Refunds (v0.2)\n | \"refund_payment\"\n | \"list_refunds\"\n // Checkout Pro (v0.2)\n | \"create_payment_preference\"\n | \"get_payment_preference\"\n // Customers + Cards (v0.2)\n | \"create_customer\"\n | \"find_customer_by_email\"\n | \"list_customer_cards\"\n | \"delete_customer_card\"\n // Payment Methods + Installments (v0.2)\n | \"list_payment_methods\"\n | \"calculate_installments\"\n // Account (v0.2)\n | \"get_account_info\"\n // Saved-card charging (v0.3)\n | \"charge_saved_card\"\n // QR in-store (v0.3)\n | \"create_qr_payment\"\n | \"cancel_qr_payment\"\n // Subscription Plans (v0.4)\n | \"create_subscription_plan\"\n | \"list_subscription_plans\"\n | \"update_subscription_plan\"\n | \"subscribe_to_plan\"\n | \"list_subscription_payments\"\n // Stores + POS (v0.4)\n | \"create_store\"\n | \"list_stores\"\n | \"create_pos\"\n | \"list_pos\"\n // Disputes (v0.4)\n | \"list_payment_disputes\"\n | \"get_dispute\"\n // Lookup helpers (v0.4)\n | \"list_identification_types\"\n | \"list_issuers\"\n // Webhooks (v0.4)\n | \"list_webhooks\"\n | \"create_webhook\"\n | \"update_webhook\"\n | \"delete_webhook\";\n\nconst DEFAULT_DESCRIPTIONS: Record<ToolName, string> = {\n // ── Subscriptions ────────────────────────────────────────────────────────\n create_subscription:\n \"Create a Mercado Pago recurring subscription. Returns an init_point URL where the customer must complete the FIRST payment with their card and CVV (this is a hard MP requirement; agents cannot bypass it). After they pay, MP will auto-charge at the configured frequency without further intervention.\",\n get_subscription_status:\n \"Check the current status of a Mercado Pago subscription. Use this to confirm the customer completed the first payment (status becomes 'authorized') or to inspect the next charge date.\",\n cancel_subscription:\n \"Cancel an active Mercado Pago subscription. After cancellation, MP will not charge the customer again. This action is irreversible — confirm with the user before calling.\",\n pause_subscription:\n \"Pause an authorized Mercado Pago subscription. Charges stop until resumed. Only works on subscriptions in 'authorized' status.\",\n resume_subscription:\n \"Resume a paused Mercado Pago subscription. Charges resume on the next scheduled date. Only works on subscriptions in 'paused' status.\",\n\n // ── Payments ─────────────────────────────────────────────────────────────\n create_payment:\n \"Create a one-time payment. Two flows: (a) with a card token from MP frontend Cardform — for transparent checkout; (b) without token, for non-card methods like 'account_money', 'rapipago', 'pagofacil'. For most agent flows where you only have a payer email and want to send them a payment link, use create_payment_preference instead (Checkout Pro hosted form). Returns the Payment object with status — typically 'approved' for account_money and 'pending' for tickets.\",\n get_payment:\n \"Fetch a single payment by ID. Use to confirm status after webhook arrives, or to inspect details (status_detail explains rejections).\",\n search_payments:\n \"Search payments with filters. Most common: by external_reference (your-system identifier) to find all payments for an order, or by status='approved' to list successful charges in a date range. Returns paginated results.\",\n cancel_payment:\n \"Cancel a pending or in_process payment (only works before approval). Once approved, use refund_payment instead. Common use: cancel an unpaid ticket payment that's still pending.\",\n capture_payment:\n \"Capture an authorized credit-card payment that was created with capture=false. Use for hold-then-capture flows (e.g., authorize on order, capture on shipment). Optional partial amount.\",\n\n // ── Refunds ──────────────────────────────────────────────────────────────\n refund_payment:\n \"Refund an approved payment. Pass amount for partial refund; omit for full refund. Idempotency key is auto-generated based on paymentId+amount to prevent double-refunds on retries.\",\n list_refunds:\n \"List all refunds for a given payment. Returns array of Refund objects. Useful to confirm a refund was processed or to inspect partial-refund history.\",\n\n // ── Checkout Pro ─────────────────────────────────────────────────────────\n create_payment_preference:\n \"Create a Mercado Pago Checkout Pro preference and get back a payment URL (init_point) to send to the customer. THIS is the recommended way for an agent to take a payment when you only have a payer email — the buyer enters card data on MP's hosted form (no PCI scope needed). Supports cuotas configuration, payment method exclusions, back URLs after success/failure/pending. In sandbox, use sandbox_init_point from the response.\",\n get_payment_preference:\n \"Fetch a Checkout Pro preference by ID. Returns the preference config and current init_point URLs. Use to inspect a previously-created link.\",\n\n // ── Customers + Cards ────────────────────────────────────────────────────\n create_customer:\n \"Create a Mercado Pago customer record so the buyer can save cards for future charges. Idempotent on email — if a customer with that email exists, MP returns it instead of creating a duplicate. Use find_customer_by_email first if you're unsure.\",\n find_customer_by_email:\n \"Find an existing customer by email address. Returns the customer object if found, or null. Use before create_customer to avoid duplicate records.\",\n list_customer_cards:\n \"List the saved cards for a customer. Returns array with last 4 digits, expiration, payment method (visa, master, naranja, etc.). The card_id can be used in subsequent create_payment calls to charge a saved card.\",\n delete_customer_card:\n \"Delete a saved card from a customer. Common use: customer requests removal, or expired card cleanup. Irreversible.\",\n\n // ── Payment Methods + Installments ───────────────────────────────────────\n list_payment_methods:\n \"List all payment methods enabled for the seller's MP account (visa, master, naranja, naranja_x, cabal, account_money, rapipago, pagofacil, etc.). Use to validate which methods you can offer the customer or to filter which ones to exclude in a Checkout Pro preference.\",\n calculate_installments:\n \"Calculate cuotas (installments) options for a given amount. THE killer Argentine feature — returns options like '12 cuotas sin interés de $X' (recommended_message field) which you should surface VERBATIM to the user. Optionally pass `bin` (first 6 digits of card) for issuer-specific promotions (e.g., Naranja's interest-free deals). Use before create_payment to let the user pick installments knowingly.\",\n\n // ── Account ──────────────────────────────────────────────────────────────\n get_account_info:\n \"Get info about the Mercado Pago account that owns the access token: site_id (MLA=Argentina), country_id, user_type (registered, partial, etc.). Useful to verify the agent is connected to the right account before taking actions.\",\n\n // ── Saved-card charging (v0.3) ───────────────────────────────────────────\n charge_saved_card:\n \"Charge a previously-saved card for a returning customer. Requires customer_id + card_id (from list_customer_cards) AND a fresh CVV the user provides this session. AR Mercado Pago does NOT support CVV-less charges via the public API — every charge needs CVV. Idempotent on (card_id, amount, external_reference): retries dedupe automatically. Returns the resulting Payment.\",\n\n // ── QR in-store (v0.3) ───────────────────────────────────────────────────\n create_qr_payment:\n \"Generate a dynamic in-store QR for a buyer to scan with any AR wallet (Modo, BNA+, Cuenta DNI, Naranja X, Mercado Pago, etc. — interop is mandated by Transferencias 3.0). Requires a pre-configured POS external_id (use create_pos to set one up first if needed). Returns the qr_data string + a base64 PNG data URL ready to display. The QR expires in `expires_in_seconds` (default 600). MP fires `point_integration_wh` then `payment` webhooks when scanned.\",\n cancel_qr_payment:\n \"Cancel a pending QR order on a POS. Necessary if the buyer never scans — otherwise the next create_qr_payment on the same POS returns 409.\",\n\n // ── Subscription Plans (v0.4) ────────────────────────────────────────────\n create_subscription_plan:\n \"Create a REUSABLE subscription plan (preapproval_plan). Different from create_subscription: a plan defines price + frequency once, then customers subscribe to it via subscribe_to_plan. Use plans for SaaS-style billing (Básico/Pro/Enterprise tiers). For per-customer custom amounts, use create_subscription directly.\",\n list_subscription_plans:\n \"List all subscription plans defined for this MP account. Useful before create_subscription_plan to check if one already exists, or for surfacing options to a customer.\",\n update_subscription_plan:\n \"Update a subscription plan's reason / amount / status / back_url. Existing customer subscriptions to the plan are NOT automatically updated — only NEW subscribers get the new pricing.\",\n subscribe_to_plan:\n \"Subscribe a customer to an existing reusable plan. Returns a Preapproval with init_point URL where the customer completes first payment. Cleaner than create_subscription when you have fixed tiers.\",\n list_subscription_payments:\n \"List the auto-charge attempts (authorized_payments) under a subscription. Useful for 'show me the cobros del último mes for this client' or to debug a failing recurring charge.\",\n\n // ── Stores + POS (v0.4) ──────────────────────────────────────────────────\n create_store:\n \"Create a store under the seller's MP account. Stores are the parent entity for POSes (which generate QR payments). Required ONE-TIME setup before create_pos. Pass a unique external_id and a display name.\",\n list_stores:\n \"List all stores configured for this MP account. Use this to find an existing store_id before create_pos, or to surface store options to the agent.\",\n create_pos:\n \"Create a POS (Point of Sale) under a store. The POS's external_id is what create_qr_payment uses. Each physical checkout / counter / agent typically has its own POS. Categories are MP-defined (default 621102 = Other Food and Beverage Services).\",\n list_pos:\n \"List all POSes for the seller (or filtered by store_id). Use to find an existing POS before create_qr_payment, or to surface options.\",\n\n // ── Disputes (v0.4 — read-only) ──────────────────────────────────────────\n list_payment_disputes:\n \"List all disputes / chargebacks raised against a payment. Read-only — resolution is dashboard-only. Surface the dashboard URL `https://www.mercadopago.com.ar/disputes/{dispute_id}` to the user when they need to respond.\",\n get_dispute:\n \"Get details of a specific dispute including reason, amount, resolution status. Read-only.\",\n\n // ── Lookup helpers (v0.4) ────────────────────────────────────────────────\n list_identification_types:\n \"List valid identification types for the seller's site. AR returns: DNI, CI, LE, LC, Otro, Pasaporte, CUIT, CUIL with their min/max length. Useful to validate an identification before passing to create_payment.\",\n list_issuers:\n \"List card issuers (banks) that support a payment_method_id. Optionally filter by `bin` (first 6 digits of the card) for accurate issuer detection. Useful with calculate_installments — issuer-specific promos (e.g., Naranja Galicia 6 cuotas sin interés) only appear when the issuer is identified.\",\n\n // ── Webhooks management (v0.4) ───────────────────────────────────────────\n list_webhooks:\n \"List all webhook subscriptions configured for this MP application. Use to see what topics + URLs are wired before adding new ones.\",\n create_webhook:\n \"Subscribe a webhook URL to a MP topic (payment, subscription_authorized_payment, subscription_preapproval, merchant_order, point_integration_wh). MP will POST to this URL when events of that topic fire.\",\n update_webhook:\n \"Update a webhook's URL or topic. Useful when you change deployment URLs without resubscribing from scratch.\",\n delete_webhook:\n \"Delete a webhook subscription. MP stops POSTing to it immediately.\",\n};\n\n/**\n * Build a tool set for the Vercel AI SDK that exposes Mercado Pago to an\n * agent. Pass directly to `Experimental_Agent`'s `tools` option, or merge with\n * other tool sets.\n *\n * @example\n * ```ts\n * import { Experimental_Agent as Agent, stepCountIs } from 'ai';\n * import { MercadoPagoClient, mercadoPagoTools, InMemoryStateAdapter } from '@ar-agents/mercadopago';\n *\n * const mp = new MercadoPagoClient({ accessToken: process.env.MP_ACCESS_TOKEN! });\n * const agent = new Agent({\n * model: 'anthropic/claude-sonnet-4-6',\n * tools: mercadoPagoTools(mp, {\n * state: new InMemoryStateAdapter(),\n * backUrl: 'https://mysite.com/done',\n * }),\n * stopWhen: stepCountIs(8),\n * });\n * ```\n */\nexport function mercadoPagoTools(\n client: MercadoPagoClient,\n options: MercadoPagoToolsOptions,\n): ToolSet {\n const desc = (name: ToolName): string =>\n options.descriptions?.[name] ?? DEFAULT_DESCRIPTIONS[name];\n\n return {\n // ─────────────────────────────────────────────────────────────────────────\n // Subscriptions (v0.1 — kept identical for backward compatibility)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_subscription: tool({\n description: desc(\"create_subscription\"),\n inputSchema: z.object({\n customer_email: z.string().email().describe(\"Email of the customer who will be charged\"),\n amount_ars: z.number().positive().describe(\"Amount in Argentine Pesos per recurring charge\"),\n frequency_months: z.number().int().positive().max(12).describe(\"Frequency in months (1=monthly, 3=quarterly, 12=yearly)\"),\n reason: z.string().min(3).max(120).describe(\"Short description shown to the customer at checkout\"),\n external_reference: z.string().optional().describe(\"Optional id from your system to track this subscription\"),\n }),\n execute: async ({ customer_email, amount_ars, frequency_months, reason, external_reference }) => {\n const created = await client.createPreapproval({\n reason,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n backUrl: options.backUrl,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n });\n await options.state.set(created.id, {\n status: created.status,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n initPoint: created.init_point,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n createdAt: new Date().toISOString(),\n });\n return {\n subscription_id: created.id,\n status: created.status,\n init_point_url: created.init_point,\n next_step:\n \"Send init_point_url to the customer. They must complete the first payment with card+CVV. Use get_subscription_status to confirm activation after they pay.\",\n };\n },\n }),\n\n get_subscription_status: tool({\n description: desc(\"get_subscription_status\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID\"),\n }),\n execute: async ({ subscription_id }) => {\n const fresh = await client.getPreapproval(subscription_id);\n const cached = await options.state.get(subscription_id);\n return {\n subscription_id: fresh.id,\n status: fresh.status,\n payer_email: fresh.payer_email,\n amount: fresh.auto_recurring.transaction_amount,\n currency: fresh.auto_recurring.currency_id,\n next_payment_date: fresh.next_payment_date ?? null,\n last_webhook_status: cached?.lastWebhookStatus ?? null,\n last_webhook_at: cached?.lastWebhookAt ?? null,\n };\n },\n }),\n\n cancel_subscription: tool({\n description: desc(\"cancel_subscription\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID to cancel\"),\n }),\n execute: async ({ subscription_id }) => {\n const cancelled = await client.cancelPreapproval(subscription_id);\n await options.state.set(subscription_id, {\n status: cancelled.status,\n cancelledAt: new Date().toISOString(),\n });\n return {\n subscription_id: cancelled.id,\n status: cancelled.status,\n message: \"Subscription cancelled. No further charges will occur.\",\n };\n },\n }),\n\n pause_subscription: tool({\n description: desc(\"pause_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const paused = await client.pausePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: paused.status });\n return {\n subscription_id: paused.id,\n status: paused.status,\n message: \"Subscription paused. Use resume_subscription to reactivate.\",\n };\n },\n }),\n\n resume_subscription: tool({\n description: desc(\"resume_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const resumed = await client.resumePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: resumed.status });\n return {\n subscription_id: resumed.id,\n status: resumed.status,\n message: \"Subscription resumed. Charges will continue on next scheduled date.\",\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment: tool({\n description: desc(\"create_payment\"),\n inputSchema: z.object({\n amount_ars: z.number().positive().describe(\"Amount in ARS\"),\n payment_method_id: z.string().describe(\"MP payment method id (e.g. 'account_money', 'rapipago', 'visa', 'master', 'naranja')\"),\n payer_email: z.string().email().describe(\"Email of the payer. Cannot equal seller email.\"),\n token: z.string().optional().describe(\"Card token from MP frontend Cardform. Required for credit/debit; omit for cash/account_money.\"),\n installments: z.number().int().min(1).max(24).optional().describe(\"Number of installments (cuotas). Default 1. Use calculate_installments first to see options.\"),\n description: z.string().max(255).optional().describe(\"Short description\"),\n external_reference: z.string().optional().describe(\"Your-system identifier\"),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional().describe(\"Payer identification — required for some payment types in AR\"),\n statement_descriptor: z.string().max(13).optional().describe(\"Shows on buyer's card statement (max 13 chars)\"),\n }),\n execute: async (input) => {\n const payment = await client.createPayment({\n transactionAmount: input.amount_ars,\n paymentMethodId: input.payment_method_id,\n payerEmail: input.payer_email,\n ...(input.token !== undefined ? { token: input.token } : {}),\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n // Deterministic idempotency key — safe to retry, same inputs always\n // produce the same key (MP dedupes on its side).\n idempotencyKey: deterministicIdempotencyKey(\n \"create_payment\",\n input.external_reference ?? input.payer_email,\n input.amount_ars,\n input.payment_method_id,\n input.token,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n currency: payment.currency_id,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n payer_email: payment.payer?.email ?? null,\n external_reference: payment.external_reference,\n date_created: payment.date_created,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n get_payment: tool({\n description: desc(\"get_payment\"),\n inputSchema: z.object({\n payment_id: z.string().describe(\"The MP payment ID\"),\n }),\n execute: async ({ payment_id }) => {\n const p = await client.getPayment(payment_id);\n return {\n payment_id: p.id,\n status: p.status,\n status_detail: p.status_detail,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payment_method: p.payment_method_id,\n installments: p.installments,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n date_approved: p.date_approved,\n net_received: p.transaction_details?.net_received_amount ?? null,\n };\n },\n }),\n\n search_payments: tool({\n description: desc(\"search_payments\"),\n inputSchema: z.object({\n external_reference: z.string().optional(),\n status: z.string().optional().describe(\"'approved' | 'pending' | 'rejected' | 'cancelled' | 'refunded' etc.\"),\n payer_email: z.string().optional(),\n begin_date: z.string().optional().describe(\"ISO 8601, e.g. 2026-01-01T00:00:00Z\"),\n end_date: z.string().optional().describe(\"ISO 8601\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 30, max 100\"),\n offset: z.number().int().min(0).optional().describe(\"Pagination offset (default 0)\"),\n }),\n execute: async (input) => {\n const result = await client.searchPayments({\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.payer_email !== undefined ? { payerEmail: input.payer_email } : {}),\n ...(input.begin_date !== undefined ? { beginDate: input.begin_date } : {}),\n ...(input.end_date !== undefined ? { endDate: input.end_date } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n return {\n total: result.paging.total,\n returned: result.results.length,\n offset: result.paging.offset,\n payments: result.results.map((p) => ({\n payment_id: p.id,\n status: p.status,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n })),\n };\n },\n }),\n\n cancel_payment: tool({\n description: desc(\"cancel_payment\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const cancelled = await client.cancelPayment(payment_id);\n return {\n payment_id: cancelled.id,\n status: cancelled.status,\n message: \"Payment cancelled. If it was already approved, use refund_payment instead.\",\n };\n },\n }),\n\n capture_payment: tool({\n description: desc(\"capture_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Optional partial-capture amount. Omit to capture full authorized amount.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const captured = await client.capturePayment(payment_id, amount_ars);\n return {\n payment_id: captured.id,\n status: captured.status,\n amount: captured.transaction_amount,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Refunds\n // ─────────────────────────────────────────────────────────────────────────\n\n refund_payment: tool({\n description: desc(\"refund_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Partial-refund amount in ARS. Omit for full refund.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const refund = await client.createRefund({\n paymentId: payment_id,\n ...(amount_ars !== undefined ? { amount: amount_ars } : {}),\n idempotencyKey: deterministicIdempotencyKey(\"refund\", payment_id, amount_ars ?? \"full\"),\n });\n return {\n refund_id: refund.id,\n payment_id: refund.payment_id,\n amount: refund.amount,\n status: refund.status,\n message:\n amount_ars === undefined\n ? \"Full refund issued. Funds return to the buyer in 3-10 business days.\"\n : `Partial refund of ${amount_ars} ARS issued.`,\n };\n },\n }),\n\n list_refunds: tool({\n description: desc(\"list_refunds\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const refunds = await client.listRefunds(payment_id);\n return {\n payment_id,\n count: refunds.length,\n refunds: refunds.map((r) => ({\n refund_id: r.id,\n amount: r.amount,\n status: r.status,\n date_created: r.date_created,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Checkout Pro\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment_preference: tool({\n description: desc(\"create_payment_preference\"),\n inputSchema: z.object({\n items: z.array(z.object({\n title: z.string().min(1).max(256),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n })).min(1).describe(\"Items being charged. At least one required.\"),\n payer_email: z.string().email().optional().describe(\"Pre-fill the payer email on Checkout Pro form\"),\n external_reference: z.string().optional(),\n max_installments: z.number().int().min(1).max(24).optional().describe(\"Limit max cuotas offered. Defaults to MP account config.\"),\n statement_descriptor: z.string().max(13).optional(),\n excluded_payment_types: z.array(z.enum([\"credit_card\", \"debit_card\", \"ticket\", \"atm\", \"bank_transfer\"])).optional().describe(\"Block payment types — e.g., ['ticket'] to disable Rapipago/Pago Fácil\"),\n }),\n execute: async (input) => {\n const pref = await client.createPreference({\n items: input.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: \"ARS\",\n ...(it.description !== undefined ? { description: it.description } : {}),\n ...(it.picture_url !== undefined ? { picture_url: it.picture_url } : {}),\n })),\n ...(input.payer_email !== undefined ? { payer: { email: input.payer_email } } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n backUrls: { success: options.backUrl, failure: options.backUrl, pending: options.backUrl },\n autoReturn: \"approved\",\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n ...((input.max_installments !== undefined || input.excluded_payment_types !== undefined)\n ? {\n paymentMethods: {\n ...(input.max_installments !== undefined ? { installments: input.max_installments } : {}),\n ...(input.excluded_payment_types !== undefined\n ? { excluded_payment_types: input.excluded_payment_types.map((id) => ({ id })) }\n : {}),\n },\n }\n : {}),\n });\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n date_created: pref.date_created,\n next_step:\n \"Send init_point_url (or sandbox_init_point_url in sandbox) to the customer. After they pay, MP fires a webhook with the payment_id; use get_payment to confirm status.\",\n };\n },\n }),\n\n get_payment_preference: tool({\n description: desc(\"get_payment_preference\"),\n inputSchema: z.object({ preference_id: z.string() }),\n execute: async ({ preference_id }) => {\n const pref = await client.getPreference(preference_id);\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n items: pref.items,\n date_created: pref.date_created,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ─────────────────────────────────────────────────────────────────────────\n\n create_customer: tool({\n description: desc(\"create_customer\"),\n inputSchema: z.object({\n email: z.string().email(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional(),\n description: z.string().optional(),\n }),\n execute: async (input) => {\n const customer = await client.createCustomer({\n email: input.email,\n ...(input.first_name !== undefined ? { firstName: input.first_name } : {}),\n ...(input.last_name !== undefined ? { lastName: input.last_name } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n });\n return {\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n date_created: customer.date_created,\n };\n },\n }),\n\n find_customer_by_email: tool({\n description: desc(\"find_customer_by_email\"),\n inputSchema: z.object({ email: z.string().email() }),\n execute: async ({ email }) => {\n const result = await client.searchCustomers({ email, limit: 1 });\n const customer = result.results[0] ?? null;\n return customer\n ? {\n found: true,\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n }\n : { found: false, customer_id: null };\n },\n }),\n\n list_customer_cards: tool({\n description: desc(\"list_customer_cards\"),\n inputSchema: z.object({ customer_id: z.string() }),\n execute: async ({ customer_id }) => {\n const cards = await client.listCustomerCards(customer_id);\n return {\n customer_id,\n count: cards.length,\n cards: cards.map((c) => ({\n card_id: c.id,\n last_four_digits: c.last_four_digits,\n expiration_month: c.expiration_month,\n expiration_year: c.expiration_year,\n payment_method: c.payment_method?.id ?? null,\n payment_method_name: c.payment_method?.name ?? null,\n })),\n };\n },\n }),\n\n delete_customer_card: tool({\n description: desc(\"delete_customer_card\"),\n inputSchema: z.object({\n customer_id: z.string(),\n card_id: z.string(),\n }),\n execute: async ({ customer_id, card_id }) => {\n await client.deleteCustomerCard(customer_id, card_id);\n return { customer_id, card_id, deleted: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ─────────────────────────────────────────────────────────────────────────\n\n list_payment_methods: tool({\n description: desc(\"list_payment_methods\"),\n inputSchema: z.object({}),\n execute: async () => {\n const methods = await client.listPaymentMethods();\n return {\n count: methods.length,\n methods: methods.map((m) => ({\n id: m.id,\n name: m.name,\n payment_type: m.payment_type_id,\n status: m.status,\n min_amount: m.min_allowed_amount,\n max_amount: m.max_allowed_amount,\n })),\n };\n },\n }),\n\n calculate_installments: tool({\n description: desc(\"calculate_installments\"),\n inputSchema: z.object({\n amount_ars: z.number().positive(),\n payment_method_id: z.string().optional().describe(\"E.g. 'visa', 'master', 'naranja'. Omit for all available methods.\"),\n bin: z.string().min(6).max(8).optional().describe(\"First 6-8 digits of card for issuer-specific offers (e.g., Naranja interest-free promotions)\"),\n }),\n execute: async (input) => {\n const offers = await client.getInstallments({\n amount: input.amount_ars,\n ...(input.payment_method_id !== undefined ? { paymentMethodId: input.payment_method_id } : {}),\n ...(input.bin !== undefined ? { bin: input.bin } : {}),\n });\n return {\n amount: input.amount_ars,\n offers: offers.map((o) => ({\n payment_method_id: o.payment_method_id,\n payment_type_id: o.payment_type_id,\n issuer_name: o.issuer?.name ?? null,\n options: o.payer_costs.map((pc) => ({\n installments: pc.installments,\n installment_amount: pc.installment_amount,\n total_amount: pc.total_amount,\n installment_rate: pc.installment_rate,\n recommended_message: pc.recommended_message,\n })),\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Account\n // ─────────────────────────────────────────────────────────────────────────\n\n get_account_info: tool({\n description: desc(\"get_account_info\"),\n inputSchema: z.object({}),\n execute: async () => {\n const me = await client.getMe();\n return {\n account_id: me.id,\n email: me.email,\n nickname: me.nickname,\n country_id: me.country_id,\n site_id: me.site_id,\n user_type: me.user_type,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Saved-card charging (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n charge_saved_card: tool({\n description: desc(\"charge_saved_card\"),\n inputSchema: z.object({\n customer_id: z.string().describe(\"MP customer id (from create_customer / find_customer_by_email)\"),\n card_id: z.string().describe(\"Saved card id (from list_customer_cards)\"),\n security_code: z.string().regex(/^\\d{3,4}$/).describe(\"CVV — 3 digits (Visa/Master) or 4 (Amex). User must provide this each charge in AR.\"),\n amount_ars: z.number().positive(),\n description: z.string().min(1).max(255),\n installments: z.number().int().min(1).max(24).optional().describe(\"Default 1. Use calculate_installments first to pick a valid count.\"),\n external_reference: z.string().optional(),\n statement_descriptor: z.string().max(13).optional(),\n }),\n execute: async (input) => {\n const payment = await client.chargeSavedCard({\n customerId: input.customer_id,\n cardId: input.card_id,\n securityCode: input.security_code,\n amount: input.amount_ars,\n description: input.description,\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n idempotencyKey: deterministicIdempotencyKey(\n \"charge_saved_card\",\n input.card_id,\n input.amount_ars,\n input.external_reference,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n customer_id: input.customer_id,\n card_id: input.card_id,\n external_reference: payment.external_reference,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // QR in-store (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_qr_payment: tool({\n description: desc(\"create_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string().describe(\"Pre-configured POS external_id from MP dashboard. Required.\"),\n amount_ars: z.number().positive(),\n title: z.string().min(1).max(80).describe(\"Display title shown when scanning\"),\n description: z.string().max(255).optional(),\n external_reference: z.string().optional(),\n notification_url: z.string().url().optional().describe(\"Webhook URL — falls back to dashboard config if omitted\"),\n expires_in_seconds: z.number().int().min(60).max(3600).optional().describe(\"Default 600 (10 min)\"),\n }),\n execute: async (input) => {\n // Lazy-load qrcode to keep cold-start lean for users who don't use QR\n const QRCode = (await import(\"qrcode\")).default;\n const me = await client.getMe();\n const userId = String(me.id);\n const expiresAt = new Date(\n Date.now() + (input.expires_in_seconds ?? 600) * 1000,\n ).toISOString();\n\n const qr = await client.createQrPayment(userId, {\n externalPosId: input.external_pos_id,\n totalAmount: input.amount_ars,\n title: input.title,\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.notification_url !== undefined ? { notificationUrl: input.notification_url } : {}),\n expirationDate: expiresAt,\n });\n\n const qrDataUrl = await QRCode.toDataURL(qr.qr_data, {\n errorCorrectionLevel: \"M\",\n margin: 1,\n width: 512,\n });\n\n return {\n in_store_order_id: qr.in_store_order_id,\n qr_data: qr.qr_data,\n qr_data_url: qrDataUrl,\n expires_at: expiresAt,\n external_pos_id: input.external_pos_id,\n amount: input.amount_ars,\n next_step:\n \"Display the qr_data_url image to the buyer. Wait for the payment webhook (point_integration_wh fires first, then payment topic). If buyer doesn't scan in time, call cancel_qr_payment to free the POS.\",\n };\n },\n }),\n\n cancel_qr_payment: tool({\n description: desc(\"cancel_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string(),\n }),\n execute: async ({ external_pos_id }) => {\n const me = await client.getMe();\n await client.cancelQrPayment(String(me.id), external_pos_id);\n return { external_pos_id, cancelled: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Subscription Plans (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_subscription_plan: tool({\n description: desc(\"create_subscription_plan\"),\n inputSchema: z.object({\n reason: z.string().min(3).max(120).describe(\"Plan name shown at checkout\"),\n amount_ars: z.number().positive(),\n frequency_months: z.number().int().min(1).max(12),\n back_url: z.string().url().describe(\"HTTPS URL where MP redirects after first payment\"),\n external_reference: z.string().optional(),\n free_trial_days: z.number().int().min(1).max(60).optional().describe(\"Free trial period in days before first charge\"),\n }),\n execute: async (input) => {\n const plan = await client.createSubscriptionPlan({\n reason: input.reason,\n amount: input.amount_ars,\n currency: \"ARS\",\n frequency: input.frequency_months,\n frequencyType: \"months\",\n backUrl: input.back_url,\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.free_trial_days !== undefined ? { freeTrialFrequency: input.free_trial_days, freeTrialFrequencyType: \"days\" as const } : {}),\n });\n return {\n plan_id: plan.id,\n status: plan.status,\n reason: plan.reason,\n amount: plan.auto_recurring.transaction_amount,\n currency: plan.auto_recurring.currency_id,\n frequency: `${plan.auto_recurring.frequency} ${plan.auto_recurring.frequency_type}`,\n external_reference: plan.external_reference,\n next_step: \"Use subscribe_to_plan to enroll customers in this plan, or share its ID for them to subscribe via your frontend.\",\n };\n },\n }),\n\n list_subscription_plans: tool({\n description: desc(\"list_subscription_plans\"),\n inputSchema: z.object({\n status: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listSubscriptionPlans({\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n plans: result.results.map((p) => ({\n plan_id: p.id,\n reason: p.reason,\n status: p.status,\n amount: p.auto_recurring.transaction_amount,\n currency: p.auto_recurring.currency_id,\n frequency: `${p.auto_recurring.frequency} ${p.auto_recurring.frequency_type}`,\n })),\n };\n },\n }),\n\n update_subscription_plan: tool({\n description: desc(\"update_subscription_plan\"),\n inputSchema: z.object({\n plan_id: z.string(),\n reason: z.string().optional(),\n amount_ars: z.number().positive().optional(),\n status: z.enum([\"active\", \"cancelled\"]).optional(),\n back_url: z.string().url().optional(),\n }),\n execute: async (input) => {\n const updated = await client.updateSubscriptionPlan(input.plan_id, {\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(input.amount_ars !== undefined ? { amount: input.amount_ars } : {}),\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.back_url !== undefined ? { backUrl: input.back_url } : {}),\n });\n return {\n plan_id: updated.id,\n status: updated.status,\n reason: updated.reason,\n amount: updated.auto_recurring.transaction_amount,\n message: input.amount_ars !== undefined\n ? \"Updated. Existing subscribers keep their old amount; only NEW subscribers get the new pricing.\"\n : \"Plan updated.\",\n };\n },\n }),\n\n subscribe_to_plan: tool({\n description: desc(\"subscribe_to_plan\"),\n inputSchema: z.object({\n plan_id: z.string(),\n customer_email: z.string().email(),\n external_reference: z.string().optional(),\n }),\n execute: async (input) => {\n const sub = await client.subscribeToPlan({\n planId: input.plan_id,\n payerEmail: input.customer_email,\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n });\n return {\n subscription_id: sub.id,\n status: sub.status,\n payer_email: sub.payer_email,\n init_point_url: sub.init_point,\n next_step: \"Send init_point_url to the customer for first payment with card+CVV.\",\n };\n },\n }),\n\n list_subscription_payments: tool({\n description: desc(\"list_subscription_payments\"),\n inputSchema: z.object({\n subscription_id: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listSubscriptionPayments(input.subscription_id, {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n subscription_id: input.subscription_id,\n total: result.paging.total,\n payments: result.results.map((p) => ({\n authorized_payment_id: p.id,\n payment_id: p.payment_id ?? null,\n status: p.status,\n amount: p.transaction_amount ?? null,\n currency: p.currency_id ?? null,\n debit_date: p.debit_date ?? null,\n next_retry_date: p.next_retry_date ?? null,\n retry_attempt: p.retry_attempt ?? 0,\n reason: p.reason ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Stores + POS (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_store: tool({\n description: desc(\"create_store\"),\n inputSchema: z.object({\n name: z.string().min(1).max(80),\n external_id: z.string().min(1).max(64).describe(\"Unique within the seller's stores\"),\n address_line: z.string().optional(),\n city_name: z.string().optional(),\n state_name: z.string().optional(),\n }),\n execute: async (input) => {\n const me = await client.getMe();\n const store = await client.createStore(String(me.id), {\n name: input.name,\n externalId: input.external_id,\n ...(input.address_line || input.city_name || input.state_name\n ? {\n location: {\n ...(input.address_line ? { addressLine: input.address_line } : {}),\n ...(input.city_name ? { cityName: input.city_name } : {}),\n ...(input.state_name ? { stateName: input.state_name } : {}),\n countryId: \"AR\",\n },\n }\n : {}),\n });\n return {\n store_id: store.id,\n name: store.name,\n external_id: store.external_id,\n next_step: \"Use create_pos with this store_id to add a Point of Sale where create_qr_payment can issue QRs.\",\n };\n },\n }),\n\n list_stores: tool({\n description: desc(\"list_stores\"),\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const me = await client.getMe();\n const result = await client.listStores(String(me.id), {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n stores: result.results.map((s) => ({\n store_id: s.id,\n name: s.name ?? null,\n external_id: s.external_id ?? null,\n })),\n };\n },\n }),\n\n create_pos: tool({\n description: desc(\"create_pos\"),\n inputSchema: z.object({\n name: z.string().min(1).max(80),\n external_id: z.string().min(1).max(64).describe(\"Unique within the store. This is what create_qr_payment uses.\"),\n store_id: z.string().describe(\"From create_store / list_stores\"),\n category: z.number().int().optional().describe(\"MP category code, default 621102 (other food/beverage)\"),\n fixed_amount: z.boolean().optional().describe(\"True for static QR with fixed amount; false (default) for dynamic per-order QR\"),\n }),\n execute: async (input) => {\n const pos = await client.createPos({\n name: input.name,\n externalId: input.external_id,\n storeId: input.store_id,\n ...(input.category !== undefined ? { category: input.category } : {}),\n ...(input.fixed_amount !== undefined ? { fixedAmount: input.fixed_amount } : {}),\n });\n return {\n pos_id: pos.id,\n external_id: pos.external_id,\n store_id: pos.store_id,\n name: pos.name,\n next_step: \"Use create_qr_payment with this external_id to start issuing dynamic QRs from this POS.\",\n };\n },\n }),\n\n list_pos: tool({\n description: desc(\"list_pos\"),\n inputSchema: z.object({\n store_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listPos({\n ...(input.store_id !== undefined ? { storeId: input.store_id } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n pos: result.results.map((p) => ({\n pos_id: p.id,\n external_id: p.external_id ?? null,\n store_id: p.store_id ?? null,\n name: p.name ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disputes (v0.4 — read-only)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_payment_disputes: tool({\n description: desc(\"list_payment_disputes\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const disputes = await client.listPaymentDisputes(payment_id);\n return {\n payment_id,\n count: disputes.length,\n disputes: disputes.map((d) => ({\n dispute_id: d.id,\n status: d.status,\n amount: d.amount ?? null,\n reason: d.reason ?? null,\n date_created: d.date_created ?? null,\n dashboard_url: `https://www.mercadopago.com.ar/disputes/${d.id}`,\n })),\n };\n },\n }),\n\n get_dispute: tool({\n description: desc(\"get_dispute\"),\n inputSchema: z.object({\n payment_id: z.string(),\n dispute_id: z.string(),\n }),\n execute: async ({ payment_id, dispute_id }) => {\n const d = await client.getDispute(payment_id, dispute_id);\n return {\n dispute_id: d.id,\n status: d.status,\n amount: d.amount ?? null,\n reason: d.reason ?? null,\n reason_description: d.reason_description ?? null,\n resolution: d.resolution ?? null,\n date_created: d.date_created ?? null,\n dashboard_url: `https://www.mercadopago.com.ar/disputes/${d.id}`,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lookup helpers (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_identification_types: tool({\n description: desc(\"list_identification_types\"),\n inputSchema: z.object({}),\n execute: async () => {\n const types = await client.listIdentificationTypes();\n return {\n count: types.length,\n types: types.map((t) => ({\n id: t.id,\n name: t.name,\n type: t.type,\n min_length: t.min_length ?? null,\n max_length: t.max_length ?? null,\n })),\n };\n },\n }),\n\n list_issuers: tool({\n description: desc(\"list_issuers\"),\n inputSchema: z.object({\n payment_method_id: z.string().describe(\"E.g. 'visa', 'master', 'naranja'\"),\n bin: z.string().min(6).max(8).optional().describe(\"First 6-8 digits of card for precise issuer detection\"),\n }),\n execute: async (input) => {\n const issuers = await client.listIssuers({\n paymentMethodId: input.payment_method_id,\n ...(input.bin !== undefined ? { bin: input.bin } : {}),\n });\n return {\n payment_method_id: input.payment_method_id,\n count: issuers.length,\n issuers: issuers.map((i) => ({\n issuer_id: i.id,\n name: i.name,\n status: i.status ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Webhooks management (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_webhooks: tool({\n description: desc(\"list_webhooks\"),\n inputSchema: z.object({}),\n execute: async () => {\n const hooks = await client.listWebhooks();\n return {\n count: hooks.length,\n webhooks: hooks.map((h) => ({\n webhook_id: h.id,\n url: h.url ?? null,\n topic: h.topic ?? null,\n status: h.status ?? null,\n date_created: h.date_created ?? null,\n })),\n };\n },\n }),\n\n create_webhook: tool({\n description: desc(\"create_webhook\"),\n inputSchema: z.object({\n url: z.string().url(),\n topic: z.string().describe(\"E.g. 'payment', 'subscription_authorized_payment', 'subscription_preapproval', 'merchant_order', 'point_integration_wh'\"),\n }),\n execute: async ({ url, topic }) => {\n const hook = await client.createWebhook({ url, topic });\n return {\n webhook_id: hook.id,\n url: hook.url ?? url,\n topic: hook.topic ?? topic,\n status: hook.status ?? null,\n };\n },\n }),\n\n update_webhook: tool({\n description: desc(\"update_webhook\"),\n inputSchema: z.object({\n webhook_id: z.string(),\n url: z.string().url().optional(),\n topic: z.string().optional(),\n }),\n execute: async (input) => {\n const hook = await client.updateWebhook(input.webhook_id, {\n ...(input.url !== undefined ? { url: input.url } : {}),\n ...(input.topic !== undefined ? { topic: input.topic } : {}),\n });\n return {\n webhook_id: hook.id,\n url: hook.url ?? null,\n topic: hook.topic ?? null,\n status: hook.status ?? null,\n };\n },\n }),\n\n delete_webhook: tool({\n description: desc(\"delete_webhook\"),\n inputSchema: z.object({ webhook_id: z.string() }),\n execute: async ({ webhook_id }) => {\n await client.deleteWebhook(webhook_id);\n return { webhook_id, deleted: true };\n },\n }),\n } satisfies ToolSet;\n}\n","/**\n * In-memory record of a subscription. The lib persists the MP-side fields\n * needed to reason about a subscription without hitting the API every time\n * (status, last webhook info, customer email, etc.) plus a free-form metadata\n * bag for callers to attach business context (tenant id, plan name, etc.).\n */\nexport interface SubscriptionStateRecord {\n status?: string;\n payerEmail?: string;\n amount?: number;\n currency?: string;\n frequency?: number;\n frequencyType?: string;\n initPoint?: string;\n externalReference?: string;\n createdAt?: string;\n cancelledAt?: string;\n lastWebhookStatus?: string;\n lastWebhookAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Persistence surface for subscription state. Implementations may back this\n * with Upstash Redis, Vercel KV, Postgres, in-memory, or anything that\n * supports the three operations. The default `InMemoryStateAdapter` is\n * provided for tests and trivial single-process deployments; production\n * setups should plug in a durable store.\n */\nexport interface SubscriptionStateAdapter {\n set(id: string, state: Partial<SubscriptionStateRecord>): Promise<void>;\n get(id: string): Promise<SubscriptionStateRecord | null>;\n list?(): Promise<string[]>;\n}\n\n/**\n * Volatile, single-process state adapter. Useful for tests and demos. Do not\n * use in production: state is lost on restart and is not safe across tenants.\n */\nexport class InMemoryStateAdapter implements SubscriptionStateAdapter {\n private readonly store = new Map<string, SubscriptionStateRecord>();\n\n async set(\n id: string,\n state: Partial<SubscriptionStateRecord>,\n ): Promise<void> {\n const existing = this.store.get(id) ?? {};\n this.store.set(id, { ...existing, ...state });\n }\n\n async get(id: string): Promise<SubscriptionStateRecord | null> {\n return this.store.get(id) ?? null;\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.store.keys());\n }\n\n /** Test helper: drop everything. Not part of the adapter interface. */\n reset(): void {\n this.store.clear();\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Site IDs supported by Mercado Pago. The lib targets MLA (Argentina) primarily;\n * other LATAM sites may work for the read paths but the full Subscriptions flow\n * is only verified against MLA.\n */\nexport const SiteIdSchema = z.enum([\"MLA\", \"MLB\", \"MLM\", \"MCO\", \"MLC\", \"MLU\"]);\nexport type SiteId = z.infer<typeof SiteIdSchema>;\n\n/**\n * Currency identifiers MP exposes. ARS is the supported case for v0.1.\n */\nexport const CurrencyIdSchema = z.enum([\"ARS\", \"USD\", \"BRL\", \"MXN\"]);\nexport type CurrencyId = z.infer<typeof CurrencyIdSchema>;\n\n/**\n * Recurrence frequency unit for a subscription's auto_recurring config.\n */\nexport const FrequencyTypeSchema = z.enum([\"months\", \"days\"]);\nexport type FrequencyType = z.infer<typeof FrequencyTypeSchema>;\n\n/**\n * Lifecycle states a Mercado Pago preapproval can be in. The string is the\n * canonical MP value; we widen to `string` for forward compatibility because\n * MP has historically introduced new states without notice.\n */\nexport const PreapprovalStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"authorized\"),\n z.literal(\"paused\"),\n z.literal(\"cancelled\"),\n z.string(),\n]);\nexport type PreapprovalStatus = z.infer<typeof PreapprovalStatusSchema>;\n\nexport const AutoRecurringSchema = z.object({\n frequency: z.number().int().positive(),\n frequency_type: FrequencyTypeSchema,\n transaction_amount: z.number().positive(),\n currency_id: CurrencyIdSchema,\n start_date: z.string().optional(),\n end_date: z.string().optional(),\n});\nexport type AutoRecurring = z.infer<typeof AutoRecurringSchema>;\n\nexport const PreapprovalSchema = z.object({\n id: z.string(),\n status: PreapprovalStatusSchema,\n payer_email: z.string(),\n init_point: z.string().url(),\n external_reference: z.string().optional(),\n date_created: z.string(),\n last_modified: z.string(),\n next_payment_date: z.string().optional(),\n payer_id: z.union([z.string(), z.number()]).optional(),\n auto_recurring: AutoRecurringSchema,\n});\nexport type Preapproval = z.infer<typeof PreapprovalSchema>;\n\n/**\n * Input for creating a preapproval (subscription). Internal field names match\n * MP API semantics; the public client method maps from camelCase Naza-friendly\n * params to the snake_case payload MP expects.\n */\nexport interface CreatePreapprovalParams {\n /** Short customer-facing description shown at checkout. */\n reason: string;\n /** Email of the buyer. Cannot equal the seller account's email (MP rejects). */\n payerEmail: string;\n /** Recurring amount per cycle. */\n amount: number;\n /** ARS for Argentina. Other currencies depend on the seller account's site. */\n currency: CurrencyId;\n /** Recurrence frequency (e.g., 1 + months = monthly). */\n frequency: number;\n frequencyType: FrequencyType;\n /** HTTPS URL where MP redirects the buyer after first payment. localhost rejected. */\n backUrl: string;\n /** Optional client-side identifier for the subscription. */\n externalReference?: string;\n}\n\n/**\n * The shape of an MP webhook notification body for `topic=preapproval`. MP's\n * webhook payload varies by event type; this is the union of fields seen in\n * production.\n */\nexport const WebhookBodySchema = z\n .object({\n type: z.string().optional(),\n topic: z.string().optional(),\n action: z.string().optional(),\n data: z.object({ id: z.union([z.string(), z.number()]) }).optional(),\n resource: z.string().optional(),\n user_id: z.union([z.string(), z.number()]).optional(),\n api_version: z.string().optional(),\n date_created: z.string().optional(),\n id: z.union([z.string(), z.number()]).optional(),\n live_mode: z.boolean().optional(),\n })\n .passthrough();\nexport type WebhookBody = z.infer<typeof WebhookBodySchema>;\n\n/**\n * Normalized webhook event after parsing. The library extracts topic + dataId\n * from either query params or body, since MP sends them in either location\n * depending on integration version.\n */\nexport interface ParsedWebhookEvent {\n /** Topic of the event, e.g., \"preapproval\", \"payment\", \"subscription_authorized_payment\". */\n topic: string;\n /** ID of the affected resource. */\n dataId: string;\n /** Action descriptor when present (e.g., \"updated\", \"created\"). */\n action: string | null;\n /** Raw body MP sent, for caller inspection / debugging. */\n raw: WebhookBody;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payments (v0.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Top-level lifecycle status of a payment. MP-canonical values; widened to\n * string for forward compatibility.\n */\nexport const PaymentStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"approved\"),\n z.literal(\"authorized\"),\n z.literal(\"in_process\"),\n z.literal(\"in_mediation\"),\n z.literal(\"rejected\"),\n z.literal(\"cancelled\"),\n z.literal(\"refunded\"),\n z.literal(\"charged_back\"),\n z.string(),\n]);\nexport type PaymentStatus = z.infer<typeof PaymentStatusSchema>;\n\n/** Status detail — finer granularity inside a status (e.g., why rejected). */\nexport type PaymentStatusDetail = string;\n\n/**\n * The full Payment object MP returns. Many fields are optional because they\n * vary by payment method, status, and integration mode (Checkout Pro vs API).\n */\nexport const PaymentSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: PaymentStatusSchema,\n status_detail: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n date_approved: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n transaction_amount: z.number(),\n currency_id: z.string(),\n installments: z.number().int().nullable().optional(),\n payment_method_id: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n external_reference: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n payer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n email: z.string().nullable().optional(),\n identification: z\n .object({\n type: z.string().nullable().optional(),\n number: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n })\n .passthrough()\n .optional(),\n transaction_details: z\n .object({\n net_received_amount: z.number().nullable().optional(),\n total_paid_amount: z.number().nullable().optional(),\n installment_amount: z.number().nullable().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Payment = z.infer<typeof PaymentSchema>;\n\n/** Params for creating a payment (Checkout API / transparent flow). */\nexport interface CreatePaymentParams {\n /** Amount in account currency. ARS for Argentina. */\n transactionAmount: number;\n /** Number of installments. Use 1 for no cuotas; AR cards typically allow up to 12. */\n installments?: number;\n /** MP payment_method_id — `visa`, `master`, `naranja`, `account_money`, etc. */\n paymentMethodId: string;\n /** Payer email — REQUIRED. Cannot equal seller email. */\n payerEmail: string;\n /** Card token from MP frontend SDK (Cardform). Required for credit/debit; omit for `account_money` etc. */\n token?: string;\n /** Description shown in payer's MP statement. */\n description?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** Optional payer identification (DNI/CUIT) — required for some payment types. */\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n /** Webhook override URL. Falls back to dashboard config if omitted. */\n notificationUrl?: string;\n /** AFIP/ARCA discount/fee/tax additions. Used to discriminate IVA, marketplace fees, etc. */\n additionalInfo?: {\n items?: Array<{\n id?: string;\n title: string;\n quantity: number;\n unit_price: number;\n description?: string;\n }>;\n };\n /** Statement descriptor — what shows on the buyer's card statement. Max 13 chars. */\n statementDescriptor?: string;\n /** When true, capture is deferred (only for credit cards) — useful for hold flows. */\n capture?: boolean;\n /** Idempotency key — pass the same value on retries to dedupe. Required for non-GET. */\n idempotencyKey?: string;\n}\n\nexport interface SearchPaymentsParams {\n /** Filter by external_reference (your-system id). */\n externalReference?: string;\n /** Filter by payment status. */\n status?: PaymentStatus;\n /** Filter by payer email. */\n payerEmail?: string;\n /** Date range for date_created (ISO 8601). */\n beginDate?: string;\n endDate?: string;\n /** Result page (default 0). */\n offset?: number;\n /** Page size (default 30, max 100). */\n limit?: number;\n /** Sort: e.g. \"date_created\" desc. */\n sort?: string;\n criteria?: \"asc\" | \"desc\";\n}\n\nexport const PaymentsSearchResultSchema = z.object({\n paging: z.object({\n total: z.number(),\n limit: z.number(),\n offset: z.number(),\n }),\n results: z.array(PaymentSchema),\n});\nexport type PaymentsSearchResult = z.infer<typeof PaymentsSearchResultSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Refunds\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const RefundSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n payment_id: z.union([z.string(), z.number()]).transform(String),\n amount: z.number(),\n source: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n}).passthrough();\nexport type Refund = z.infer<typeof RefundSchema>;\n\nexport interface CreateRefundParams {\n paymentId: string;\n /** Partial refund amount. Omit for full refund. */\n amount?: number;\n /** Idempotency key — required for retry-safety. */\n idempotencyKey?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Checkout Pro (Preferences)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PreferenceItemSchema = z.object({\n id: z.string().optional(),\n title: z.string(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n category_id: z.string().optional(),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n currency_id: CurrencyIdSchema.optional(),\n});\nexport type PreferenceItem = z.infer<typeof PreferenceItemSchema>;\n\nexport const PreferenceSchema = z.object({\n id: z.string(),\n init_point: z.string().url().optional(),\n sandbox_init_point: z.string().url().optional(),\n client_id: z.union([z.string(), z.number()]).optional(),\n collector_id: z.union([z.string(), z.number()]).optional(),\n items: z.array(PreferenceItemSchema).optional(),\n external_reference: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n expires: z.boolean().optional(),\n expiration_date_from: z.string().nullable().optional(),\n expiration_date_to: z.string().nullable().optional(),\n}).passthrough();\nexport type Preference = z.infer<typeof PreferenceSchema>;\n\nexport interface CreatePreferenceParams {\n items: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n currency_id?: CurrencyId;\n description?: string;\n picture_url?: string;\n }>;\n payer?: {\n name?: string;\n surname?: string;\n email?: string;\n phone?: { area_code?: string; number?: string };\n identification?: { type: string; number: string };\n address?: { street_name?: string; street_number?: number; zip_code?: string };\n };\n /** Where to send the buyer after success/failure/pending. */\n backUrls?: { success?: string; failure?: string; pending?: string };\n /** \"approved\" → auto-redirect on success; \"all\" → always; \"\" → never. */\n autoReturn?: \"approved\" | \"all\";\n /** Webhook URL. */\n notificationUrl?: string;\n /** Your-system id for correlation. */\n externalReference?: string;\n /** Max installments offered. Defaults to MP account config. */\n paymentMethods?: {\n excluded_payment_types?: Array<{ id: string }>;\n excluded_payment_methods?: Array<{ id: string }>;\n installments?: number;\n default_installments?: number;\n };\n /** Statement descriptor — shows on buyer's card statement. */\n statementDescriptor?: string;\n /** Expiration window for the link itself. */\n expires?: boolean;\n expirationDateFrom?: string;\n expirationDateTo?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Customers + Saved Cards\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CustomerSchema = z.object({\n id: z.string(),\n email: z.string(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z\n .object({ area_code: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n identification: z\n .object({ type: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n}).passthrough();\nexport type Customer = z.infer<typeof CustomerSchema>;\n\nexport const CustomerCardSchema = z.object({\n id: z.string(),\n customer_id: z.string(),\n expiration_month: z.number().int().nullable().optional(),\n expiration_year: z.number().int().nullable().optional(),\n first_six_digits: z.string().nullable().optional(),\n last_four_digits: z.string().nullable().optional(),\n payment_method: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n}).passthrough();\nexport type CustomerCard = z.infer<typeof CustomerCardSchema>;\n\nexport interface CreateCustomerParams {\n email: string;\n firstName?: string;\n lastName?: string;\n phone?: { areaCode?: string; number?: string };\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n description?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payment Methods + Installments\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PaymentMethodSchema = z.object({\n id: z.string(),\n name: z.string(),\n payment_type_id: z.string(),\n status: z.string(),\n thumbnail: z.string().nullable().optional(),\n secure_thumbnail: z.string().nullable().optional(),\n min_allowed_amount: z.number().nullable().optional(),\n max_allowed_amount: z.number().nullable().optional(),\n}).passthrough();\nexport type PaymentMethod = z.infer<typeof PaymentMethodSchema>;\n\nexport const InstallmentOfferSchema = z.object({\n payment_method_id: z.string(),\n payment_type_id: z.string(),\n issuer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n name: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n payer_costs: z.array(\n z.object({\n installments: z.number().int(),\n installment_rate: z.number(),\n discount_rate: z.number().nullable().optional(),\n installment_amount: z.number(),\n total_amount: z.number(),\n recommended_message: z.string().nullable().optional(),\n }).passthrough(),\n ),\n}).passthrough();\nexport type InstallmentOffer = z.infer<typeof InstallmentOfferSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Account\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─────────────────────────────────────────────────────────────────────────────\n// QR (in-store dynamic)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const QrOrderSchema = z.object({\n in_store_order_id: z.string(),\n qr_data: z.string(),\n}).passthrough();\nexport type QrOrder = z.infer<typeof QrOrderSchema>;\n\nexport interface CreateQrPaymentParams {\n /** Pre-configured POS external_id from MP dashboard. Required. */\n externalPosId: string;\n /** Total amount in ARS. */\n totalAmount: number;\n /** Display title shown to the buyer when scanning. */\n title: string;\n description?: string;\n /** Webhook URL — MP fires `point_integration_wh` then `payment` topic. */\n notificationUrl?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** ISO 8601 expiration (default 10 min from now). */\n expirationDate?: string;\n /** Itemized line items (optional but improves analytics). */\n items?: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n unit_measure?: string;\n total_amount?: number;\n }>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Card tokens (for charge_saved_card)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CardTokenSchema = z.object({\n id: z.string(),\n status: z.string().optional(),\n date_due: z.string().optional(),\n card_id: z.string().optional(),\n cardholder: z.unknown().optional(),\n}).passthrough();\nexport type CardToken = z.infer<typeof CardTokenSchema>;\n\nexport interface CreateCardTokenParams {\n /** Saved card id (from list_customer_cards). */\n cardId: string;\n /** Customer that owns the card. */\n customerId: string;\n /** CVV — required for AR; MP doesn't store CVV. */\n securityCode: string;\n}\n\nexport const AccountInfoSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n email: z.string().nullable().optional(),\n nickname: z.string().nullable().optional(),\n country_id: z.string().nullable().optional(),\n site_id: z.string().nullable().optional(),\n user_type: z.string().nullable().optional(),\n status: z\n .object({ user_type: z.string().nullable().optional() })\n .passthrough()\n .nullable()\n .optional(),\n}).passthrough();\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Subscription Plans (preapproval_plan — reusable plan definitions)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A reusable subscription plan. Different from a per-customer subscription:\n * a plan defines the price + frequency once, then customers subscribe to it\n * via `subscribe_to_plan` (which creates a preapproval pointing at the plan).\n *\n * Use plans for SaaS-style billing where you have a fixed set of tiers\n * (Básico/Pro/Enterprise) instead of negotiating amounts per customer.\n */\nexport const SubscriptionPlanSchema = z.object({\n id: z.string(),\n status: z.string(),\n reason: z.string(),\n back_url: z.string().url().optional(),\n external_reference: z.string().nullable().optional(),\n date_created: z.string(),\n last_modified: z.string(),\n auto_recurring: AutoRecurringSchema,\n}).passthrough();\nexport type SubscriptionPlan = z.infer<typeof SubscriptionPlanSchema>;\n\nexport interface CreateSubscriptionPlanParams {\n /** Customer-facing plan name shown at checkout. */\n reason: string;\n /** Where MP redirects buyer after first payment. HTTPS only. */\n backUrl: string;\n /** Recurrence (e.g., 1 + months = monthly). */\n frequency: number;\n frequencyType: FrequencyType;\n /** Amount per cycle. */\n amount: number;\n /** ARS for AR. */\n currency: CurrencyId;\n /** Optional plan-level identifier from your system. */\n externalReference?: string;\n /** Free trial days before first charge. */\n freeTrialFrequency?: number;\n freeTrialFrequencyType?: FrequencyType;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stores + POS (for QR payments setup)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const StoreSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string().optional(),\n external_id: z.string().optional(),\n date_creation: z.string().optional(),\n location: z\n .object({\n address_line: z.string().optional(),\n city_name: z.string().optional(),\n state_name: z.string().optional(),\n country_id: z.string().optional(),\n latitude: z.number().optional(),\n longitude: z.number().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Store = z.infer<typeof StoreSchema>;\n\nexport interface CreateStoreParams {\n /** Display name for the store. */\n name: string;\n /** Caller-defined identifier (must be unique within the seller's stores). */\n externalId: string;\n /** Optional physical location. */\n location?: {\n addressLine?: string;\n cityName?: string;\n stateName?: string;\n countryId?: string;\n latitude?: number;\n longitude?: number;\n };\n}\n\nexport const PosSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string().optional(),\n external_id: z.string().optional(),\n store_id: z.union([z.string(), z.number()]).optional(),\n category: z.number().int().optional(),\n fixed_amount: z.boolean().optional(),\n qr: z\n .object({\n template_image: z.string().optional(),\n image: z.string().optional(),\n })\n .passthrough()\n .optional(),\n date_creation: z.string().optional(),\n}).passthrough();\nexport type Pos = z.infer<typeof PosSchema>;\n\nexport interface CreatePosParams {\n /** Display name. */\n name: string;\n /** Caller-defined POS id (used in QR endpoints; unique within store). */\n externalId: string;\n /** Parent store id (number from createStore). */\n storeId: string | number;\n /** MP category code (default 621102 = Other Food and Beverage Services). */\n category?: number;\n /** If true, the QR has a fixed amount; if false, dynamic per-order. */\n fixedAmount?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Disputes / Chargebacks (read-only)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const DisputeSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: z.string(),\n resource: z.string().optional(),\n resource_id: z.union([z.string(), z.number()]).optional(),\n amount: z.number().optional(),\n date_created: z.string().optional(),\n reason: z.string().optional(),\n resolution: z\n .object({\n reason: z.string().optional(),\n result: z.string().optional(),\n date: z.string().optional(),\n })\n .passthrough()\n .optional(),\n /** Documents the buyer / seller submitted as evidence. */\n documents: z.array(z.unknown()).optional(),\n /** Buyer's stated complaint. */\n reason_description: z.string().optional(),\n}).passthrough();\nexport type Dispute = z.infer<typeof DisputeSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Subscription Payment History (authorized_payments under a preapproval)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const SubscriptionPaymentSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n preapproval_id: z.string().optional(),\n status: z.string(),\n payment_id: z.union([z.string(), z.number()]).nullable().optional(),\n transaction_amount: z.number().optional(),\n currency_id: z.string().optional(),\n date_created: z.string().optional(),\n debit_date: z.string().optional(),\n next_retry_date: z.string().nullable().optional(),\n retry_attempt: z.number().optional(),\n reason: z.string().optional(),\n}).passthrough();\nexport type SubscriptionPayment = z.infer<typeof SubscriptionPaymentSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Identification Types + Issuers (lookup helpers)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const IdentificationTypeSchema = z.object({\n id: z.string(),\n name: z.string(),\n type: z.string(),\n min_length: z.number().optional(),\n max_length: z.number().optional(),\n}).passthrough();\nexport type IdentificationType = z.infer<typeof IdentificationTypeSchema>;\n\nexport const IssuerSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string(),\n secure_thumbnail: z.string().nullable().optional(),\n thumbnail: z.string().nullable().optional(),\n processing_mode: z.string().optional(),\n status: z.string().optional(),\n}).passthrough();\nexport type Issuer = z.infer<typeof IssuerSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Webhooks (configure subscriptions to topics)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Topics MP can fire webhooks for. Add more as MP exposes them. */\nexport const WebhookTopicSchema = z.enum([\n \"payment\",\n \"subscription_authorized_payment\",\n \"subscription_preapproval\",\n \"merchant_order\",\n \"point_integration_wh\",\n \"stop_delivery_op_wh\",\n]);\nexport type WebhookTopic = z.infer<typeof WebhookTopicSchema>;\n\nexport const WebhookConfigSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n url: z.string().url().optional(),\n status: z.string().optional(),\n topic: z.string().optional(),\n date_created: z.string().optional(),\n date_modified: z.string().optional(),\n}).passthrough();\nexport type WebhookConfig = z.infer<typeof WebhookConfigSchema>;\n\nexport interface CreateWebhookParams {\n url: string;\n /** Topic to subscribe to. */\n topic: WebhookTopic | string;\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookBodySchema, type ParsedWebhookEvent } from \"./types\";\n\n/**\n * Parse a Mercado Pago webhook from the raw request body and URL search params.\n * MP sends the topic and resource id in EITHER the URL query string OR the\n * body, depending on integration version — this normalizes both shapes into a\n * single structure.\n *\n * @example\n * ```ts\n * export async function POST(req: Request) {\n * const body = await req.json().catch(() => ({}));\n * const event = parseWebhookEvent(body, new URL(req.url).searchParams);\n * if (event && event.topic === 'preapproval') {\n * // refresh status from MP, update your store\n * }\n * return Response.json({ received: true });\n * }\n * ```\n */\nexport function parseWebhookEvent(\n body: unknown,\n searchParams?: URLSearchParams,\n): ParsedWebhookEvent | null {\n const parseResult = WebhookBodySchema.safeParse(body ?? {});\n const parsedBody = parseResult.success ? parseResult.data : {};\n\n const topic =\n searchParams?.get(\"topic\") ??\n parsedBody.topic ??\n parsedBody.type ??\n null;\n\n const dataId =\n searchParams?.get(\"id\") ??\n (parsedBody.data?.id !== undefined ? String(parsedBody.data.id) : null) ??\n parsedBody.resource ??\n null;\n\n if (!topic || !dataId) {\n return null;\n }\n\n return {\n topic,\n dataId: String(dataId),\n action: parsedBody.action ?? null,\n raw: parsedBody,\n };\n}\n\n/**\n * Verify the HMAC-SHA256 signature MP sends in the `x-signature` header for\n * webhook authenticity. Returns true if the signature matches the expected\n * value derived from the integration's secret key.\n *\n * @param requestId The value of the `x-request-id` request header.\n * @param dataId The id of the resource the webhook is about (from query or body).\n * @param signatureHeader The full `x-signature` header value MP sent.\n * @param secret Your integration's webhook secret (configured in MP dev panel).\n *\n * @remarks\n * MP's `x-signature` header has the form: `ts=NNNNNNNN,v1=HEXSIGNATURE`. We\n * extract the timestamp and the v1 signature, then compute\n * `HMAC-SHA256(secret, \"id:${dataId};request-id:${requestId};ts:${ts};\")`\n * and compare with constant-time equality.\n */\nexport function verifyWebhookSignature(params: {\n requestId: string | null;\n dataId: string;\n signatureHeader: string | null;\n secret: string;\n}): boolean {\n if (!params.signatureHeader || !params.requestId) return false;\n\n // Parse \"ts=...,v1=...\" into a map.\n const parts = Object.fromEntries(\n params.signatureHeader\n .split(\",\")\n .map((segment) => segment.trim().split(\"=\") as [string, string]),\n );\n const ts = parts.ts;\n const v1 = parts.v1;\n if (!ts || !v1) return false;\n\n const manifest = `id:${params.dataId};request-id:${params.requestId};ts:${ts};`;\n const expected = createHmac(\"sha256\", params.secret)\n .update(manifest)\n .digest(\"hex\");\n\n // Constant-time comparison; lengths must match for timingSafeEqual.\n if (expected.length !== v1.length) return false;\n return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));\n}\n"]}
|