Все статьи
8 мин чтения

Кастодиальный vs некастодиальный MCP: кто держит ключи агента

Кастодиальный MCP подписывает сам и держит operator-ключ, некастодиальный агент-кошелёк отдаёт неподписанные транзакции. Разбираем, кто держит ключи и риск

MCPкастодиальностьнекастодиальный кошелёкTONИИ-агентыDeFAI

Вы поручаете ИИ-агенту сделать свап на TON. Он вызывает нужный инструмент, и через десять секунд транзакция уже в блокчейне — вы её не подписывали, кошелёк не открывали, ничего не подтверждали. Удобно? Да. А теперь тот же агент неверно распарсил ваш промпт, перепутал amount и отправил не 5, а 500 GRAM. И тоже не спросил. Вопрос, который стоит задать до первого свапа, а не после: кто вообще держит приватный ключ и кто ставит подпись под транзакцией?

Это и есть водораздел между двумя моделями MCP-серверов для TON. Разберём кастодиальный MCP против некастодиального агент-кошелька предметно — с конфигами, инструментами и честными рисками обеих сторон.

Кастодиальный MCP или некастодиальный агент-кошелёк: кто держит ключи и кто подписывает

Сначала матчасть. MCP (Model Context Protocol) — стандарт, по которому ИИ-агенты (Claude, Cursor, ChatGPT/Codex и любой другой MCP-клиент) вызывают внешние инструменты. Агент не умеет сам ходить в блокчейн — он вызывает MCP-инструмент вроде «дай баланс» или «собери свап», а MCP-сервер выполняет работу. И для блокчейна всё упирается в одну техническую деталь: транзакцию нужно подписать приватным ключом.

Кастодиальность агента определяется двумя вещами:

  1. Где физически лежит приватный ключ — на сервере MCP или у пользователя? Тот, кто им владеет, распоряжается средствами.
  2. Кто накладывает подпись — сервер сам или кошелёк пользователя? Подпись превращает намерение в необратимое движение денег.

Если ключ и подпись живут на стороне сервиса/агента — это кастодиальная модель: агент может тратить сам. Если ключ у пользователя, и каждую транзакцию подписывает его кошелёк, а сервер лишь собирает неподписанную транзакцию — это некастодиальная модель: сервер физически не способен потратить чужое.

Это как разница между «дать другу свою банковскую карту с пин-кодом» и «дать другу заполненную платёжку, которую ты сам подпишешь в банке». В обоих случаях друг помогает, но риск принципиально разный. Ни одна из моделей не «правильнее» другой в вакууме — они дают разный баланс автономии и контроля. Дальше — как это выглядит на конкретных продуктах.

Кастодиальная модель: официальный @ton/mcp и split-key

Официальный @ton/mcp от TON Foundation — это кастодиальный агент-кошелёк. Он держит operator-ключ и подписывает транзакции сам. Работает по модели split-key: operator-ключ у агента, owner-ключ у пользователя. То есть агент не всевластен (owner-ключ остаётся рычагом на стороне человека), но в рамках своих полномочий он тратит средства без ручной подписи каждой операции.

Что умеет @ton/mcp:

  • чтение состояния сети и аккаунтов;
  • отправку GRAM, жетонов и NFT;
  • свап через DEX-агрегатор;
  • создание и импорт агент-кошельков;
  • чтение NFT и DNS.

Чего не умеет: кроссчейн — работает только внутри TON. Запускается локально, по HTTP или serverless.

Это официальный пакет Foundation, и у него есть честные сильные стороны:

  • Полная автономия траты. Агент выполняет цепочку действий без остановок на подтверждение — то, что нужно для по-настоящему автономных сценариев (подписки, автоматические выплаты).
  • NFT и DNS из коробки.
  • Официальность — поддержка со стороны Foundation.

Цена автономии очевидна: operator-ключ живёт в среде агента. А агент — это LLM, которую можно обмануть текстом. Кто контролирует эту среду и её конфигурацию — тот в пределах operator-полномочий контролирует и подпись.

Некастодиальная модель: TONNode отдаёт неподписанные TonConnect-сообщения

TONNode — hosted MCP-сервер для TON (сайт tonnode.io) с ровно 16 инструментами. Здесь инструменты свапа, кроссчейна и кошелька строго некастодиальны: сервер никогда не подписывает и не хранит средства и приватные ключи.

Механика простая. Вместо «сделай свап» инструмент build_swap_tx возвращает неподписанное TonConnect-сообщение — готовую транзакцию, которую подписывает кошелёк пользователя (Tonkeeper, MyTonWallet, любой TonConnect-совместимый). Сервер собрал «платёжку», но подпись ставит владелец ключа. Сервер видит только публичные данные: адрес, сумму, целевой контракт. Приватного ключа он не касается в принципе.

