onchain-mcp
README.md
# onchain-mcp
A **Model Context Protocol (MCP)** server that gives any MCP client — Claude
Desktop, Claude Code, Cursor, etc. — live, read-only access to **Solana
on-chain data**. Ask natural-language questions like *"what SPL tokens does this
wallet hold?"* or *"what's the USD price of this mint?"* and the model answers
from real Solana mainnet RPC + Jupiter, no API key required.
## Tools
| Tool | What it does |
|------|--------------|
| `get_sol_balance(address)` | Native SOL balance of an account |
| `get_token_holdings(address)` | Non-zero SPL token balances of a wallet |
| `get_token_price(mint)` | USD price of a token mint (via Jupiter) |
| `get_transaction(signature)` | Parsed transaction summary (slot, fee, logs, success) |
| `get_account_info(address)` | Owner program, lamports, executable flag |
| `get_token_supply(mint)` | Total on-chain supply of a token mint |
| `get_recent_signatures(address)` | Recent transaction signatures for an account |
| `get_epoch_info()` | Current epoch / slot / block height / progress |
All endpoints are public. Point at a private RPC by setting `SOLANA_RPC_URL`
(and optionally `JUPITER_PRICE_API`).
## Run
```bash
# Run the server over stdio (what an MCP client launches):
uv run --with "mcp>=1.2" --with httpx onchain_mcp.py
```
### Use with Claude Desktop / Claude Code
Add to your MCP config (`claude_desktop_config.json` or `.mcp.json`):
```json
{
"mcpServers": {
"onchain": {
"command": "uv",
"args": ["run", "--with", "mcp>=1.2", "--with", "httpx",
"/absolute/path/to/onchain-mcp/onchain_mcp.py"]
}
}
}
```
Then ask, e.g.: *"Using the onchain tools, what's the USDC price and how much
SOL does `<address>` hold?"*
## Test
Live smoke tests against mainnet (asserts USDC ≈ $1, the SPL Token program is
executable, balance/holdings shapes):
```bash
uv run --python 3.12 --with "mcp>=1.2" --with httpx \
--with pytest --with pytest-asyncio pytest test_onchain_mcp.py -q
```
## Notes
- Read-only: the server never signs or sends transactions — it only queries
public chain state, so it is safe to expose to an LLM.
- Default RPC is `api.mainnet-beta.solana.com` (rate-limited); use a dedicated
RPC for heavy use.
## License
MIT
TDQS
A3.9/5.0
Scored across 8 tools
Disambiguation4/5
Most tools have distinct purposes, but get_account_info and get_sol_balance overlap because the former already returns lamports, which is the SOL balance. This could cause confusion for agents.
Naming Consistency5/5
All tools follow a consistent 'get_noun' pattern in snake_case, making it easy to predict tool names and understand their actions.
Tool Count5/5
With 8 read-only tools covering key Solana on-chain data (accounts, tokens, transactions, network info), the count is well-scoped and not excessive.
Completeness4/5
Covers essential read operations, but missing tools for querying program accounts or arbitrary account data, leaving minor gaps for advanced use cases.
Maintenance
ActivityInactive
ResponsivenessNo issues