Как дать ИИ-агенту кошелек и не остаться с пустым счетом
Представьте, что вы поручили AI-ассистенту заказать редкую книгу, оплатить сервер или купить билет на конференцию. Скрипт доходит до формы оплаты, а дальше ступор. Отдавать агенту реквизиты основной карты страшно: одна галлюцинация или кривой парсер, и деньги утекут не туда. Заставлять человека вручную заполнять каждый checkout сводит автоматизацию на нет.
Инженеры Stripe выкатили любопытную утилиту под названием link-cli. Она решает эту проблему через кошелек Link, выпуская одноразовые виртуальные карты или токены под конкретную транзакцию только после подтверждения владельцем.
В этой статье разберем, как устроен инструмент, как подключить его к LLM через протокол MCP и какие здесь есть подводные камни.
Как устроен процесс
Вся работа с утилитой построена вокруг сущности spend request (запрос на расход). Агент не лезет в ваш банковский аккаунт и не видит сохраненных карт.
Схема работы простая:
- Агент анализирует страницу магазина, формирует корзину и собирает параметры заказа.
- Через CLI создается запрос на покупку с указанием мерчанта, суммы и детального контекста, зачем вообще совершается трата.
- Вам на телефон в приложение Link прилетает пуш с запросом на подтверждение.
- После одобрения CLI получает временную виртуальную карту или токен.
- Агент вставляет сгенерированные реквизиты в форму оплаты и завершает покупку.
link-cli spend-request create \
--payment-method-id csmrpd_123 \
--merchant-name "Stripe Press" \
--merchant-url "https://press.stripe.com" \
--context "Покупка книги 'Working in Public' по запросу пользователя через shopping assistant." \
--amount 3500 \
--line-item "name:Working in Public,unit_amount:3500,quantity:1" \
--total "type:total,display_text:Total,amount:3500" \
--request-approval
Параметр --context здесь не для галочки. Stripe требует подробное описание длиной от 100 символов, чтобы вы точно понимали в пуш-уведомлении, за что именно списываются деньги. На подтверждение дается ровно 10 минут, после чего запрос сгорает.
Форматы учетных данных
Утилита умеет отдавать три типа платежных данных в зависимости от того, где и как агент совершает оплату.
Первый вариант — обычная одноразовая виртуальная карта (PAN). Она подходит для любого интернет-магазина с обычной HTML-формой чекаута, даже если сайт вообще не слышал про Stripe.
Второй вариант — Shared Payment Token (SPT). Это решение для сценариев, где продавец поддерживает Machine Payments Protocol (MPP). Здесь оплата проходит программно по протоколу HTTP 402 без эмуляции ввода данных в браузере.
Третий вариант — Link Pay Token (LPT). Если чекаут работает на Stripe и страница содержит специальный блок для AI-агентов, CLI генерирует токен, привязанный напрямую к аккаунту продавца.
Безопасность логов и работа с MCP
Главная головная боль при работе с платежами в LLM — утечка реквизитов. Если утилита выведет полный номер карты и CVC в stdout, эти данные осядут в контексте модели, системных промптах, логах терминала и транскриптах агента.
Разработчики Stripe обошли это через аргумент --output-file. Команда сохраняет полные данные карты в локальный файл с правами доступа 0600, а в стандартный вывод отдает замаскированный JSON:
link-cli spend-request retrieve lsrq_001 \
--include card \
--output-file /tmp/link-card.json \
--format json
Агент берет путь к файлу, передает его во внутренний браузерный раннер вроде Playwright, а в логах остаются только бренд и последние 4 цифры карты.
Для интеграции с фреймворками вроде Claude Code или Cursor утилиту можно запустить как сервер протокола MCP (Model Context Protocol):
{
"mcpServers": {
"link": {
"command": "npx",
"args": ["@stripe/link-cli", "--mcp"]
}
}
}
Если агент крутится в изолированном контейнере или на удаленном сервере, команда link-cli serve поднимает локальный HTTP-эндпоинт для MCP.
Кстати, для общения с языковыми моделями по умолчанию используется формат toon. Это компактный текстовый вывод без лишнего синтаксического шума JSON, который экономит токены в контекстном окне.
Лимиты и ограничения
Инструмент находится на раннем этапе, поэтому команда Stripe зашила жесткие рамки безопасности:
- Максимальная сумма одной покупки ограничена 500 долларами (50 000 центов).
- Дневной лимит расходов составляет те же 500 долларов, месячный потолок — 20 000 долларов.
- Выпущенная карта или токен активны только 12 часов с момента создания запроса.
- Одновременно может существовать не больше 10 подтвержденных активных запросов.
Для локальных экспериментов и интеграционных тестов есть флаг --test. Он генерирует тестовые номера карт (например, 4000009990001984) и не списывает реальные средства со счета Link.
# Интерактивный демо-режим без реальных списаний
link-cli demo
Где это применимо
Утилита создана под конкретную нишу: автономные скрипты и ассистенты, которым периодически нужно выполнять транзакции от имени человека.
Типичные сценарии:
- Персональные агенты для закупки расходников, бронирования билетов или подписок.
- Автоматическое пополнение баланса в облачных сервисах и сторонних API по достижении лимита.
- Оплата платных эндпоинтов по протоколу Machine Payments Protocol (HTTP 402).
- Системы нагрузочного и сквозного тестирования чекаутов в e-commerce.
После попытки списания агент может отправить отчет о результате через link-cli report, указав статус (успех, капча, блокировка Cloudflare или отказ банка). Это помогает собирать статистику сбоев.
Проект link-cli получился узкоспециализированным, но закрывает реальную дыру в безопасности автономных агентов. Вместо того чтобы делиться приватными ключами и реквизитами, разработчик получает контролируемый шлюз с подтверждением каждого шага через смартфон.
Главный минус прямо сейчас: инструмент работает только с американскими аккаунтами Link. Если у вас есть доступ к US Link, протестировать утилиту можно прямо сейчас через npx @stripe/link-cli onboard. Остальным пока остается изучать исходники на TypeScript в репозитории и ждать расширения географии.
