Solana Debug Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Solana Debug Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Solana Debug MCP is a Model Context Protocol server for inspecting and debugging Solana transactions, accounts, Anchor IDLs, Anchor errors, and Program Derived Addresses from MCP-compatible clients.
This project is ready for local production-style MCP use over stdio. It can simulate base64 or base58 serialized Solana transactions, inspect account metadata, inspect legacy and versioned transaction instructions, fetch on-chain Anchor IDLs, decode supported Anchor account and instruction fields, look up built-in and IDL-provided Anchor errors, and derive PDAs.
simulate_transaction: Simulate a serialized Solana transaction through an RPC endpoint and summarize logs.decode_account: Fetch account metadata and decode supported Anchor account fields when an IDL is supplied or fetchable.decode_instruction: Inspect legacy/versioned instructions and decode supported Anchor instruction args when an IDL is supplied or fetchable.anchor_error_lookup: Look up common Anchor framework errors and custom IDL errors.pda_verify: Derive a PDA from seeds and check whether the account exists on chain.pda_verify supports typed seeds. Plain string seeds are still accepted as UTF-8 for backward compatibility.pnpm install
pnpm run buildFor local development:
pnpm run devFor production-style local execution:
pnpm startCreate a .env file from the example:
cp .env.example .envSupported environment variables:
# Optional. If set, the server uses Helius mainnet RPC by default.
HELIUS_API_KEY=your-helius-api-key
# Optional fallback RPC URL when HELIUS_API_KEY is not set.
SOLANA_RPC_URL=https://api.mainnet-beta.solana.com
# Documented for future cluster-aware IDL fetching. Currently unused.
SOLANA_CLUSTER=mainnet-betaRPC precedence in the current implementation:
rpc_url, where supportedHELIUS_API_KEY, if setSOLANA_RPC_URLhttps://api.mainnet-beta.solana.comBuild the project first:
pnpm run buildThen add the server to your Claude Desktop configuration.
macOS path:
~/Library/Application Support/Claude/claude_desktop_config.jsonExample configuration:
{
"mcpServers": {
"solana-debug": {
"command": "node",
"args": ["/absolute/path/to/solanaDebug/dist/index.js"],
"env": {
"HELIUS_API_KEY": "your-helius-api-key",
"SOLANA_RPC_URL": "https://api.mainnet-beta.solana.com"
}
}
}
}Restart Claude Desktop after editing the config.
All examples assume you already ran:
pnpm install
pnpm run buildReplace /absolute/path/to/solanaDebug with your local checkout path. Prefer passing secrets through the client config or process environment instead of committing them to source control.
Codex reads MCP servers from ~/.codex/config.toml.
[mcp_servers.solana-debug]
command = "node"
args = ["/absolute/path/to/solanaDebug/dist/index.js"]
startup_timeout_sec = 10
tool_timeout_sec = 60
[mcp_servers.solana-debug.env]
HELIUS_API_KEY = "your-helius-api-key"
SOLANA_RPC_URL = "https://api.mainnet-beta.solana.com"If you keep .env in the project root, you can omit the env table and set cwd so the server loads the local .env file:
[mcp_servers.solana-debug]
command = "node"
args = ["dist/index.js"]
cwd = "/absolute/path/to/solanaDebug"
startup_timeout_sec = 10
tool_timeout_sec = 60VS Code can use a workspace .vscode/mcp.json or user-level MCP config.
{
"servers": {
"solana-debug": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/solanaDebug/dist/index.js"],
"env": {
"HELIUS_API_KEY": "your-helius-api-key",
"SOLANA_RPC_URL": "https://api.mainnet-beta.solana.com"
}
}
}
}For a workspace-local setup:
{
"servers": {
"solana-debug": {
"type": "stdio",
"command": "node",
"args": ["dist/index.js"],
"cwd": "/absolute/path/to/solanaDebug"
}
}
}Hermes Agent uses mcp_servers in its YAML config. Hermes intentionally filters environment variables for stdio servers, so include any RPC secrets explicitly.
mcp_servers:
solana-debug:
command: "node"
args:
- "/absolute/path/to/solanaDebug/dist/index.js"
env:
HELIUS_API_KEY: "your-helius-api-key"
SOLANA_RPC_URL: "https://api.mainnet-beta.solana.com"
enabled: true
timeout: 120
connect_timeout: 60
tools:
resources: false
prompts: falseOpenClaw-managed MCP servers can be configured under mcp.servers. If sandbox tool filtering is enabled, allow MCP plugin tools via bundle-mcp or group:plugins.
{
mcp: {
servers: {
"solana-debug": {
command: "node",
args: ["/absolute/path/to/solanaDebug/dist/index.js"],
env: {
HELIUS_API_KEY: "your-helius-api-key",
SOLANA_RPC_URL: "https://api.mainnet-beta.solana.com",
},
},
},
},
tools: {
sandbox: {
tools: {
alsoAllow: ["bundle-mcp"],
},
},
},
}Simulates a serialized Solana transaction and returns simulation status, logs, units consumed, and pattern-based analysis.
Input:
{
"transaction": "base64-or-base58-serialized-transaction",
"rpc_url": "https://api.mainnet-beta.solana.com"
}Fields:
transaction: Required string. Accepts base64 or base58 serialized legacy or versioned transaction bytes.rpc_url: Optional string. Overrides environment RPC defaults for this call.Output shape:
{
"ok": true,
"data": {
"success": false,
"error_code": "custom program error...",
"error_message": "Transaction simulation failed",
"transaction_type": "legacy",
"encoding": "base64",
"logs": [],
"analysis": "Pattern-based explanation"
}
}Implementation:
src/index.ts.simulateTransaction in src/tools/simulate.ts.RPCService.simulateTransaction in src/services/rpc.ts.generateAnalysis in src/services/analyzer.ts.Fetches basic account information from RPC.
Input:
{
"address": "account-public-key",
"program_id": "expected-owner-program-id"
}Fields:
address: Required account public key.program_id: Required expected owner program ID. The response reports whether it matches the fetched account owner.Output shape:
{
"ok": true,
"data": {
"address": "account-public-key",
"program_id": "expected-owner-program-id",
"owner_matches_program_id": true,
"account_type": "unknown",
"data": {
"lamports": 1000000,
"sol_balance": 0.001,
"owner": "actual-owner-program-id",
"executable": false,
"data_length": 128,
"note": "Full IDL decoding not yet implemented in MVP. Raw account data available."
}
}
}Implementation:
src/index.ts.decodeAccount in src/tools/decode.ts.RPCService.getAccountInfo.src/services/idl.ts contains placeholder IDL-service code but is not wired into this tool yet.Inspects one or all instructions in a serialized legacy transaction.
Input:
{
"transaction": "base64-or-base58-serialized-transaction",
"instruction_index": 0
}Fields:
transaction: Required string. Accepts base64 or base58 serialized legacy or versioned transaction bytes.instruction_index: Optional number. When omitted, all instructions are returned.Output shape for one instruction:
{
"ok": true,
"data": {
"transaction_type": "legacy",
"encoding": "base64",
"instruction": {
"index": 0,
"program_id": "program-public-key",
"accounts": [
{
"pubkey": "account-public-key",
"isSigner": true,
"isWritable": true
}
],
"data": "base64-instruction-data",
"data_length": 16
}
}
}Implementation:
src/index.ts.decodeInstruction in src/tools/decode.ts.src/services/transaction.ts.Looks up a common Anchor framework error by decimal or hexadecimal code.
Input:
{
"error_code": "0x1771",
"program_id": "optional-program-id"
}or:
{
"error_code": "6001"
}Fields:
error_code: Required string. Accepts decimal, 0x hex, or 0X hex.program_id: Optional string. Used to fetch an on-chain Anchor IDL for custom error lookup when idl is not supplied.Output shape:
{
"ok": true,
"data": {
"error_code": "0x1771",
"error_code_decimal": 6001,
"error_name": "Unknown",
"description": "Error code not found in Anchor error database",
"common_causes": ["Custom program error", "Unknown error type"],
"suggested_fixes": [
"Check program source code for custom error definitions",
"Review transaction logs for more context",
"Verify error code is from Anchor framework"
],
"program_id": "unknown"
}
}Implementation:
src/index.ts.src/tools/errors.ts.Derives a Program Derived Address and checks whether the derived account exists.
Input:
{
"program_id": "program-public-key",
"seeds": [
{ "type": "utf8", "value": "seed" },
{ "type": "pubkey", "value": "public-key-seed" }
]
}Fields:
program_id: Required program public key.seeds: Required array of typed seeds. Supported types are utf8, pubkey, hex, and base64. Plain strings are accepted as UTF-8 seeds for backward compatibility.Output shape:
{
"ok": true,
"data": {
"address": "derived-pda",
"bump": 255,
"exists": true,
"program_id": "program-public-key",
"seeds": [{ "type": "utf8", "value": "seed" }],
"account_data": {
"lamports": 1000000,
"owner": "owner-public-key",
"data_length": 128
}
}
}Implementation:
src/index.ts.pdaVerify in src/tools/pda.ts.PublicKey.findProgramAddressSync.RPCService.getAccountInfo.src/
├── index.ts MCP server entry point and tool registration
├── tools/
│ ├── simulate.ts simulate_transaction handler
│ ├── decode.ts decode_account and decode_instruction handlers
│ ├── errors.ts anchor_error_lookup handler and error table
│ └── pda.ts pda_verify handler
├── services/
│ ├── rpc.ts Solana RPC wrapper
│ ├── transaction.ts Shared transaction parser and instruction views
│ ├── idl.ts Placeholder IDL fetching and decoding service
│ └── analyzer.ts Transaction log pattern matching
└── utils/
└── types.ts Shared result helpers and interfacesInstall dependencies:
pnpm installRun the server from TypeScript:
pnpm run devTypecheck and build:
pnpm run typecheck
pnpm run buildRun tests:
pnpm testRun the opt-in live RPC smoke test:
pnpm run test:liveThis uses your configured .env or process environment and reaches the configured Solana RPC provider.
Run the built server:
pnpm startClean generated output:
pnpm run cleansrc/tools/.server.tool(...) in src/index.ts.createResult or createErrorResult.Tools return:
{
content: [{ type: "text", text: "..." }]
}JSON payloads are currently serialized into the text field. Success responses use { "ok": true, "data": ... }; failures use { "ok": false, "error": "..." }.
RPCService wraps @solana/web3.js Connection creation and common calls. New RPC-backed features should be added there when they are reusable by multiple tools.
src/services/idl.ts supports Anchor IDL fetching and decoding:
bool, u8, i8, u16, i16, u32, i32, u64, i64, string, bytes, publicKey, and pubkey.option, vec, fixed arrays, and nested defined structs.anchor_error_lookup.IDL support should still add enum decoding and broader fixture coverage for unusual Anchor IDL shapes.
Unable to parse transactionThe transaction field must be a serialized Solana transaction encoded as base64 or base58. JSON transaction objects and signatures are not accepted.
Set HELIUS_API_KEY or SOLANA_RPC_URL in .env. The RPC wrapper has retry and timeout handling, but persistent rate limits require a better RPC provider or a dedicated key.
.env is not loadingThe server loads .env from the current working directory. Start the server from the project root, or pass environment variables through your MCP client config.
This is expected. Run it explicitly:
pnpm run test:livepnpm run typecheck.pnpm test.{ "ok": true, "data": ... } or { "ok": false, "error": "..." }.The project has a focused Node test suite for transaction parsing, instruction inspection, Anchor error lookup, and structured errors. More unit and integration coverage is still needed before production use. See PRODUCTION_PLAN.md for the recommended production-readiness checklist.
This project is production-ready for local stdio MCP usage. Hosted HTTP/SaaS deployment is not implemented.
See SECURITY.md. Do not commit .env files or private RPC keys. Serialized transactions and account addresses may be sent to the configured RPC provider.
See RELEASE.md for the package release checklist.
See USER_STORIES.md for concrete examples of how Solana developers can use this MCP server.
See TESTING_GUIDE.md for a hands-on path after cloning the repo.
MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.