Кастодиальный vs некастодиальный MCP: кто держит ключи агента
Кастодиальный MCP подписывает сам и держит operator-ключ, некастодиальный агент-кошелёк отдаёт неподписанные транзакции. Разбираем, кто держит ключи и риск
Вы поручаете ИИ-агенту сделать свап на TON. Он вызывает нужный инструмент, и через десять секунд транзакция уже в блокчейне — вы её не подписывали, кошелёк не открывали, ничего не подтверждали. Удобно? Да. А теперь тот же агент неверно распарсил ваш промпт, перепутал amount и отправил не 5, а 500 GRAM. И тоже не спросил. Вопрос, который стоит задать до первого свапа, а не после: кто вообще держит приватный ключ и кто ставит подпись под транзакцией?
Это и есть водораздел между двумя моделями MCP-серверов для TON. Разберём кастодиальный MCP против некастодиального агент-кошелька предметно — с конфигами, инструментами и честными рисками обеих сторон.
Кастодиальный MCP или некастодиальный агент-кошелёк: кто держит ключи и кто подписывает
Сначала матчасть. MCP (Model Context Protocol) — стандарт, по которому ИИ-агенты (Claude, Cursor, ChatGPT/Codex и любой другой MCP-клиент) вызывают внешние инструменты. Агент не умеет сам ходить в блокчейн — он вызывает MCP-инструмент вроде «дай баланс» или «собери свап», а MCP-сервер выполняет работу. И для блокчейна всё упирается в одну техническую деталь: транзакцию нужно подписать приватным ключом.
Кастодиальность агента определяется двумя вещами:
- Где физически лежит приватный ключ — на сервере MCP или у пользователя? Тот, кто им владеет, распоряжается средствами.
- Кто накладывает подпись — сервер сам или кошелёк пользователя? Подпись превращает намерение в необратимое движение денег.
Если ключ и подпись живут на стороне сервиса/агента — это кастодиальная модель: агент может тратить сам. Если ключ у пользователя, и каждую транзакцию подписывает его кошелёк, а сервер лишь собирает неподписанную транзакцию — это некастодиальная модель: сервер физически не способен потратить чужое.
Это как разница между «дать другу свою банковскую карту с пин-кодом» и «дать другу заполненную платёжку, которую ты сам подпишешь в банке». В обоих случаях друг помогает, но риск принципиально разный. Ни одна из моделей не «правильнее» другой в вакууме — они дают разный баланс автономии и контроля. Дальше — как это выглядит на конкретных продуктах.
Кастодиальная модель: официальный @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-совместимый). Сервер собрал «платёжку», но подпись ставит владелец ключа. Сервер видит только публичные данные: адрес, сумму, целевой контракт. Приватного ключа он не касается в принципе.
Типичный поток свапа выглядит так:
get_swap_quote— твёрдая котировка DEX (GRAM ⇄ жетон, ликвидность STON.fi + DeDust через протокол Omniston).build_swap_tx— неподписанная транзакция под эту котировку.- Кошелёк пользователя подписывает её через 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 запр/мин, карта не нужна.