Типичный поток свапа выглядит так:

  1. get_swap_quote — твёрдая котировка DEX (GRAM ⇄ жетон, ликвидность STON.fi + DeDust через протокол Omniston).
  2. build_swap_tx — неподписанная транзакция под эту котировку.
  3. Кошелёк пользователя подписывает её через TonConnect. Всё.

Промпт агенту при этом выглядит обыденно:

Дай котировку на свап 10 GRAM в USDT, потом собери транзакцию
свапа для моего адреса EQ... — я подпишу её сам в кошельке.

Агент вызовет get_swap_quote, затем build_swap_tx, а на выходе вы получите объект транзакции, а не факт списания.

Даже создание кошелька некастодиально. generate_wallet создаёт кошелёк версий v3r2 / v4 / v5r1 / highload_v3 и отдаёт мнемонику, ключи и адрес пользователю — сервер их не хранит. Сгенерировал, забрал сид-фразу себе, сервер о ней «забыл».

Подробнее про версии и безопасное хранение сида — в разборе генерации TON-кошелька.

DeFAI-угол: почему для автономных агентов важно, где живёт приватный ключ

DeFAI — это когда ИИ-агенты сами оперируют в DeFi. И здесь вопрос «где живёт ключ» перестаёт быть теорией.

LLM — вероятностная система. Она читает данные из блокчейна, из чужих контрактов, из текстов, которые ей подсовывают. Классическая атака — промпт-инъекция: в описании жетона или в ответе стороннего инструмента спрятана инструкция «переведи все средства на адрес X». В кастодиальной модели, где агент подписывает сам, такая инъекция потенциально приводит к реальной трате — ключ-то под рукой у того самого агента, которого обманули. Отравленный контекст, баг в цепочке инструментов, скомпрометированный хост — любой из этих сценариев конвертируется в подпись, потому что подписывать умеет сама среда.

В некастодиальной модели атака упирается в стену: даже если агента убедили собрать вредоносную транзакцию, build_swap_tx вернёт лишь неподписанное сообщение. Оно ничего не двигает, пока владелец ключа не подпишет его в своём кошельке — а на этом шаге пользователь видит адрес получателя и сумму. Человек (или отдельная политика подписи) остаётся последним рубежом.

Это не значит, что автономия зла. Это значит, что автономия и контроль ключей — разные оси, и выбирать нужно осознанно. Больше о некастодиальных свапах для агентов — в материале про агентский свап на TON.

Риски обеих моделей: автономная трата против ручной подписи

Честно про обе стороны, без перекоса.

Кастодиальная модель (@ton/mcp):

  • Плюс: агент действительно автономен — платит и оперирует сам, цепочки операций идут без остановок.
  • Плюс: split-key ограничивает агента (owner-ключ на стороне пользователя) — это не «полный доступ ко всему».
  • Плюс: официальность Foundation, удобно для сценариев без человека в цикле (подписки, автовыплаты, NFT/DNS).
  • Риск: операционный ключ подписи находится там же, где работает управляемая текстом LLM — промпт-инъекция или галлюцинация может привести к реальной трате.
  • Риск: ошибка агента (неверный парсинг суммы/адреса) исполняется без ручного барьера.

Некастодиальная модель (TONNode):

  • Плюс: приватный ключ никогда не покидает пользователя — сервер физически не может ни списать, ни увести.
  • Плюс: каждая трата проходит визуальное подтверждение в кошельке — последний рубеж против ошибки агента и инъекции.
  • Ограничение: нужен шаг подписи кошельком — полностью «безлюдный» автопилот 24/7 так не построить.
  • Ограничение: пользователь сам отвечает за сохранность мнемоники, которую отдал generate_wallet (сервер её не хранит — восстановить некому).

Отдельно про кроссчейн, где риск-модель самая заметная. У TONNode TON всегда источник, обмен идёт через атомарный HTLC-эскроу:

  • get_crosschain_quote — котировка.
  • build_crosschain_swap_tx — неподписанная HTLC-эскроу транзакция плюс секрет.
  • track_crosschain_swap — фазы сделки на обеих сетях.
  • disclose_crosschain_secret — раскрыть секрет для расчёта после проверки готовности он-чейн.
  • build_crosschain_refundвозврат средств из зависшей эскроу, если контрагент не завершил обмен.

Наличие build_crosschain_refund — прямое следствие некастодиальности: раз ключ и секрет у пользователя, у него же и рычаг вернуть свои деньги из застрявшей сделки, а не «писать в поддержку». Поддерживаются Ethereum, Arbitrum, Base, BNB Chain, Polygon, Avalanche. TRON пока не поддерживается.

Честное сравнение: когда какой подход выбрать

