Skip to main content
Glama

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 — https://getonyx-mcp-130077224278.europe-west1.run.app/mcp

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 / Global order 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 build

The 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 stdio

Verify 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_markets

List all Manifest markets on-chain (heavy RPC call)

—

get_pools

List known trading pairs with token metadata (symbol, name, decimals, icon)

—

get_market

Market details: mints, decimals, best prices, orders

marketAddress

get_orderbook

Full orderbook (bids and asks)

marketAddress

get_best_prices

Best bid/ask and spread

marketAddress

get_fills

Recent fills / open orders

marketAddress, limit

get_balance

Tradable and withdrawable balances of a trader on a market

marketAddress, trader

Trading

Tool

Description

Key args

build_place_order_tx

Unsigned tx placing an order

marketAddress, payer, numBaseTokens, tokenPrice, isBid, orderType

build_cancel_order_tx

Unsigned tx cancelling one order

marketAddress, payer, clientOrderId

build_cancel_all_tx

Unsigned tx cancelling every order on a market

marketAddress, payer

build_batch_update_tx

Unsigned tx placing and/or cancelling many orders at once

marketAddress, payer, placeParams[], cancelParams[], cancelAll

build_swap_tx

Unsigned swap transaction

marketAddress, payer, inAtoms, outAtoms, isBaseIn, isExactIn

Order types: Limit, ImmediateOrCancel, PostOnly, Global, Reverse, ReverseTight. Reverse / ReverseTight take spreadBps; the others take lastValidSlot.

Account

Tool

Description

Key args

build_deposit_tx

Unsigned tx depositing tokens into a market wrapper

marketAddress, payer, mint, amountTokens

build_withdraw_tx

Unsigned tx withdrawing tokens from a market wrapper

marketAddress, payer, mint, amountTokens

build_withdraw_all_tx

Unsigned tx withdrawing every balance from a market wrapper

marketAddress, payer

get_global_balance

Global (cross-market) balance of a mint for a trader

marketAddress, trader, mint

Bridge

Tool

Description

Key args

quote_bridge

Bridge fees and expected amounts

route (inbound/outbound/direct), params

build_inbound_bridge_tx

Unsigned inbound bridge (source chain → Ambient)

sourceChain, amount, recipientAddress

build_outbound_bridge_tx

Unsigned outbound bridge (Ambient → destination chain)

destinationChain, amount, recipientAddress, payer

build_direct_bridge_tx

Unsigned direct BSC ↔ Ambient Hyperlane warp bridge

direction, amount, recipientAddress

get_bridge_config

Bridge configuration (EIDs, addresses, decimals) for a chain

chain

Bridge chains: ethereum, arbitrum, bsc, solana, ambient.


Tool reference — Wallet server

10 tools, exposed by this repository over stdio.

Tool

Description

Params

wallet_generate

Create a new keypair, encrypt it, store it in the keystore

chain, password, label?

wallet_import

Import an existing private key, encrypt it, store it

chain, privateKey, password, label?

wallet_export

Decrypt and export a stored private key

walletId, password

wallet_get_public_key

Public key / address of a stored wallet (no password)

walletId

wallet_sign_message

Sign an arbitrary UTF-8 message

walletId, password, message

wallet_sign_transaction

Sign a transaction without broadcasting

walletId, password, transaction

wallet_send_transaction

Sign and broadcast a transaction

walletId, password, transaction

wallet_list

List stored wallets (addresses and metadata only)

chain?

wallet_delete

Delete a wallet (password proves ownership)

walletId, password

wallet_get_balance

Native token balance of a stored wallet (AMB on Ambient, SOL on Solana, BNB on BSC, ETH on Arbitrum)

walletId

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

0x-prefixed 32-byte hex private key


Supported chains

Chain id

Type

Native token

Decimals

Chain id (EVM)

RPC (override with env var)

ambient

SVM

AMB (wrapped: wAMB)

9

—

https://rpc.ambient.xyz

solana

SVM

SOL

9

—

https://api.mainnet-beta.solana.com

bsc

EVM

BNB

18

56

https://bsc-dataseed.binance.org/

arbitrum

EVM

ETH

18

42161

https://arb1.arbitrum.io/rpc

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_transaction and wallet_delete call.

  • Keys are decrypted in memory only for the duration of a single operation and discarded immediately afterwards.

  • Listing never leaks secrets. wallet_list and wallet_get_balance return 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 (label parameter) and keep small balances in agent-accessible wallets.


Configuration

Variable

Default

Description

WALLET_KEYSTORE_PATH

~/.config/wallet-mcp-server/keystore.json

Keystore file location

AMBIENT_RPC_URL

https://rpc.ambient.xyz

Ambient RPC endpoint

SOLANA_RPC_URL

https://api.mainnet-beta.solana.com

Solana RPC endpoint

BSC_RPC_URL

https://bsc-dataseed.binance.org/

BSC RPC endpoint

ARBITRUM_RPC_URL

https://arb1.arbitrum.io/rpc

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-mcp

The 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.ts

Layout:

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.ts

The 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 tools
wallet_deleteA

Delete a stored wallet (requires password to confirm ownership).

ParametersJSON Schema
NameRequiredDescriptionDefault
passwordYesKeystore password to verify ownership
walletIdYesWallet ID (UUID)

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
passwordYesKeystore password to decrypt the private key
walletIdYesWallet ID (UUID)

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainYesChain ID (ambient, solana, bsc, arbitrum)
labelNoOptional label for the wallet
passwordYesEncryption password for the keystore

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
walletIdYesWallet ID (UUID)

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
walletIdYesWallet ID (UUID)

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainYesChain ID (ambient, solana, bsc, arbitrum)
labelNoOptional label for the wallet
passwordYesEncryption password for the keystore
privateKeyYesPrivate key in chain-native format (hex for EVM, base58 for SVM)

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
chainNoOptional: filter by chain ID

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
passwordYesKeystore password to decrypt the private key
walletIdYesWallet ID (UUID)
transactionYesTransaction input (SVM: {serialized} / EVM: {to,value,data,gasLimit,gasPrice,nonce,chainId})

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesMessage to sign (UTF-8 text)
passwordYesKeystore password to decrypt the private key
walletIdYesWallet ID (UUID)

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
passwordYesKeystore password to decrypt the private key
walletIdYesWallet ID (UUID)
transactionYesTransaction input (SVM: {serialized} / EVM: {to,value,data,gasLimit,gasPrice,nonce,chainId})

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 10 tool updatesv0.1.0
    • First observedwallet_delete
    • First observedwallet_export
    • First observedwallet_generate
    • First observedwallet_get_balance
    • First observedwallet_get_public_key
    • First observedwallet_import
    • First observedwallet_list
    • First observedwallet_send_transaction
    • First observedwallet_sign_message
    • First observedwallet_sign_transaction

TDQS

A3.6/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

10 tools is well-scoped for a wallet server, covering key management, signing, broadcasting, and balance queries without redundancy. Each tool earns its place.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers