SVM-MCP

by rkmonarch

Not rated
GitHub

About

Interact with SOON and other SVM-based blockchains. Check balances, fetch recent transactions, and view token holdings.

Details

Author
rkmonarch
Categories
Database

Setup

Install SVM-MCP in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/rkmonarch/svm-mcp

Follow the installation instructions in the repository README, then restart your MCP client.

SVM-MCP: SOON Model Context Protocol Server

A Model Context Protocol (MCP) server that integrates Claude AI with SOON and other SVM-based blockchains. The server provides tools for checking balances, fetching recent transactions, and viewing token holdings on SOON's testnet and mainnet, for account balances, transactions, and token holdings.

This MCP server is designed to connect Claude with the SOON ecosystem, allowing it to:

- Query wallet balances on testnet and mainnet
- Fetch the most recent transactions for an address
- Check token holdings for any account

The current implementation uses the SOON's RPC endpoints, but can be easily modified to work with any Solana-compatible blockchain or custom SVM implementation.

- Get Balances: Fetch native token balances for any address on SOON testnet or mainnet
- Get Last Transaction: Retrieve the most recent transaction for an address
- Get Token Accounts: List all token accounts owned by an address

- Node.js (v16+)
- NPM or Bun package manager
- Claude Desktop (for local testing)

git clone https://github.com/rkmonarch/svm-mcp cd svm-mcp

The main server implementation is insrc/index.ts:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { Connection, PublicKey } from "@solana/web3.js"; import { z } from "zod"; const connectionTestnet = new Connection("https://rpc.testnet.soo.network/rpc"); const connectionMainnet = new Connection("https://rpc.mainnet.soo.network/rpc"); const server = new McpServer({ name: "svm-mcp", version: "0.0.1", capabilities: [ "get-soon-testnet-balance", "get-soon-testnet-last-transaction", "get-soon-testnet-account-tokens", "get-soon-mainnet-balance", "get-soon-mainnet-last-transaction", "get-soon-mainnet-account-tokens", ], });
server.tool( "get-soon-testnet-balance", "Get the balance of a address on the Soon testnet", { address: z.string().describe("The Solana address to get the balance of"), }, async ({ address }) => { try { const balance = await connectionTestnet.getBalance(new PublicKey(address)); return { content: [ { type: "text", text: Balance: ${balance}, }, ], }; } catch (error) { return { content: [ { type: "text", text: Error getting balance: ${error instanceof Error ? error.message : String(error)}, }, ], }; } } );
server.tool( "get-soon-testnet-last-transaction", "Get the last transaction of an address on the Soon testnet", { address: z .string() .describe("The Solana address to get the last transaction for"), }, async ({ address }) => { try { // Fetch the most recent transaction signatures for the address const signatures = await connectionTestnet.getSignaturesForAddress( new PublicKey(address), { limit: 1 } // Limit to just the most recent transaction ); if (signatures.length === 0) { return { content: [ { type: "text", text: "No transactions found for this address", }, ], }; } // Get the most recent transaction using its signature const latestSignature = signatures[0].signature; const transaction = await connectionTestnet.getConfirmedTransaction( latestSignature ); return { content: [ { type: "text", text: JSON.stringify(transaction), }, ], }; } catch (error) { return { content: [ { type: "text", text: Error getting transaction: ${error instanceof Error ? error.message : String(error)}, }, ], }; } } );
server.tool( "get-soon-testnet-account-tokens", "Get the tokens of a address on the Soon testnet", { address: z.string().describe("The Solana address to get the tokens of"), }, async ({ address }) => { try { const tokens = await connectionTestnet.getTokenAccountsByOwner( new PublicKey(address), { programId: new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), } ); return { content: [ { type: "text", text: JSON.stringify(tokens), }, ], }; } catch (error) { return { content: [ { type: "text", text: Error getting tokens: ${error instanceof Error ? error.message : String(error)}, }, ], }; } } );
async function main() { try { console.error("Starting MCP server..."); const transport = new StdioServerTransport(); console.error("Transport initialized, connecting to server..."); await server.connect(transport); console.error("Server connection established successfully"); // The server will keep running in this state } catch (error) { console.error("There was an error connecting to the server:", error); process.exit(1); } } main().catch((err) => { console.error("There was an error starting the server:", err); process.exit(1); });

To use this MCP server with Claude Desktop, add the following to yourclaude_desktop_config.jsonfile:

{ "mcpServers": { "svm-mcp": { "command": "bun", "args": ["/path/to/svm-mcp/build/index.js"] } } }

To use different RPC endpoints or connect to a different Solana-compatible blockchain, edit the connection URLs insrc/index.ts:

const connectionTestnet = new Connection("YOUR_TESTNET_RPC_URL"); const connectionMainnet = new Connection("YOUR_MAINNET_RPC_URL");

Once the MCP server is running and connected to Claude, you can use the following commands:

Can you check the balance of this SOON testnet address: <address>
What is the last transaction made by <address> on SOON testnet?
What tokens does <address> hold on SOON mainnet?

- Anthropic Claudefor the AI capabilities
-
Model Context Protocolfor enabling tool integration
-
Solana Web3.jsfor blockchain interaction
-
SOON Networkfor the SVM implementation used in this example

Official Airtable MCP server and skills for working with bases, records, workflows, and business operations from AI agents.

MCP Server For Apache Doris, an MPP-based real-time data warehouse.

Official MCP Server from Atlan which enables you to bring the power of metadata to your AI tools

Query Onchain data, like ERC20 tokens, transaction history, smart contract state.

Read and write access to your Baserow tables.

Introspect and query your apps deployed to Convex.

Interact with the data stored in Couchbase clusters using natural language.

Maritime intelligence for tracking vessels, analysing ports, and exploring ship data.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.