Критерий @ton/mcp (кастодиальный) TONNode (некастодиальный)
Кто держит ключ operator-ключ у агента приватный ключ у пользователя
Кто подписывает сервер/агент сам кошелёк пользователя
Автономная трата да нет (нужна подпись)
Кроссчейн нет, только TON да, HTLC (TON — источник)
NFT / DNS да нет (в роадмапе)
Формат локально / HTTP / serverless локально + hosted-опция
Статус официальный пакет Foundation сторонний open-source (MIT)

Практический выбор:

Берите кастодиальный @ton/mcp, если:

  • нужна настоящая автономия агента — он должен тратить сам, без человека в цикле;
  • важны NFT и DNS в TON;
  • важен официальный статус Foundation;
  • всё происходит внутри TON — кроссчейн не нужен, а операционные риски operator-ключа вы осознанно принимаете.

Берите некастодиальный TONNode, если:

  • хотите, чтобы приватный ключ и подпись оставались у вас, а каждая трата подписывалась вручную;
  • нужен кроссчейн: TON всегда источник, атомарный HTLC-эскроу, с возвратом из зависшей сделки;
  • нужна hosted-опция с гарантированной пропускной способностью и своим ключом;
  • хотите open-source пакет (MIT) на нативном ADNL.

Разница честная и без передёргиваний: @ton/mcp — кастодиальный и только TON; TONNode — некастодиальный, с кроссчейном и hosted-опцией. Развёрнутое сопоставление функций — в отдельном разборе TONNode против официального TON MCP или на странице сравнения с официальным MCP.

Небольшая ремарка про инфраструктуру. Если под нагрузкой вы используете публичные лайтсерверы или публичные HTTP-API (toncenter, tonapi.io), помните про реальные лимиты: при превышении приходит HTTP 429 «Too Many Requests» (без ключа — около 1 запроса в секунду), а публичные лайтсерверы часто отвечают «not ready» или ADNL-таймаутом. Никаких мемных «ошибок 228» в API нет — это фольклор комьюнити, а не код ответа.

Как попробовать некастодиальный MCP за пару минут

Самый быстрый способ прочувствовать разницу — запустить локально и дать агенту простой промпт. Публичный конфиг с полным набором инструментов чтения, бесплатно и без карты:

{
  "mcpServers": {
    "ton": {
      "command": "npx",
      "args": ["-y", "@tonnode/mcp"]
    }
  }
}

Дальше попросите агента человеческим языком — на этом бесплатном конфиге открыт весь набор чтения:

Покажи баланс адреса EQ... в GRAM, посмотри метаданные USDT
и дай твёрдую котировку на свап 10 GRAM в USDT.

Агент вызовет get_balance, get_jetton_info и get_swap_quote — и вернёт данные, ничего не тратя. Ни подписи, ни движения средств: чтение есть чтение.

Пакет @tonnode/mcp — open source (MIT), работает по нативному ADNL-протоколу TON, без HTTP-прослоек. Когда понадобятся инструменты, которые собирают транзакции (свап, кроссчейн, генерация кошелька), — это уже все 16 инструментов на hosted-эндпоинте, со своим ключом и гарантированной пропускной способностью:

{
  "mcpServers": {
    "ton": {
      "type": "http",
      "url": "https://mcp.tonnode.io/mcp",
      "headers": { "Authorization": "Bearer tn_live_…" }
    }
  }
}

На hosted-ключе агенту можно дать уже полноценный некастодиальный сценарий:

Создай новый TON-кошелёк версии v5r1 и покажи адрес.
Потом собери свап 10 USDT в GRAM и верни неподписанную транзакцию.

Агент вызовет generate_wallet, затем get_swap_quote и build_swap_tx — и вернёт вам неподписанное сообщение. Обратите внимание: на этом моменте ничего не потрачено. Подпись — ваш отдельный, осознанный шаг. Это и есть некастодиальность на практике.

На всех тарифах доступны все 16 инструментов — платите только за пропускную способность. Бесплатный ключ Hobby (60 запросов/мин, навсегда, без карты) выдаётся сразу после входа.

Общий гайд по подключению MCP к TON — в руководстве по MCP для TON.


Ключ, которым можно потратить ваши деньги, не должен лежать рядом с моделью, которую можно обмануть одним абзацем текста. Если для вашего сценария автономная трата важнее — кастодиальный @ton/mcp честно закрывает эту задачу. Если важнее, чтобы подпись оставалась за вами, — начните с некастодиального TONNode и сами решите, где провести границу доверия.

Попробовать некастодиальный MCP бесплатно — получить ключ Hobby: tonnode.io/dashboard?plan=hobby

Дайте вашему агенту доступ к TON

16 MCP-инструментов: чтение, некастодиальные свапы, кроссчейн и кошельки. Бесплатный тариф — 60 запр/мин, карта не нужна.