Wallet MCP Server
Supports Ethereum wallet management, including generating/importing keys, signing messages and transactions, broadcasting transactions, and bridging assets from Ethereum to Ambient via the BSC clearinghouse.
Supports Solana wallet management, including generating/importing keys, signing messages and transactions, broadcasting transactions, and bridging assets from Solana to Ambient.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Wallet MCP Serversign and broadcast this unsigned swap transaction"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GetOnyx MCP — Wallet Server
Multi-chain wallet management for AI agents over the Model Context Protocol.
This repository contains the signing half of the GetOnyx MCP stack. It pairs with the publicly deployed GetOnyx market server, which answers market/trading/bridge questions and builds unsigned transactions.
Server | Transport | What it does | Holds private keys? |
GetOnyx (market server) | Remote HTTP — | Market data, orderbooks, prices, balances, bridge quotes, and unsigned transaction builders | No |
Wallet (this repo) | Local stdio | Key generation/import, message & transaction signing, broadcasting, balance queries | Yes — encrypted on disk |
The split is deliberate: the market server is stateless, public and safe to expose over the internet, while private keys never leave your machine. The agent asks the market server for an unsigned transaction, hands it to the wallet server for signing, and then asks the wallet server to broadcast it.
┌───────────────────────────┐ ┌───────────────────────────┐
│ GetOnyx market server │ │ Wallet MCP (this repo) │
│ remote · HTTP Streamable │ │ local · stdio │
│ │ │ │
│ get_market, get_orderbook│ unsigned tx │ wallet_sign_transaction │
│ build_swap_tx, … │ ─────────────► │ wallet_send_transaction │
│ quote_bridge, … │ (base64) │ wallet_generate / import │
└───────────────────────────┘ └───────────────────────────┘
▲ ▲
│ 21 market/trading/bridge tools │ 10 wallet tools
└───────────── AI agent (Kilo, Claude, …) ────┘Table of contents
Related MCP server: AgentWallet MCP Server
What you can do
With both servers registered, an agent can do all of the following from a single conversation:
Query markets
List every Manifest market on-chain (
list_markets) and every supported trading pair with token metadata (get_pools).Inspect a market: base/quote mints, decimals, best bid/ask, full orderbook (
get_market,get_orderbook,get_best_prices).Look up open orders and recent fills (
get_fills).Check tradable and withdrawable balances on a market (
get_balance) and global (cross-market) balances for a mint (get_global_balance).
Swap
Build a swap transaction for any market, exact-in or exact-out, base-in or quote-in (
build_swap_tx), then sign and broadcast it locally.Quote the best bid/ask before swapping, and set an explicit minimum output amount to protect against slippage.
Provide liquidity
Deposit tokens into a market wrapper to back your maker orders (
build_deposit_tx).Place maker orders with
PostOnly/Limit/Globalorder types, and reverse orders with an explicit spread in bps (build_place_order_tx,build_batch_update_tx).Withdraw from the market whenever you want (
build_withdraw_tx,build_withdraw_all_tx).Batch place and cancel many orders in a single transaction to save fees (
build_batch_update_tx).
Bridge
Quote bridge fees and expected amounts for any supported route (
quote_bridge).Build inbound bridges (Ethereum / Arbitrum / BSC / Solana → Ambient via the BSC clearinghouse), outbound bridges (Ambient → destination chain) and direct BSC ↔ Ambient Hyperlane warp routes (
build_inbound_bridge_tx,build_outbound_bridge_tx,build_direct_bridge_tx).Read the bridge configuration (EIDs, addresses, decimals) for a chain (
get_bridge_config).
Manage keys
Generate a new keypair per chain, or import an existing private key (
wallet_generate,wallet_import).Sign arbitrary messages (
wallet_sign_message) and transactions (wallet_sign_transaction), or sign and broadcast in one step (wallet_send_transaction).Query native balances (
wallet_get_balance), list wallets (wallet_list), export or delete a key (wallet_export,wallet_delete).
Quick start
Requirements: Node.js >= 18 and npm.
git clone https://github.com/askjimmy/getonyx-mcp.git
cd getonyx-mcp
npm install
npm run buildThe wallet server speaks stdio — it is launched as a child process by your MCP client. You can smoke-test it manually:
npm start
# Wallet MCP Server started on stdioVerify the deployed market server is reachable:
curl -s -X POST https://getonyx-mcp-130077224278.europe-west1.run.app/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}'Connecting to your AI client
Register both servers. The market server is remote, the wallet server is a local command.
Kilo
kilo mcp add getonyx --url https://getonyx-mcp-130077224278.europe-west1.run.app/mcp
kilo mcp add wallet --command "node /absolute/path/to/getonyx-mcp/dist/index.js"Or in kilo.json / .kilo/config.json:
{
"mcpServers": {
"getonyx": {
"url": "https://getonyx-mcp-130077224278.europe-west1.run.app/mcp"
},
"wallet": {
"command": "node",
"args": ["/absolute/path/to/getonyx-mcp/dist/index.js"]
}
}
}Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"getonyx": {
"url": "https://getonyx-mcp-130077224278.europe-west1.run.app/mcp"
},
"wallet": {
"command": "node",
"args": ["/absolute/path/to/getonyx-mcp/dist/index.js"]
}
}
}Cursor
Settings → Features → MCP → Add server, or .cursor/settings.json:
{
"mcpServers": {
"getonyx": {
"url": "https://getonyx-mcp-130077224278.europe-west1.run.app/mcp"
},
"wallet": {
"command": "node",
"args": ["/absolute/path/to/getonyx-mcp/dist/index.js"]
}
}
}ChatGPT
Settings → Deep Research & Agents → MCP → Add. The deployed market server can be added by URL;
the wallet server must be added as a local command pointing at dist/index.js.
Any MCP client (raw JSON-RPC)
The market server is a stateless Streamable HTTP endpoint — one POST per call, no session
required:
curl -s -X POST https://getonyx-mcp-130077224278.europe-west1.run.app/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_pools","arguments":{}}}'The end-to-end workflow
Every transaction follows the same three steps: query → build → sign → broadcast.
1. Query
You: "What's the best bid/ask on the wAMB/USDT market?"getonyx → get_pools # find the market address
getonyx → get_best_prices { marketAddress } # { bestBidPrice, bestAskPrice, spread }2. Build the unsigned transaction
You: "Swap 1 USDT for wAMB on that market."getonyx → build_swap_tx {
marketAddress, payer,
inAtoms: 1000000000, # 1 USDT (9 decimals → atoms)
outAtoms: 900000000, # minimum acceptable output
isBaseIn: false, # quote token in
isExactIn: true
}
# → { transaction: "<base64>", chain: "solana", instructions: [...] }3. Sign and broadcast locally
You: "Sign it with my Ambient wallet and send it."wallet → wallet_list { chain: "ambient" } # find the walletId
wallet → wallet_send_transaction {
walletId, password,
transaction: { serialized: "<base64 from step 2>" }
}
# → { hash: "5Ujj..." }The market server never sees a private key; the wallet server never talks to the market server.
End-to-end prompt examples
"List the supported trading pairs and show me the top of book for each."
"Swap 25 USDT into wAMB at a minimum of 24.8 wAMB and send it from my Ambient wallet."
"Post 500 wAMB as a bid at 0.98 USDT, post-only, and tell me the order id."
"Deposit 100 USDT into the wAMB/USDT market and place a maker order for 50 wAMB at 1.02."
"How much does it cost to bridge 100 USDT from Arbitrum to Ambient, and build the transaction."
"Withdraw all my USDT from the wAMB/USDT market and cancel every open order."
"Show my balances on the wAMB/USDT market and my native AMB balance."
Tool reference — GetOnyx market server
21 tools, all exposed by the remote server at
https://getonyx-mcp-130077224278.europe-west1.run.app/mcp.
Market
Tool | Description | Key args |
| List all Manifest markets on-chain (heavy RPC call) | — |
| List known trading pairs with token metadata (symbol, name, decimals, icon) | — |
| Market details: mints, decimals, best prices, orders |
|
| Full orderbook (bids and asks) |
|
| Best bid/ask and spread |
|
| Recent fills / open orders |
|
| Tradable and withdrawable balances of a trader on a market |
|
Trading
Tool | Description | Key args |
| Unsigned tx placing an order |
|
| Unsigned tx cancelling one order |
|
| Unsigned tx cancelling every order on a market |
|
| Unsigned tx placing and/or cancelling many orders at once |
|
| Unsigned swap transaction |
|
Order types: Limit, ImmediateOrCancel, PostOnly, Global, Reverse, ReverseTight.
Reverse / ReverseTight take spreadBps; the others take lastValidSlot.
Account
Tool | Description | Key args |
| Unsigned tx depositing tokens into a market wrapper |
|
| Unsigned tx withdrawing tokens from a market wrapper |
|
| Unsigned tx withdrawing every balance from a market wrapper |
|
| Global (cross-market) balance of a mint for a trader |
|
Bridge
Tool | Description | Key args |
| Bridge fees and expected amounts |
|
| Unsigned inbound bridge (source chain → Ambient) |
|
| Unsigned outbound bridge (Ambient → destination chain) |
|
| Unsigned direct BSC ↔ Ambient Hyperlane warp bridge |
|
| Bridge configuration (EIDs, addresses, decimals) for a chain |
|
Bridge chains: ethereum, arbitrum, bsc, solana, ambient.
Tool reference — Wallet server
10 tools, exposed by this repository over stdio.
Tool | Description | Params |
| Create a new keypair, encrypt it, store it in the keystore |
|
| Import an existing private key, encrypt it, store it |
|
| Decrypt and export a stored private key |
|
| Public key / address of a stored wallet (no password) |
|
| Sign an arbitrary UTF-8 message |
|
| Sign a transaction without broadcasting |
|
| Sign and broadcast a transaction |
|
| List stored wallets (addresses and metadata only) |
|
| Delete a wallet (password proves ownership) |
|
| Native token balance of a stored wallet (AMB on Ambient, SOL on Solana, BNB on BSC, ETH on Arbitrum) |
|
Transaction input formats
EVM (BSC, Arbitrum) — standard JSON-RPC fields; missing gasLimit, nonce, fees and
chainId are filled in from the RPC provider:
{ "to": "0x…", "value": "1000000000000000000", "data": "0x…", "chainId": 56 }SVM (Ambient, Solana) — a base64-encoded serialized Solana transaction, exactly as returned by
the market server's build_* tools:
{ "serialized": "AQAB...==" }Private key formats accepted by wallet_import
Chain | Accepted formats |
Ambient, Solana | base58 64-byte secret key, base58 32-byte seed, hex secret key/seed, or a JSON array of 64 byte values |
BSC, Arbitrum |
|
Supported chains
Chain id | Type | Native token | Decimals | Chain id (EVM) | RPC (override with env var) |
| SVM | AMB (wrapped: wAMB) | 9 | — |
|
| SVM | SOL | 9 | — |
|
| EVM | BNB | 18 | 56 |
|
| EVM | ETH | 18 | 42161 |
|
Ambient is an SVM chain, but its native token is AMB — not SOL. AMB is the gas/native asset
held in a wallet, while wAMB is the wrapped form used as the base token of Ambient markets
(for example the wAMB/USDT pair). wallet_get_balance reports the balance in AMB and also returns
wrappedToken: "wAMB" for the Ambient chain, so an agent knows which symbol to use when it
interacts with a market.
Amounts in the market-server tools are expressed in atoms (base units) — for the Ambient
wAMB/USDT pair that is 9 decimals (1 USDT = 1_000_000_000 atoms). The wallet tools use plain
token units and decimal strings.
Security model
Keystore:
~/.config/wallet-mcp-server/keystore.json. Private keys are encrypted at rest with AES-256-GCM using a PBKDF2-SHA256 key (100 000 iterations, 16-byte salt, 12-byte IV). The wire format of an encrypted entry is base64 of[salt][iv][ciphertext+tag].Passwords are never stored. You must pass the password on every
wallet_export,wallet_sign_*,wallet_send_transactionandwallet_deletecall.Keys are decrypted in memory only for the duration of a single operation and discarded immediately afterwards.
Listing never leaks secrets.
wallet_listandwallet_get_balancereturn addresses and metadata only.The wallet server is local-only. It speaks stdio and is spawned by your MCP client; it is never exposed over the network. Do not deploy it with an HTTP transport.
The market server holds no keys. It only returns unsigned transactions and public market data, and sets no authentication — put it behind a trusted proxy if you need to restrict access.
Use a dedicated wallet. Add a label per wallet (
labelparameter) and keep small balances in agent-accessible wallets.
Configuration
Variable | Default | Description |
|
| Keystore file location |
|
| Ambient RPC endpoint |
|
| Solana RPC endpoint |
|
| BSC RPC endpoint |
|
| Arbitrum One RPC endpoint |
Example — point the wallet server at a private RPC and a custom keystore:
{
"mcpServers": {
"wallet": {
"command": "node",
"args": ["/absolute/path/to/getonyx-mcp/dist/index.js"],
"env": {
"AMBIENT_RPC_URL": "https://your-private-rpc.example",
"WALLET_KEYSTORE_PATH": "/absolute/path/to/keystore.json"
}
}
}
}Docker
The image builds from the repository root (no external SDK dependency):
docker build -t getonyx-mcp .Run it with the keystore mounted so wallets persist across containers:
docker run --rm -i \
-v "$HOME/.config/wallet-mcp-server:/home/waluser/.config/wallet-mcp-server" \
getonyx-mcpThe image runs as a non-root user (waluser) and defaults
WALLET_KEYSTORE_PATH=/home/waluser/.config/wallet-mcp-server/keystore.json.
To use the container from an MCP client, register the container command instead of node:
{
"mcpServers": {
"wallet": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/home/you/.config/wallet-mcp-server:/home/waluser/.config/wallet-mcp-server",
"getonyx-mcp"
]
}
}
}Development
npm install
npm run build # tsc → dist/
npm run typecheck # tsc --noEmit
npm run lint # eslint
npm run dev # tsx watch src/index.tsLayout:
src/
├── index.ts # entry point (stdio)
├── server.ts # MCP server bootstrap
├── tools/
│ ├── index.ts # tool registry
│ └── wallet.ts # the 10 wallet tools
├── keystore/
│ ├── index.ts # keystore manager (load/save/generate/import)
│ ├── crypto.ts # PBKDF2 + AES-256-GCM
│ └── types.ts
└── chains/
├── index.ts # chain registry
├── solana.ts # SVM implementation (@solana/web3.js)
├── evm.ts # EVM implementation (ethers v6)
└── types.tsThe market-server half of the stack lives in a separate repository and is deployed to Cloud Run; this repository only needs the public URL to work.
License
MIT
Available Tools
10 toolswallet_deleteA
Delete a stored wallet (requires password to confirm ownership).
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | Keystore password to verify ownership | |
| walletId | Yes | Wallet ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose that a password is required to verify ownership, which is a real behavioral trait. However, for a destructive wallet operation it omits whether deletion is irreversible, what happens to funds/keys, and any confirmation behavior — gaps a delete tool should address.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the destructive action first and the auth requirement immediately after; no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, two-parameter tool with no annotations and no output schema, the description covers the auth requirement but says nothing about irreversibility or consequences. It is minimally adequate but not complete for a delete operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already documented ("Keystore password to verify ownership", "Wallet ID (UUID)"). The description's note about password ownership verification largely restates the schema, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a stored wallet"), which is unambiguous and easily separated from the sign/list/generate siblings. It does not explicitly name or contrast with any sibling, but the operation itself is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical gives a prerequisite (password needed to confirm ownership) but offers no when-to-use vs. when-not guidance or alternatives among the wallet_* family. Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_exportB
Export a stored private key (requires password to decrypt).
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | Keystore password to decrypt the private key | |
| walletId | Yes | Wallet ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that the output is sensitive secret material (a private key) and that a password is required to decrypt, but it says nothing about whether the secret is logged/audited, whether the operation is reversible, or any rate or security constraints on repeated exports.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb+resource leads and the prerequisite follows. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-annotation, no-output-schema tool, the definition is minimally adequate: parameters are covered by the schema and the sensitivity of the result is hinted at. It omits what the export actually returns (raw hex string vs. JSON envelope) and any warning about handling the exposed secret, which an agent would benefit from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already fully documented in the schema, including that the password decrypts the keystore. The description's 'requires password to decrypt' merely restates the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: exporting a stored private key, which is distinct from wallet_get_public_key or the wallet_sign_* siblings. It does not, however, explicitly differentiate itself from those siblings (e.g., 'reveals the secret key material, unlike get_public_key'), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no alternative is named. The parenthetical about the password is a prerequisite, not routing guidance; an agent gets no help deciding between wallet_export and wallet_get_public_key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_generateB
Generate a new keypair, encrypt it with the provided password, and store it in the keystore.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | Yes | Chain ID (ambient, solana, bsc, arbitrum) | |
| label | No | Optional label for the wallet | |
| password | Yes | Encryption password for the keystore |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose the meaningful traits: a new keypair is created, the password is used for encryption, and the result persists in the keystore. It stops short of covering the risk profile an agent needs — whether creation is irreversible, whether the private key or address is returned, overwrite behavior, or password requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence stating action, transformation, and destination with zero filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Wait — no output schema exists, and the description never says what the tool returns (address, public key, derived path), which an agent needs after creation. For a mutation with no annotations this is a gap, though the core operation is otherwise fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so chain, label, and password are already documented in the schema. The description adds only a reinforcing note that the password encrypts the keystore, which is marginal added value over the structured fields — the baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb+resource ('Generate a new keypair') and enumerates the full pipeline (encrypt, store in keystore), so an agent immediately understands this creates a brand-new wallet. It implicitly separates itself from wallet_import (existing keys) but never names that sibling or any other, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no mention of the alternative wallet_import for bringing in an existing key, and no prerequisites beyond the inline password reference. The agent must infer the generation-vs-import decision entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_get_balanceB
Query the native token balance of a stored wallet. Native token: AMB on Ambient (wAMB when held in a market), SOL on Solana, BNB on BSC, ETH on Arbitrum.
| Name | Required | Description | Default |
|---|---|---|---|
| walletId | Yes | Wallet ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Query' implies read-only, but the description does not explicitly state that it is non-mutating, nor does it mention permissions, network calls, caching, error behavior, or return format. The token symbol mapping adds context but not behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and followed by useful clarification of the native token per chain. No redundant or filler text. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one fully documented parameter, the description is nearly complete. It explains the native token mapping, which helps interpret results, but does not describe the return value format despite the absence of an output schema. That gap is minor for a balance query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single required parameter walletId, so the schema already documents it fully. The description adds no additional meaning about the parameter, which matches the baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Query) and resource (native token balance of a stored wallet). The resource distinguishes it from all named siblings: signing/sending transactions, listing/deleting wallets, generating/importing/exporting, and getting public keys. No ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit when-to-use guidance, prerequisites, or alternatives. The native token mapping is contextual but not usage guidance. An agent must infer that this is the tool for reading balances, which is straightforward but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_get_public_keyB
Get the public key / address of a stored wallet.
| Name | Required | Description | Default |
|---|---|---|---|
| walletId | Yes | Wallet ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and largely fails to. It implies a read, but says nothing about whether the wallet must be unlocked, whether a password is needed, or whether the operation is side-effect free; for a key-material accessor these are material omissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource stated immediately and no filler. Nothing is wasted and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read getter with no output schema, the description names the returned artifact (public key / address) and the scope (stored wallet), which is close to sufficient. The only shortfall is the absence of any note on access prerequisites, which no annotation covers either.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and schema description coverage is 100%, with the schema already defining walletId as a UUID string. The description adds no format, sourcing, or example detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('public key / address') scoped to a stored wallet, which distinguishes it in substance from siblings like wallet_get_balance or wallet_sign_message. It does not, however, explicitly name a sibling or contrast itself with wallet_list/wallet_generate, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'of a stored wallet' quietly tells the agent the wallet must already exist (as opposed to wallet_generate), and the required walletId constrains it. There is no explicit when-to-use, when-not-to-use, or named alternative such as wallet_export for retrieving key material.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_importB
Import an existing private key, encrypt it, and store it in the keystore.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | Yes | Chain ID (ambient, solana, bsc, arbitrum) | |
| label | No | Optional label for the wallet | |
| password | Yes | Encryption password for the keystore | |
| privateKey | Yes | Private key in chain-native format (hex for EVM, base58 for SVM) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the internal pipeline (encrypt then persist to keystore), which is real behavioral context beyond the name, but it omits security-relevant traits: overwrite/duplicate-label behavior, password strength requirements, and whether the plaintext key is ever retained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence that front-loads the operation and its side effects. No filler, nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a security-sensitive mutation tool with no annotations and no output schema, the description covers the core action but leaves out key operational details (overwrite semantics, error conditions, key validation) that an agent would need before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (chain, label, password, privateKey) are already documented in the schema. The description adds no format or constraint detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb chain (import, encrypt, store) and names the resource (private key / keystore), so the agent knows exactly what happens. It doesn't explicitly contrast with siblings like wallet_generate or wallet_export, but the action is distinct enough to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this instead of wallet_generate (the obvious alternative for obtaining a wallet) or any prerequisites/exclusions. The agent must infer usage from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_listA
List all stored wallets (addresses and metadata only, no private keys).
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Optional: filter by chain ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that output is limited to addresses and metadata and never private keys, which is real behavioral value. It says nothing about pagination, ordering, authentication requirements, or whether the operation is strictly read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and resource, with the key safety-relevant qualifier attached. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter list tool with no output schema, the description covers the essentials: what is returned and what is deliberately excluded. Only minor gaps remain (ordering, pagination, auth), so an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single 'chain' filter is already documented in the schema. The description adds no further detail about the filter's accepted values or behavior, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List all stored wallets') and adds a scope qualifier ('addresses and metadata only, no private keys') that separates it from siblings like wallet_export or wallet_sign_*. It stops short of naming the alternative tools, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'List' — there is no explicit statement of when to call this versus wallet_get_balance, wallet_export, or wallet_get_public_key. The 'no private keys' note hints at what this tool is not for, but no alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_send_transactionA
Sign and broadcast a transaction. Fills in missing gas/nonce params from the RPC provider.
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | Keystore password to decrypt the private key | |
| walletId | Yes | Wallet ID (UUID) | |
| transaction | Yes | Transaction input (SVM: {serialized} / EVM: {to,value,data,gasLimit,gasPrice,nonce,chainId}) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose one meaningful trait — missing gas/nonce values are auto-filled via an RPC call — but omits that the operation is irreversible once broadcast, that it consumes gas, and that the password decrypts a private key held locally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, zero filler, with the core action stated first and the auto-fill behavior second. Nothing needs to be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a signing-and-broadcasting tool with a nested transaction object, no annotations, and no output schema, the definition leaves real gaps: what is returned (a tx hash?), failure behavior, and network/chain assumptions. The nested EVM/SVM transaction fields are covered by the schema, which helps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The phrase 'fills in missing gas/nonce params' adds a little meaning by signaling those transaction fields are optional to supply, but it adds nothing about password or walletId beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb and resource: 'Sign and broadcast a transaction.' The combination of signing plus broadcasting implicitly distinguishes it from wallet_sign_transaction, which by name only signs, but the description never names that sibling to make the boundary explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for submitting a transaction to the network. There is no explicit statement of when to prefer it over wallet_sign_transaction, nor any prerequisites (funded wallet, unlocked keystore, correct chain).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_sign_messageC
Sign an arbitrary message with a stored wallet.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message to sign (UTF-8 text) | |
| password | Yes | Keystore password to decrypt the private key | |
| walletId | Yes | Wallet ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but only states that signing occurs with a stored wallet. It does not mention the password requirement for decrypting the private key, what happens after signing, or any security or side-effect considerations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is efficiently structured, though its extreme brevity contributes to the missing behavioral and usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter signing tool with full schema coverage, the description is minimally adequate to infer the core operation. However, with no annotations and no output schema, it omits what the tool returns (e.g., a signature) and any usage context, leaving clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (walletId, password, message) are already explained in the input schema. The description adds no additional parameter meaning beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Sign) and resource (an arbitrary message with a stored wallet), making it clear what the tool does. However, it does not explicitly distinguish this from sibling tools such as wallet_sign_transaction, leaving differentiation to the tool name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives like wallet_sign_transaction or wallet_send_transaction. The description only implies usage from the operation itself, with no stated conditions, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_sign_transactionA
Sign a transaction with a stored wallet (does not broadcast). For EVM, provide standard tx fields; for SVM, provide a base64-serialized transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | Keystore password to decrypt the private key | |
| walletId | Yes | Wallet ID (UUID) | |
| transaction | Yes | Transaction input (SVM: {serialized} / EVM: {to,value,data,gasLimit,gasPrice,nonce,chainId}) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It does usefully disclose the key non-broadcast side effect and the chain-specific input format, but says nothing about the password/decryption requirement at call time, failure modes, or what the signed output looks like (no output schema to fall back on).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, with the decisive constraint ('does not broadcast') front-loaded before the chain-specific input details. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested transaction object, no annotations, and no output schema, the description is adequate on inputs but leaves the return value (signed payload format) and the decryption/password behavior unaddressed, which an agent needs to chain this with wallet_send_transaction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by specifying 'standard tx fields' for EVM and 'base64-serialized' for SVM on the ambiguous nested 'transaction' object. That adds format-level meaning the schema's terse summary does not fully pin down.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Sign a transaction') plus the scope ('with a stored wallet'). The parenthetical '(does not broadcast)' implicitly separates it from wallet_send_transaction, but the sibling is never named, so differentiation relies on the agent making the connection itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: sign-only, no broadcast, with per-chain input expectations. It stops short of explicitly routing the agent — it never says 'use wallet_send_transaction if you also want to broadcast' — so the when-not guidance is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
wallet_delete - First observed
wallet_export - First observed
wallet_generate - First observed
wallet_get_balance - First observed
wallet_get_public_key - First observed
wallet_import - First observed
wallet_list - First observed
wallet_send_transaction - First observed
wallet_sign_message - First observed
wallet_sign_transaction
TDQS
Scored across 10 tools
Most tools target distinct actions, but wallet_sign_transaction and wallet_send_transaction both involve signing and could be momentarily confused; descriptions clarify that one broadcasts and the other does not. Remaining tools (list, delete, generate, import, export, get_balance, get_public_key, sign_message) are clearly distinct.
All tools use the wallet_ prefix with consistent snake_case verb_noun or verb naming (wallet_sign_message, wallet_get_balance, wallet_generate, etc.). The pattern is predictable and readable throughout.
10 tools is well-scoped for a wallet server, covering key management, signing, broadcasting, and balance queries without redundancy. Each tool earns its place.
Core wallet lifecycle is covered: create (generate/import), read (list/get_public_key/get_balance), delete, and signing/broadcast operations. Minor gaps include no wallet metadata update/rename and no transaction status/receipt lookup, but these are not central to the stated purpose.
Maintenance
Related MCP Connectors
Crypto wallet for AI agents: balances, payments, swaps and trading with owner controls.
Non-custodial DeFi tools for AI agents on Solana: swaps, perps, lending, staking, equities.
Native Solana staking for AI agents. 26 MCP tools, one-shot signing, webhooks.
Zero-key, non-custodial cross-chain crypto swap aggregator for AI agents: 100+ chains, 15+ providers
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
- AlicenseBqualityAmaintenanceProvides permissionless wallet infrastructure for AI agents to manage wallets, sign transactions, and handle tokens across Solana and all EVM-compatible chains. It includes 29 specialized tools for on-chain operations, featuring built-in security guards and automated x402 payment processing without KYC requirements.40469 npm3MIT

Privy MCP Serverofficial
AlicenseBqualityDmaintenanceEnables AI agents to create wallets, sign transactions, and manage blockchain operations across multiple chains like Ethereum, Solana, and more via Privy.242MIT- AlicenseAqualityDmaintenanceEnables AI agents to check balances and send transactions across multiple blockchains with automatic spending limit protection and policy enforcement.3MIT