Paste one connector URL
Claude or ChatGPT connects to https://ringside.ghoste.trade/mcp. You sign in with your Solana wallet; Ringside creates an agent key encrypted on the server. The dashboard uses the same owner session.
Ringside gives MCP agents a payment wallet on Solana Rings, with owner-defined spending rules and a seller verification flow. This guide covers setup, daily use, and the limits of the current devnet release.
The two modes share the MCP tool surface. They differ in where the agent key is held and how you connect.
Claude or ChatGPT connects to https://ringside.ghoste.trade/mcp. You sign in with your Solana wallet; Ringside creates an agent key encrypted on the server. The dashboard uses the same owner session.
Run the stdio MCP server alongside your agent. Its keypair and policy live locally; your owner wallet signs changes. Use this mode when you want local key custody.
Available to build from sourceSet up self-hostingUse Node 24 or newer and pnpm 11. Clone the repository with its upstream submodules, then build the packages.
git clone --recurse-submodules https://github.com/mayorXBT/Ringside-MCP.git
cd Ringside-MCP
pnpm install --frozen-lockfile
pnpm buildSet a Helius devnet API key and initialize a dedicated agent wallet. init prints the public funding address. Keep the key file out of Git and give it mode 600.
export HELIUS_API_KEY='your-devnet-key'
node packages/mcp/dist/index.js init --owner YOUR_OWNER_WALLET_ADDRESSHelius’s localnet guide uses zolana dev start to run a test validator, Photon indexer, and prover. Ringside selects these endpoints when RINGSIDE_NETWORK=localnet. Use this for repeatable development and swap or escrow fixture testing.
cargo install --git https://github.com/helius-labs/zolana --tag v0.3.0-alpha zolana-cli
zolana dev startexport RINGSIDE_NETWORK=localnet
# RPC: 127.0.0.1:8899 · indexer: 127.0.0.1:8784 · prover: 127.0.0.1:3001
node packages/mcp/dist/index.js init --owner YOUR_OWNER_WALLET_ADDRESSThe example CLI installation comes from Helius’s guide; the Ringside repo can also use its checked-out Zolana source. Localnet balances and transaction signatures are separate from devnet. Never treat a localnet pass as a devnet pass.
Run the full localnet demoAdd the stdio server to Claude Desktop with absolute paths. Replace the API key and key file path with your own values. The same command and environment work in Claude Code and Cursor.
{
"mcpServers": {
"ringside": {
"command": "node",
"args": ["--use-env-proxy", "/absolute/path/Ringside-MCP/packages/mcp/dist/index.js"],
"env": {
"HELIUS_API_KEY": "your-devnet-key",
"RINGSIDE_KEYPAIR": "/absolute/path/agent.json"
}
}
}
}Restart your MCP client after saving its configuration. Ask it for wallet_info, then register_private_wallet. Registration is required before private transfers. The server has 25 registered tools; spending tools are marked destructive so clients can request confirmation.
Ringside is an MCP layer over the Helius Zolana client. The agent signs Solana transactions with its own wallet. A Helius-compatible RPC, indexer, and prover support the private operations; the Solana Privacy Program verifies proofs on-chain.
A deposit starts with visible funds and creates an encrypted private output.
The indexer returns encrypted outputs associated with the wallet. Ringside uses the agent key to decrypt its balance and history.
Transfers and withdrawals use decrypted spendable state to build a transaction and request a zero-knowledge proof.
Helius calls these outputs Private Solana Token Accounts. Its guides use a view tag to find encrypted outputs; finding an output is different from decrypting it. Ringside’s syncWallet call handles fetching and decryption for the balance and history tools. On localnet, zolana dev start supplies a validator, Photon indexer, and prover.
Use deposit after wallet registration and public funding. Ringside builds a deposit to the agent’s shielded address, submits it, and returns a transaction signature and slot. The deposit itself needs no ZK proof; the private balance it creates is encrypted.
SOL or the SPL token mint address.0.01.For an SPL mint that has no private interface yet, use deposit_with_interface_setup with mint, amount, and source_token_account. That helper creates the interface when needed, then deposits. The current helper uses the standard SPL Token Program; do not assume Token-2022 interface setup works through that shortcut.
private_transfer takes recipient, asset, and amount. Ringside resolves the recipient’s registered private address, checks owner policy, syncs spendable notes, builds the transfer, requests a proof, and submits the transaction. An unregistered recipient is rejected before submission.
SOL or an allowed SPL mint address.For the permissionless default confidential Ring, Helius documents encrypted asset and amount, with sender and recipient public. Custom anonymous Rings have different visibility, but Ringside’s current default flow does not claim anonymous sender or recipient addresses. The chain still exposes a transaction signature and timing.
withdraw takes asset, amount, and an optional recipient. If no recipient is given, Ringside withdraws to the agent’s own public address. The tool syncs private state, requests a proof, and submits the withdrawal after policy checks.
SOL or the SPL mint held in the private balance.The withdrawal reveals its asset, amount, and recipient on-chain. The remaining private balance stays encrypted. Helius documents this distinction explicitly: moving funds out of a private balance is a public exit, not a hidden payment.
Call get_private_balance or its alias sync_balance after a deposit or payment. Ringside syncs encrypted outputs from the indexer and decrypts them with the agent key. The result lists each asset, a formatted amount, base units, and the number of spendable notes.
The indexer does not return a plaintext balance to arbitrary callers. Helius’s guide shows a view tag locating matching encrypted outputs and a local decryption step producing spendable balances. Ringside wraps those steps through the pinned Zolana client. A stale or unavailable indexer can delay a new balance appearing even when a transaction is confirmed.
get_private_history and read_history accept an optional limit from 1 to 500; the default is 50. Ringside syncs encrypted transactions and returns recent decrypted entries with signature, slot, kind, direction, status, asset, and amount.
History sync belongs in wallet restore, reconnect, and gap recovery paths, not only after a payment. Helius separates balance decryption from history decryption because a balance snapshot alone does not explain the activity behind it. A viewing key can authorize read access; browser-side viewing-key decryption in Ringside’s auditor view remains unverified.
Register the agent wallet, send devnet SOL to its public address, then call deposit to move funds into its private balance. The funding and deposit amounts remain public on-chain.
Call get_private_balance to see the decrypted balance available to this agent. The agent reads its own private notes locally or in the hosted request context.
Call private_transfer with the recipient, asset, and amount. Ringside checks the kill switch, recipient registration, allowlist, and spend caps before submission.
Use get_private_history for activity, or withdraw to return funds to a public wallet. Withdrawal details are public.
Ringside enforces per-transaction, session, and rolling 24-hour caps. Owners can restrict recipients, make an agent read-only, or stop all spending with a kill switch. The agent has get_policy for inspection, but no tool to change its own policy.
The owner dashboard requires a wallet signature for policy changes. Self-hosted policy and pairing data remain on the agent machine. Hosted mode stores the agent key encrypted at rest and enforces a durable spend reservation before sending a transaction. These defaults are for devnet test funds, not a guarantee against loss.
Open owner dashboardNames below are the names your MCP client discovers. Aliases are listed so prompts can use either wording.
wallet_info, register_private_wallet, create_private_wallet, deposit, sync_balance, get_private_balance, read_history, get_private_history
private_transfer, withdraw, deposit_with_interface_setup, create_test_token, get_policy, create_payment_request, pay_payment_request, verify_payment
swap_make_order, swap_list_orders, swap_take_order, swap_take_order_verifiable, swap_cancel_order, escrow_lock, escrow_list, escrow_withdraw, escrow_release
| Tool | Input fields | Purpose / availability |
|---|---|---|
wallet_info | — | Read public address, registration, network, fee balance, and policy summary. |
register_private_wallet | — | Register the agent’s private address. Sends a transaction. |
create_private_wallet | — | Alias of register_private_wallet. |
deposit | asset, amount; source_token_account?, token_program? | Move public SOL or SPL tokens to the agent’s private balance. |
sync_balance | — | Sync and decrypt private balances. |
get_private_balance | — | Alias of sync_balance. |
read_history | limit? (1–500; default 50) | Sync and decrypt recent private activity. |
get_private_history | limit? (1–500; default 50) | Alias of read_history. |
private_transfer | recipient, asset, amount | Pay a registered recipient after policy checks. |
withdraw | asset, amount; recipient? | Move private funds to a public address. |
get_policy | — | Read the current owner policy and SOL budget. |
create_test_token | amount; decimals? (0–9) | Create a devnet SPL test mint and mint tokens. |
deposit_with_interface_setup | mint, amount, source_token_account | Create a standard SPL private interface if needed, then deposit. |
create_payment_request | asset, amount, resource; ttl_seconds? | Create a seller request; TTL defaults to 300 seconds. |
pay_payment_request | request | Pay a valid seller request and return payment header data. |
verify_payment | signature, nonce; asset?, min_amount?, expected_payer?, consume? | Verify a stored request and optionally consume it against replay. |
swap_make_order | source_asset, source_amount, destination_asset, destination_amount, taker, expires_in_seconds; take_mode? | Tier C · engine unavailable. |
swap_list_orders | role; timeout_seconds? | Tier C · engine unavailable. |
swap_take_order | order_utxo_hash | Tier C · engine unavailable. |
swap_take_order_verifiable | order_utxo_hash | Tier C · engine unavailable. |
swap_cancel_order | order_utxo_hash | Tier C · engine unavailable. |
escrow_lock | asset, amount; unlock_in_seconds?, unlock_at?, label?, beneficiary? | Tier C · engine unavailable. |
escrow_list | status? | Tier C · engine unavailable. |
escrow_withdraw | escrow_id | Tier C · engine unavailable. |
escrow_release | escrow_id; recipient? | Tier C · engine unavailable. |
Fields ending in ? are optional. Amounts are decimal strings. The nine swap and escrow tools are discoverable but return an unavailable error in this release.
A seller can request payment for a resource, the buyer agent can pay privately, and the seller can verify the resulting receipt before returning data. The demo API responds with HTTP 402 until verification passes; replayed receipts are rejected.
The SOL seller flow passed on localnet. The request nonce is held by the verifier and has a short expiry; it is not yet bound to an on-chain memo. The verifier also rejects payments older than the request.
Run the seller demo“Private” describes the payment fields hidden by the default ring transfer. It does not make every part of a transaction invisible.
| Action | Hidden on-chain | Public on-chain |
|---|---|---|
| Private transfer | Amount, asset | Sender, recipient, signature, timing |
| Deposit | — | Wallet, amount, asset |
| Withdrawal | — | Recipient, amount, asset |
| Seller payment | Amount, asset | Payer, seller, signature |
Funding is public; payments are private. A public observer may infer relationships from timing and visible addresses. In self-hosted mode the agent key remains local. In hosted mode Ringside holds an encrypted agent key and can access it to execute authorized requests.
Read the security model| Capability | Current result |
|---|---|
| Core SOL payment and withdrawal | Passed end to end on Zolana localnet. |
| Devnet registration and deposit | Registration, deposit, private transfer, and withdrawal passed using Zolana 0.4.0-alpha; The MCP server uses Zolana 0.4.0-alpha. |
| Hosted OAuth and MCP | Local PostgreSQL test passed registration, PKCE, signed login, 25 tools, and policy denial. Hosted signup and ChatGPT connector login are live on devnet. A hosted OAuth test client completed a real private payment. |
| Swap and escrow | Tier C. Tools are listed, but engine actions are unavailable. |
| Claude / ChatGPT hosted connector | ChatGPT connector login is verified; Claude account-side payment remains an acceptance check. |
This table reflects the Oct 12, 2026 devnet release. STATUS.md is the detailed, updated record of checks, blockers, and next steps.
Confirm Node 24+, run pnpm build, and use absolute paths in the client configuration. Check that the key file exists, has mode 600, and stays outside the repository.
Confirm HELIUS_API_KEY is set for devnet. Zolana 0.4.0-alpha transfers passed on devnet, but prover and indexer health can change. Check the demo health indicator and retry; the MCP server uses Zolana 0.4.0-alpha.
Run the local control API on the agent machine, generate a pairing token, and select Self-host (advanced). Keep RINGSIDE_HOME consistent across the MCP process and dashboard control API.
Production Postgres is connected. Check the hosted readiness endpoint and required environment variables if login reports setup pending; ChatGPT connector login is verified; retry if the service is temporarily unavailable.
Ringside translates the Zolana wallet operations into MCP tools and adds owner policy and seller verification. For protocol semantics and the underlying TypeScript examples, consult the official Helius Privacy guides ↗. Ringside’s release status and product behavior are documented here.