SVM-MCP
Interactúa con SOON y otras blockchains basadas en SVM. Consulta saldos, obtén transacciones recientes y visualiza tenencias de tokens.
Documentación
SVM-MCP: Servidor de Model Context Protocol de SOON
Un servidor de Model Context Protocol (MCP) que integra Claude AI con SOON y otras blockchains basadas en SVM. El servidor proporciona herramientas para consultar saldos, obtener transacciones recientes y ver tenencias de tokens en la testnet y mainnet de SOON, para saldos de cuentas, transacciones y tenencias de tokens.
Resumen
Este servidor MCP está diseñado para conectar Claude con el ecosistema SOON, permitiéndole:
- Consultar saldos de billeteras en testnet y mainnet
- Obtener las transacciones más recientes de una dirección
- Verificar tenencias de tokens de cualquier cuenta
La implementación actual utiliza los endpoints RPC de SOON, pero se puede modificar fácilmente para trabajar con cualquier blockchain compatible con Solana o implementación SVM personalizada.
Características
- Obtener Saldos: Consultar saldos de tokens nativos para cualquier dirección en la testnet o mainnet de SOON
- Obtener Última Transacción: Recuperar la transacción más reciente de una dirección
- Obtener Cuentas de Tokens: Listar todas las cuentas de tokens propiedad de una dirección
Requisitos previos
- Node.js (v16+)
- NPM o administrador de paquetes Bun
- Claude Desktop (para pruebas locales)
Instalación
- Clona el repositorio:
git clone https://github.com/rkmonarch/svm-mcp
cd svm-mcp
- Instala las dependencias:
npm install
# or
bun install
- Compila el proyecto:
npm run build
# or
bun run build
Estructura del Proyecto
La implementación principal del servidor está en src/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",
],
});
Implementaciones de Herramientas
Obtener Saldo
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)}`,
},
],
};
}
}
);
Obtener Última Transacción
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)}`,
},
],
};
}
}
);
Obtener Cuentas de Tokens
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)}`,
},
],
};
}
}
);
Inicialización del Servidor
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);
});
Configuración
Configuración de Claude Desktop
Para usar este servidor MCP con Claude Desktop, agrega lo siguiente a tu archivo claude_desktop_config.json:
{
"mcpServers": {
"svm-mcp": {
"command": "bun",
"args": ["/path/to/svm-mcp/build/index.js"]
}
}
}
Personalización de Endpoints RPC
Para usar diferentes endpoints RPC o conectarte a una blockchain compatible con Solana diferente, edita las URLs de conexión en src/index.ts:
const connectionTestnet = new Connection("YOUR_TESTNET_RPC_URL");
const connectionMainnet = new Connection("YOUR_MAINNET_RPC_URL");
Uso con Claude
Una vez que el servidor MCP esté en ejecución y conectado a Claude, puedes usar los siguientes comandos:
Consultar el Saldo de una Dirección
Can you check the balance of this SOON testnet address: <address>
Obtener Transacciones Recientes
What is the last transaction made by <address> on SOON testnet?
Recuperar Tenencias de Tokens
What tokens does <address> hold on SOON mainnet?
Agradecimientos
- Anthropic Claude por las capacidades de IA
- Model Context Protocol por habilitar la integración de herramientas
- Solana Web3.js por la interacción con blockchain
- SOON Network por la implementación SVM utilizada en este ejemplo