quai-mcp-server
quai-mcp-server
MCP-сервер (Model Context Protocol), который предоставляет данные сети Quai и инструменты для read-only взаимодействия AI-клиентам, таким как Claude Desktop и Claude Code. Создан с использованием официального @modelcontextprotocol/sdk и quais, ethers-подобного SDK для Quai.
Что такое Quai Network простыми словами
Quai — это proof-of-work, EVM-совместимый Layer 1, который масштабируется за счёт шардинга: вместо одной цепи, выполняющей всю работу, он разделяется на множество цепей, организованных в иерархию.
Prime chain (1)
/ | \
Region Region Region <- "Cyprus", "Paxos", "Hydra"
/ | \ / | \ / | \
Zone Zone Zone ... 9 Zone chains totalPrime — единственная цепь верхнего уровня. Каждый майнер майнит Prime; она урегулирует состояние всей сети, но не обрабатывает пользовательские транзакции напрямую.
Region-цепи (сейчас Cyprus, Paxos, Hydra) находятся под Prime, агрегируя свои Zone.
Zone-цепи (Cyprus1/2/3, Paxos1/2/3, Hydra1/2/3 — сегодня 9, их можно добавлять по мере роста сети) — это место, где живёт настоящий EVM: пользовательские транзакции, контракты, балансы, всё.
В отличие от схем шардинга, которые разделяют безопасность вместе с данными, Quai сохраняет безопасность единой во всей иерархии, разделяя только данные/пропускную способность — Prime и Region-цепи merge-mine с Zone-цепями под ними.
Самая важная часть для инструментов: каждый адрес Quai знает своё местоположение. Собственные байты адреса кодируют, в какой единственной Zone он живёт (и находится ли он в реестре QUAI, account-based, как Ethereum, или в реестре Qi, UTXO-based, как Bitcoin). Адрес на Cyprus1 существует только на Cyprus1 — вы не можете спросить о нём Paxos2. Поэтому несколько инструментов ниже либо автоматически определяют зону за вас, либо просят указать её явно.
Related MCP server: Kirha MCP Gateway
Инструменты
Только чтение
Tool | What it does |
| Баланс QUAI для адреса. Зона определяется автоматически из адреса. |
| Детали блока по номеру/хэшу/тегу. Требуется шард/зона, так как номера блоков не уникальны глобально между цепями. |
| Транзакция + квитанция по хэшу, включая зону, в которой она оказалась. |
| По адресу сообщает его зону, регион и реестр (Quai vs Qi) — без сетевого вызова. |
| Read-only вызов контракта в стиле |
| Поиск по небольшому курируемому офлайн-индексу документации Quai с возвратом фрагментов и ссылок. |
| Котировка конвертации между QUAI и Qi, двумя собственными нативными реестрами Quai — это встроенный «своп» Quai, а не сторонний DEX (ни один из них не подтверждён на Quai). |
Ни один из этих инструментов не может перемещать средства, подписывать что-либо или изменять состояние on-chain.
Кошельки (кастодиальные: зашифрованные, именованные, защищённые паролем)
Tool | What it does |
| Генерирует новый приватный ключ + адрес реестра QUAI, привязанный к выбранной зоне (по умолчанию |
| То же зашифрованное хранилище для уже имеющегося приватного ключа реестра QUAI. |
| Генерирует новый кошелёк Qi-реестра (UTXO-based) — HD-кошелёк с мнемонической фразой, поскольку Qi требует деривации адресов и сканирования UTXO, а не одной пары ключей. Шифруется так же. |
| То же зашифрованное хранилище для уже имеющейся мнемонической фразы Qi. |
| Перечисляет сохранённые кошельки обоих типов (имя, реестр, адрес, зона). Пароль не нужен — он требуется только для трат или проверки баланса Qi. |
| Подписывает и отправляет QUAI из сохранённого QUAI-кошелька. Двухэтапное подтверждение (см. ниже). Отправитель и получатель могут находиться в разных зонах — это внешняя транзакция (ETX), обрабатываемая сетью автоматически. Если получатель — адрес Qi, это также служит путём конвертации QUAI→Qi (см. ниже). |
| Общий и доступный для трат баланс Qi для Qi-кошелька. Требуется пароль — см. «Почему Qi требует пароль» ниже. |
| Конвертирует Qi, хранящийся в Qi-кошельке, в QUAI, отправляемый на адрес QUAI. Двухэтапное подтверждение, та же схема, что и |
| Получает многоразовый платёжный код BIP-47 Qi-кошелька — то, что вы даёте кому-то, чтобы он мог отправить |
| Отправляет Qi из Qi-кошелька на платёжный код получателя (не на обычный адрес) — см. «Отправка Qi → Qi» ниже. Двухэтапное подтверждение, та же схема, что и у других инструментов записи. |
Этот сервер хранит ключи от вашего имени после создания или импорта кошелька — он кастодиальный в этом узком, локальном смысле, так же как хранилище ключей geth или локальное хранилище MetaMask. Он не работает как хостинг-сервис для чужих средств; всё хранится в каталоге на машине, где запущен сервер, зашифрованное паролем, который знаете только вы.
Как работает шифрование: каждый кошелёк — это приватный ключ в стандартном формате Web3 Secret Storage (V3 keystore) — том же формате, который используют geth и MetaMask — через encryptKeystoreJson из quais. Конкретно: пароль растягивается с помощью scrypt (N=2^17, r=8, p=1, стандартные «дорогие» параметры стоимости — это намеренно замедляет каждую попытку подбора пароля), приватный ключ шифруется с помощью AES-128-CTR, а MAC над шифротекстом обнаруживает неверный пароль (или изменённый файл) до того, как из него будет получен какой-либо ключевой материал. Это хорошо проверенная и широко распространённая схема; здесь нет собственной криптографии.
Где хранятся кошельки: по умолчанию ~/.quai-mcp-server/wallets/ (переопределяется через QUAI_WALLET_DIR) — QUAI-кошельки как <name>.json, Qi-кошельки как <name>.qi.json. Каталог создаётся с правами 0700, а каждый файл хранилища — 0600 (только чтение/запись владельцем, best-effort на не-POSIX платформах) — это явно применяется после создания, а не просто оставляется на усмотрение umask процесса. Адрес хранится в открытом виде в обоих случаях (это публичная информация; именно так list_wallets и предпросмотры на стороне QUAI работают без пароля), но приватный ключ (или мнемоника для Qi) никогда не записывается, не логируется и не возвращается в открытом виде ни одним инструментом.
Именование: имя идентифицирует не более одного QUAI-кошелька и не более одного Qi-кошелька — это независимые хранилища (разные файлы, разные секреты, совершенно несвязанный ключевой материал), которые просто имеют общую метку. Нельзя создать два QUAI-кошелька (или два Qi-кошелька) с одним именем, но повторное использование имени QUAI-кошелька для Qi-кошелька — это именно то, как работает связывание в create_wallet, и create_qi_wallet/import_qi_wallet намеренно это разрешают по той же причине.
Qi-кошельки — это HD-кошельки под капотом, но этот сервер хранит только мнемонику — никогда не производное дерево адресов и не состояние UTXO/сканирования. create_qi_wallet/import_qi_wallet шифруют {address, privateKey, mnemonic} с помощью того же вызова encryptKeystoreJson, что и на стороне QUAI (поля address/privateKey там — это просто первый производный адрес кошелька, присутствующий, чтобы файл был обычным, валидным V3 keystore); значимый секрет — мнемоника. Каждая последующая операция (get_qi_balance, convert_qi_to_quai) воссоздаёт свежий QiHDWallet из этой мнемоники и заново выводит тот же адрес получения по требованию -- детерминированно, поскольку HD-деривация для фиксированного аккаунта/зоны всегда даёт один и тот же адрес. Это было проверено напрямую: экспорт мнемоники кошелька и повторный импорт под другим именем воспроизвели идентичный адрес. Компромисс в том, что каждая операция Qi заново выводит данные с нуля, а не читает кэш, что проще для понимания и не может отклониться от того, что на самом деле подразумевает мнемоника, ценой необходимости пароля чаще, чем на стороне QUAI (см. ниже).
Почему Qi требует пароль чаще: get_balance в QUAI читает публичный баланс аккаунта напрямую из цепочки — секрет не нужен. У Qi такого нет: «баланс» — это сумма неизрасходованных выходов транзакций (UTXO), принадлежащих адресам, которые может вывести только мнемоника кошелька, так что само вычисление баланса означает восстановление кошелька. Поэтому get_qi_balance принимает пароль (а get_balance в QUAI — нет), и поэтому шаг предпросмотра в convert_qi_to_quai может показать курс конвертации, но не может подтвердить, что у вас действительно достаточно Qi для траты — эта проверка происходит только когда пароль поступает на шаге подтверждения.
Правила пароля: минимум 8 символов, проверяется до любого шифрования. Отдельного ограничения частоты попыток с неверным паролем нет — стоимостные параметры scrypt уже делают каждую попытку вычислительно дорогой, что является стандартной защитой для такого рода локального хранилища ключей.
Поток подтверждения для send_transaction, convert_qi_to_quai и send_qi: все три всегда требуют два вызова, и только второй требует пароль.
Вызов с адресом назначения и суммой (
walletName/to/amountдляsend_transaction;walletName/recipientPaymentCode/amount/destinationZoneдляsend_qi; вариант в формеtoдляconvert_qi_to_quai) — пароль пока не требуется. Ничего не транслируется. Вы получаете предпросмотр — разрешённые зоны, оценку там, где она существует (газ для отправки, конвертированная сумма для конвертации; уsend_qiеё нет, так как это перевод 1:1), иconfirmationToken, действительный в течение 2 минут.Повторный вызов с теми же параметрами, плюс
confirm: true, этотconfirmationTokenиpasswordкошелька. Только тогда ключ/мнемоника расшифровывается и транзакция фактически подписывается и отправляется.
Токен одноразовый и привязан к точным параметрам предпросмотра — если что-то изменилось, токен истёк или уже был использован, шаг 2 завершается с понятной ошибкой, и вы делаете предпросмотр заново. Это работает одинаково независимо от того, есть ли у самого MCP-клиента UI подтверждения инструментов, так что это реальный барьер, а не полагание на клиент. Неверный пароль завершается чисто (Incorrect password for wallet "...") без утечки информации о том, были ли токен/параметры в остальном валидны.
Намеренно нет инструмента export_wallet/«показать приватный ключ или мнемонику» — как только секрет попал в хранилище, единственный способ вывести его через этот сервер — подписать им.
Конвертация QUAI ↔ Qi («своп»): у Quai есть нативная конвертация на уровне протокола между двумя её реестрами — QUAI (на основе аккаунтов) и Qi (на основе UTXO, как Bitcoin) — с ончейн-курсом обмена, а не через сторонний DEX. get_conversion_rate даёт котировку в любом направлении, кошелёк не нужен. Оба направления исполнения теперь реализованы:
QUAI → Qi: просто обычный
send_transactionна адрес Qi-реестра (например, изcreate_qi_wallet). Инструмент определяет это автоматически (isConversion: trueв предпросмотре) и показывает оценку полученного Qi рядом с обычной информацией о газе/балансе.Qi → QUAI:
convert_qi_to_quai, использующий под капотомQiHDWallet.convertToQuaiизquais, по той же схеме предпросмотр/подтверждение/пароль, что иsend_transaction.
Отправка Qi → Qi: Qi-кошельки не отправляют напрямую на адреса друг друга. Вместо этого у каждого Qi-кошелька есть переиспользуемый BIP-47 платёжный код (get_qi_payment_code) — делитесь им так же, как адресом, но из него для каждого платежа выводится свежий одноразовый адрес, для приватности. Чтобы отправить, отправитель «открывает канал» с платёжным кодом получателя (send_qi делает это автоматически) — это чистый локальный ECDH между двумя платёжными кодами, детерминированный и воспроизводимый, без ончейн-действий или сохраняемого состояния. Загвоздка на принимающей стороне: эти попарно выведенные адреса не входят в обычную детерминированную последовательность адресов кошелька, так что ничего не найдёт средства, отправленные таким образом, если вы не скажете ему искать. Конкретно: после того как кто-то заплатил вашему Qi-кошельку через платёжный код, передайте его платёжный код в counterpartyPaymentCodes у get_qi_balance — он открывает тот же канал и включает его в баланс. Механизма уведомлений (ончейн или иного) нет, который сообщил бы получателю о платеже через платёжный код; обе стороны должны уже знать друг о друге вне канала, так же как вам нужно знать адрес, прежде чем проверять его баланс. send_qi также поддерживает кросс-зонные отправки (destinationZone, отдельный от собственной зоны отправителя), так же как ETX в send_transaction и собственная зонная модель QiHDWallet.
Один известный недочёт: шаг предпросмотра в send_qi не проверяет формат платёжного кода заранее (нет экспортированного валидатора для проверки), так что некорректный код пройдёт предпросмотр и упадёт только при подтверждении — безопасно (ничего не отправляется, средствам ничего не угрожает), просто позже, чем хотелось бы.
Ещё не реализовано: deploy_contract, request_faucet.
Честность о том, что здесь протестировано, обновлено: полный цикл send_qi / платёжного кода был проверен вживую на мейннете с двумя реальными кошельками — реальный, корректно отформатированный BIP-47 платёжный код (PM8T...) был сгенерирован и подтверждён детерминированным при повторных вызовах, предпросмотр корректно определил, кросс-зонная это отправка или в ту же зону, подтверждение с пустым кошельком упало с настоящей ошибкой SDK (No Qi available in zone), а не с крашем, и get_qi_balance корректно изолировал невалидный платёжный код контрагента в rejectedPaymentCodes, не провалив весь вызов. Что всё ещё не проверено, по той же причине, что и везде в этом документе: фактическое завершение отправки через платёжный код между двумя финансированными кошельками, так как для этого нужны реальные Qi, и это не делалось без запроса.
Честность о том, что здесь протестировано: всё вышеперечисленное было проверено на живом мейннете, включая проверку детерминизма (экспорт мнемоники Qi-кошелька и повторный импорт под другим именем воспроизвёл идентичный адрес) и реальные пути ошибок (неверный пароль, недостаточно QUAI для газа и настоящая ошибка QiHDWallet — No Qi available in zone — при попытке конвертации из пустого Qi-кошелька). Что не было проверено — это фактическое завершение convert_qi_to_quai или конвертации QUAI→Qi против кошелька с реальными средствами, так как это требует траты реальных денег и не делалось без запроса.
Установка
npm install
npm run buildИли запустите напрямую без установки, после публикации:
npx quai-mcp-serverТребования
Node.js 18+
Конфигурация (переменные окружения)
Все опциональны — разумные значения по умолчанию указывают на мейннет Quai.
Переменная | По умолчанию | Назначение |
|
| Шлюз RPC мейннета, используемый инструментами при |
|
| Шлюз RPC тестнета Orchard, используемый при |
|
| Где хранятся зашифрованные файлы хранилища ключей кошельков. |
Каждый инструмент также принимает аргумент network ("mainnet" или "testnet") при каждом вызове, так что клиент может запрашивать любую сеть без перезапуска сервера.
О ключах: см. «Кошельки» выше. Ключи существуют в открытом виде только в памяти на время вызова create_wallet/import_wallet/send_transaction, которому они нужны — никогда на диске, никогда в логах. Относитесь к QUAI_WALLET_DIR (и к машине, на которой работает этот сервер) как к любому другому локальному хранилищу секретов: любой, у кого есть доступ к файловой системе этого каталога и достаточно вычислительной мощности для перебора слабого пароля, в конечном счёте сможет расшифровать кошелёк, как и локальное хранилище geth или хранилище MetaMask.
Регистрация в Claude Desktop
Добавьте это в ваш MCP-конфиг Claude Desktop (claude_desktop_config.json — на macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"quai": {
"command": "npx",
"args": ["quai-mcp-server"]
}
}
}Или, если вы склонировали и собрали этот репозиторий локально вместо использования опубликованного пакета:
{
"mcpServers": {
"quai": {
"command": "node",
"args": ["/absolute/path/to/quai-mcp-server/dist/index.js"]
}
}
}Чтобы по умолчанию указывать на тестнет, добавьте блок env:
{
"mcpServers": {
"quai": {
"command": "npx",
"args": ["quai-mcp-server"],
"env": {
"QUAI_TESTNET_RPC_URL": "https://orchard.rpc.quai.network"
}
}
}
}(затем передавайте "network": "testnet" в отдельных вызовах инструментов — переменные окружения задают конечную точку, а не сеть по умолчанию для каждого вызова).
Регистрация в Claude Code
claude mcp add quai -- npx quai-mcp-serverили, для локальной сборки:
claude mcp add quai -- node /absolute/path/to/quai-mcp-server/dist/index.jsРазработка
npm run dev # tsc --watch
npm run build # one-shot build to dist/
npm start # run the built server directly (stdio) -- mainly useful for manual smoke testsСервер говорит по MCP через stdio только в v1; HTTP-транспорта нет.
Заметки по дизайну
quais поверх сырого RPC: каждый инструмент идёт через
JsonRpcProvider,Contractи утилиты адресов SDKquais, а не через самодельные JSON-RPC вызовыeth_/quai_, так что разрешение зон, форматирование ответов и формы ошибок остаются согласованными с остальной экосистемой Quai.Один провайдер, много зон: один
JsonRpcProvider, указывающий на базовый URL шлюза (например,https://rpc.quai.network), автоматически обнаруживает активные зоны из Prime-цепочки и маршрутизирует каждый вызов в нужную — большинству инструментов никогда не нужно конструировать URL для конкретной зоны.Хранение — стандартными инструментами, а не самодельной криптографией: кошельки хранятся с использованием реализации
quaisформата хранилища ключей Ethereum V3 (scrypt + AES-128-CTR + MAC) — той же хорошо проверенной схемы, которую используютgethи MetaMask, — а не чего-то самодельного. См. «Кошельки» выше для полной модели.Ошибки — это текст, а не стектрейсы: ошибки RPC/контрактов перехватываются и переписываются в короткие конкретные сообщения (например, «Contract call reverted: ...», «Insufficient funds: ...», «Incorrect password for wallet...», «not a validly checksummed Quai address») вместо утечки сырых объектов исключений модели.
Подтверждение — реальный барьер, а не просто подсказка клиенту: инструменты записи аннотированы
readOnlyHint: false(иdestructiveHint: trueдля отправки), чтобы MCP-клиенты со своим UI одобрения показывали его, ноsend_transactionдополнительно обеспечивает собственное рукопожатие предпросмотр → токен → пароль на стороне сервера (src/confirmations.tsдля токена,src/walletStore.ts+decryptKeystoreJsonдля пароля), так что его по-прежнему безопасно вызывать из клиента вообще без UI одобрения.Пароль нужен только один раз, в последний момент: предпросмотр отправки разрешает адрес кошелька прямо из незашифрованной части его файла хранилища ключей и использует
VoidSigner(подписывающий в quais, который может оценить газ, но не подписать) для оценки стоимости — без расшифровки, без пароля. Только финальный вызовconfirm: trueрасшифровывает ключ, и только на время этого одного вызова.ETX — не отдельный путь кода: отправка на адрес в другой зоне использует тот же самый вызов
send_transaction, что и отправка в ту же зону — сеть Quai обрабатывает кросс-зонную маршрутизацию (как внешнюю транзакцию) прозрачно, как только подписанная транзакция достигает зоны отправителя. Инструмент просто определяет и сообщает задействованные зоны, чтобы вызывающий знал, чего ожидать.Qi-кошельки не имеют состояния между вызовами, намеренно:
create_qi_wallet/import_qi_walletтолько шифруют мнемонику.get_qi_balanceиconvert_qi_to_quaiвосстанавливаютQiHDWalletс нуля при каждом вызове и заново выводят его адрес (src/qiWallet.ts), а не читают какое-либо кэшированное состояние адресов/UTXO — читать нечего. Это обменяло немного производительности (каждая Qi-операция заново выводит и перезапрашивает, а не бьёт в кэш) на более простую и трудную для ошибок историю безопасности: единственное, что когда-либо находится в покое, — это единственный секрет, который имеет значение.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables AI agents to interact with cryptocurrency ecosystems through wallet management, trading operations (swaps, DCA, limit orders), staking, and multi-chain support starting with Solana.37GPL 3.0
- AlicenseNot gradedqualityCmaintenanceA unified interface that provides AI agents with access to premium data sources and crypto market intelligence through a single authentication endpoint. It handles multi-API composition and planning to aggregate real-time blockchain analytics and financial data into conversational workflows.223ISC

QuickContract MCPofficial
AlicenseAqualityCmaintenanceEnables AI agents to sign contracts, release escrow, query portfolios, and verify on-chain proofs via QuickContract.1716MIT- AlicenseAqualityDmaintenanceEnables AI agents to check balances and send transactions across multiple blockchains with automatic spending limit protection and policy enforcement.3MIT
Related MCP Connectors
Provide AI agents and automation tools with contextual access to blockchain data including balance…
Read-only on-chain intelligence for AI agents on Base: balances, tokens, gas, tx status.
Read-only on-chain intel for AI agents on Base: balances, tokens, gas, tx status. No API keys.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Intellihackz/quai-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server