Solutions · AI agents
MadeOnSol gives AI agents Solana onchain data through three routes: an MCP server that exposes MadeOnSol API endpoints as typed tools, x402 endpoints an agent pays per call in USDC without an account, and the REST API for agent backends; none of them signs or sends trades.
An agent becomes useful when a question turns into a deterministic call with a structured answer. MadeOnSol supplies the call and the answer; the reasoning and any action stay with your agent.
A Free key runs the MCP server on the free routes, live feeds 5 minutes delayed; token risk and wallet tools from Pro. x402 needs no plan: each call is paid in USDC.
Three ways an agent gets in
MCP server
mcp-server-madeonsol 3.1.1: API endpoints as typed tools for Claude Desktop, Cursor, Claude Code and other MCP clients.
Auth: With an msk_ API key: all 104 tools. With a Solana wallet (x402 mode): 12 KOL, deployer and sniper tools, paid per call.
stdiotools/callmadeonsol_token_risk
x402 pay per call
Priced endpoints answer an unpaid request with HTTP 402 and a price; the agent pays in USDC and retries. The madeonsol-x402 client or any x402 HTTP client reaches every priced route, token risk and wallet PnL included.
Auth: No account, no key: the payment is the credential
HTTP 402PAYMENT-SIGNATUREUSDC
REST API from your backend
Your agent framework defines its own tools and calls /api/v1 through an SDK.
Auth: msk_ API key, kept server-side
/api/v1MadeOnSolREST
The problem
A language model cannot read Solana. Handed raw transactions or a scraped page, it guesses. It needs tools with fixed arguments that return named fields, say what could not be observed, and never move funds, plus a way to pay or authenticate that works without a person in the loop.
Show me
The API-key path: the MCP server started with MADEONSOL_API_KEY. One question, two tool calls, real tool names and schemas. Values are illustrative and match the token risk example.
Asked "check 9kQuW3...pump and who made it", the model finds madeonsol_token_risk in the tool list: one required argument, marked read-only.
{
"name": "madeonsol_token_risk",
"description": "Transparent 0–100 token risk score (higher = riskier): risk evidence for your own policy, not a verdict. …",
"inputSchema": {
"type": "object",
"properties": {
"mint": { "type": "string", "description": "Token mint address (base58)" }
},
"required": ["mint"]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
}
}The client sends tools/call and the server calls the /api/v1 route with your key. madeonsol_token_risk is not registered in keyless x402 mode; keyless, the same route is reached through the madeonsol-x402 client (see the x402 section).
// MCP client → mcp-server-madeonsol (JSON-RPC over stdio)
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "madeonsol_token_risk",
"arguments": { "mint": "9kQuW3...pump" }
}
}
// mcp-server-madeonsol → MadeOnSol, with MADEONSOL_API_KEY set:
// GET https://madeonsol.com/api/v1/tokens/9kQuW3...pump/risk
// Authorization: Bearer msk_...6 factors added points, and LP custody is listed as not assessed. The agent can quote the evidence and see that the creator sold most of its self-buy.
// The tool returns one text block: the endpoint's JSON, as a string.
{
"mint": "9kQuW3...pump",
"risk_score": 47,
"band": "caution",
"factors": [
{
"key": "liquidity",
"status": "warn",
"points": 8,
"detail": "Low liquidity ($6,400)."
},
{
"key": "liquidity_ratio",
"status": "warn",
"points": 5,
"detail": "Liquidity is 3.1% of market cap."
},
{
"key": "lp_burn",
"status": "warn",
"points": 8,
"detail": "LP burn/lock status unknown …"
},
{
"key": "bundled_open",
"status": "warn",
"points": 6,
"detail": "Elevated launch concentration (27.4 SOL in the first 20 buyers)."
},
{
"key": "deployer_reputation",
"status": "danger",
"points": 12,
"detail": "Deployer has bonded only 4% of 50 tokens."
},
{
"key": "kol_distribution",
"status": "warn",
"points": 8,
"detail": "Tracked KOLs are net-distributing this token."
}
],
"assessment": {
"status": "complete",
"unknown_inputs": [],
"not_assessed": [
"lp_custody"
]
},
"score_version": "v2",
"dev": {
"wallet": "7Dv4tP...Qm2e",
"buy_tokens": 34120000,
"sold_tokens": 30000000,
"wallet_empty": false,
"transfer_status": "none_detected"
},
"as_of": "2026-09-25T10:00:00.000Z"
}dev.wallet becomes the argument of madeonsol_deployer_profile: the creator's record, available on a Free key.
// tools/call madeonsol_deployer_profile { "wallet": "7Dv4tP...Qm2e" }
// → GET /api/v1/deployer-hunter/7Dv4tP...Qm2e
{
"deployer": {
"wallet_address": "7Dv4tP...Qm2e",
"tier": "cold",
"is_tracked": false,
"total_tokens_deployed": 50,
"total_bonded": 2,
"instant_bonds": 0,
"bonding_rate": 0.04,
"recent_bond_rate": 0,
"recent_outcomes": "DDDDDDDDDD",
"runner_rate": 0,
"last_deploy_at": "2026-09-25T09:31:07.000Z"
}
}Errors arrive as results
A failed call is also a text block, such as "Error 403: …" when the plan does not include the route or "Error 503: …" with risk_inputs_unavailable. The agent has to read it; nothing is thrown.
readOnlyHint
Reads carry readOnlyHint: true. Tools that create or change rules, alerts, watchlists or webhooks carry readOnlyHint: false, so a client can ask before calling them.
Server instructions
On connect the server tells the model to call madeonsol_discovery first and to try a single-item lookup before a heavier call on the same mint or wallet.
1 · Agent
Question
A user or a task asks about a mint, a wallet or a creator.
2 · Agent
Tool choice
The model reads the tool list and fills in the arguments.
3 · MadeOnSol
MCP call
With a key, the server calls the /api/v1 endpoint. In x402 mode, only the keyless tools exist and each call is paid.
4 · MadeOnSol
Structured result
Named fields, factor points and what could not be observed.
5 · Agent
Agent reasoning
The agent follows a field, answers, or asks the user. It never trades through MadeOnSol.
Try it
Add the MCP server to Claude Desktop, Cursor or Claude Code with a free key and ask about a token. Or send an unpaid request to an x402 route and read the 402 your agent will answer.
MCP
mcp-server-madeonsol has 104 tools, each a thin wrapper over one MadeOnSol endpoint. Which of them register depends on how you authenticate. Install steps and client configs live on the MCP page.
| Mode | Tools | Calls |
|---|---|---|
API keyMADEONSOL_API_KEY | All 104 tools are registered. Each call keeps the plan gate of its endpoint. | /api/v1 with Authorization: Bearer msk_... |
x402, keylessSVM_PRIVATE_KEYX402_PAY_TOX402_FEE_PAYERX402_MAX_AMOUNT_ATOMICX402_MAX_TOTAL_AMOUNT_ATOMICSVM_RPC_URL | The 12 tools on the keyless rail (KOL, deployer and sniper reads) plus madeonsol_discovery. Key-only tools, including madeonsol_token_risk and the wallet tools, are not registered, and 13 more are listed but answer with an error that asks for a key. | /api/x402, each call paid in USDC within the per-call and lifetime caps you set. Startup fails without them. |
HTTP transportMCP_TRANSPORT=httpMCP_HTTP_TOKEN | Same tools as the API-key mode, for one operator on loopback. | Refuses to start when a wallet key is configured: HTTP mode never carries a payer. |
Keyless tools: madeonsol_kol_feed, madeonsol_kol_coordination, madeonsol_kol_leaderboard, madeonsol_deployer_alerts, madeonsol_kol_pairs, madeonsol_deployer_trajectory, madeonsol_kol_hot_tokens, madeonsol_kol_token_entry_order, madeonsol_kol_compare_wallets, madeonsol_kol_alerts_recent, madeonsol_kol_trending_tokens, madeonsol_sniper_recent.
Listed in x402 mode but need a key (they answer with an error text): madeonsol_kol_timing, madeonsol_deployer_stats, madeonsol_deployer_leaderboard, madeonsol_deployer_profile, madeonsol_deployer_tokens, madeonsol_deployer_alert_stats, madeonsol_deployer_best_tokens, madeonsol_deployer_recent_bonds, madeonsol_kol_pnl, madeonsol_sniper_by_deployer, madeonsol_sniper_watchlist_list, madeonsol_sniper_watchlist_add, madeonsol_sniper_watchlist_remove.
Tokens
Snapshot, risk factors, holders, candles, many mints per call
madeonsol_token_getmadeonsol_token_riskmadeonsol_tokens_batch_riskmadeonsol_token_holdersmadeonsol_token_candles
Wallets
Flags, PnL, open positions, bulk reputation
madeonsol_wallet_statsmadeonsol_wallet_pnlmadeonsol_wallet_batch_classify
KOL and alpha wallets
Tracked-trader trades, convergence and rankings
madeonsol_kol_feedmadeonsol_kol_coordinationmadeonsol_alpha_leaderboard
Deployers
Creator record now and on a past date, launch alerts
madeonsol_deployer_profilemadeonsol_deployer_as_ofmadeonsol_deployer_alerts
Rules and deliveryreadOnlyHint: false
Configure copy-trade rules, price alerts, watchlists and webhooks in your account
madeonsol_copytrade_createmadeonsol_price_alerts_createmadeonsol_wallet_tracker_addmadeonsol_create_webhook
Account and catalog
Tier, quota and the priced keyless catalog
madeonsol_memadeonsol_discovery
No trade tool
No tool builds, signs or sends a swap. Rule tools make MadeOnSol notify you; your agent and its own stack decide and execute.
The only signature is the data fee
In x402 mode the server signs a USDC payment for a call, and only after checking payee, fee payer, asset, network and your caps.
Same API underneath
A tool returns what its endpoint returns, with the same plan gate and the same free-plan delay on live feeds.
x402
MCP decides how an agent calls a tool; x402 decides how one HTTP request gets paid. 25 Solana routes take USDC per call, from $0.005 to $0.02, with no account. The full catalog and protocol notes are on the x402 page.
1 · Request
The agent sends a plain GET to an /api/x402 route. No key, no account.
2 · HTTP 402
The answer names the scheme, network, asset, amount and payee in accepts[], in the body and base64 in a header.
PAYMENT-REQUIRED
3 · Pay and retry
The client checks the offer against its own policy, signs a USDC payment and repeats the request with the proof.
PAYMENT-SIGNATUREX-PAYMENT
4 · Data
The payment is verified and settled, then the route answers with the same JSON as its /api/v1 twin.
PAYMENT-RESPONSE
| Client | Reaches keyless | Does not reach |
|---|---|---|
| mcp-server-madeonsol, x402 mode | The 12 keyless tools: KOL feed, coordination, leaderboard, pairs, hot and trending tokens, entry order, wallet compare and alerts; deployer alerts and trajectory; sniper deploys. | Token risk, token snapshot, wallet stats and PnL, candles and the other priced token and wallet routes: their tools register only with a key. |
| madeonsol-x402 client (MadeOnSolX402) | Priced routes through its methods, including tokenRisk, token, walletStats, walletPnl. | Streams, webhooks, rules and key-only routes such as holders or surges. |
| Any x402 HTTP client | Every priced route; GET /api/x402 lists each one with its price and parameters. | The same key-only surfaces. |
// GET /api/x402/tokens/9kQuW3...pump/risk, no payment
// amount is atomic USDC (6 decimals): 20000 = $0.02
{
"x402Version": 2,
"error": "Payment required",
"resource": {
"url": "https://madeonsol.com/api/x402/tokens/9kQuW3...pump/risk",
"mimeType": "application/json"
},
"accepts": [
{
"scheme": "exact",
"network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"amount": "20000",
"asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"payTo": "GLu63pRCYrp4BJu5P5ciYKxgeZFW9c8TJ8jWzK3TB9AR",
"maxTimeoutSeconds": 60,
"extra": {
"feePayer": "2wKupLR9q6wXYppw8Gr2NvWxKBUqm4PPJKkQfoxHDBg4"
}
}
]
}
// + description, outputSchema and extensions.bazaar (discovery metadata)import { MadeOnSolX402 } from "madeonsol-x402";
// Required before the client signs anything: who may be paid, and how much.
const agent = new MadeOnSolX402({
privateKey: process.env.SVM_PRIVATE_KEY!,
paymentPolicy: {
payTo: "GLu63p...B9AR", // merchant, from /x402, not from the 402
feePayer: "2wKupL...xHDBg4", // facilitator fee payer
maxAmountAtomic: "20000", // per call (0.02 USDC)
maxTotalAmountAtomic: "1000000", // per client instance (1 USDC)
rpcUrl: process.env.SVM_RPC_URL!,
},
});
// GET /api/x402/tokens/{mint}/risk: 402, pay within policy, retry, JSON.
const risk = await agent.tokenRisk("9kQuW3...pump");Inputs checked before settlement
For token risk, the score inputs are loaded after the payment is verified and before it settles. If one cannot be read, the answer is 503 with charged: false and the same proof can be retried.
An untracked mint is still paid
Tracking status is not revealed before payment, so an untracked mint costs the call and returns 404. A free keyed lookup can check first.
A subset of the API
The keyless catalog covers KOL, deployer, token and wallet reads. Streams, webhooks, rules and routes such as holders or surges need a key.
| Route | Returns | Per call |
|---|---|---|
| GET /api/x402/tokens/{mint}/risk | Risk factors and creator activity | $0.02 USDC |
| GET /api/x402/token/{mint} | Token snapshot | $0.01 USDC |
| GET /api/x402/wallet/{address} | Wallet stats and flags | $0.005 USDC |
| GET /api/x402/wallet/{address}/pnl | Wallet FIFO PnL | $0.02 USDC |
| GET /api/x402/kol/feed | Tracked KOL trades | $0.005 USDC |
| GET /api/x402/deployer-hunter/alerts | Tracked-deployer launches | $0.01 USDC |
Architecture choice
An agent does not have to use MCP. The same endpoints serve every route; pick by where the agent runs and who holds the credential.
| Your agent | Use | How |
|---|---|---|
| An assistant in Claude Desktop, Cursor or Claude Code | MCP server, stdio | Put MADEONSOL_API_KEY in the client's server config. A free key works for the free routes. |
| An autonomous agent with its own Solana wallet and no account | x402 | The madeonsol-x402 client with a payment policy, or the MCP server in x402 mode for the keyless tools. |
| An agent service that defines its own tools | REST API through an SDK | Wrap the calls you need as tools; the key stays in your backend. Python, ElizaOS and Solana Agent Kit packages are listed on the MCP page. |
| An agent that reacts when something happens | Webhooks or the WebSocket stream | Keyed delivery from Pro. madeonsol_create_webhook and madeonsol_stream_token set it up from the agent itself. |
The same two calls as the MCP example, wrapped as one tool in your backend. The key never reaches the model. SDKs
import { MadeOnSolREST } from "madeonsol-x402";
const rest = new MadeOnSolREST({ apiKey: process.env.MADEONSOL_API_KEY! });
// Register this in your agent framework's tool format.
export const checkToken = {
name: "check_token",
description: "Risk factors and creator record for one Solana mint",
input: { mint: "string" },
async run({ mint }: { mint: string }) {
const risk = await rest.tokenRisk(mint); // GET /api/v1/tokens/{mint}/risk
const creator = risk.dev?.wallet
? await rest.deployerProfile(risk.dev.wallet) // GET /api/v1/deployer-hunter/{wallet}
: null;
return { band: risk.band, factors: risk.factors, assessment: risk.assessment, creator };
},
};Plans
A tool needs the plan of the endpoint it calls. A Free key allows 200 calls a day. x402 is separate from any plan.
| Capability | Tools or route | Plan |
|---|---|---|
| The MCP server itself | npm: mcp-server-madeonsol | Free, MIT licenceCalls are billed as API calls |
| Token snapshot, creator profile | madeonsol_token_get · madeonsol_deployer_profile | Free |
| KOL trades and deployer alerts | madeonsol_kol_feed · madeonsol_deployer_alerts | FreeLive feeds 5 min delayed on Free |
| Token risk, wallet stats, KOL coordination | madeonsol_token_risk · madeonsol_wallet_stats · madeonsol_kol_coordination | From Pro |
| Rules, webhooks, stream token | madeonsol_copytrade_create · madeonsol_create_webhook · madeonsol_stream_token | From Pro |
| Keyless, per call | /api/x402/* | No plan: pay per callUSDC on Solana |
Architecture
1 · Source
Chain activity
Transactions and program events
2 · MadeOnSol
Data and intelligence layer
3 · Delivery
4 · Yours
Your agent and its model
Keys and business logic stay server-side
5 · Users
Answers and actions
Build outcomes
An agent that shows MadeOnSol data to your own users is displaying it, which requires a Business plan. See pricing
Keep going
Solution
Token Risk
The risk response an agent reads, field by field.
Solution
Smart Money
Tracked KOL and alpha wallets behind the KOL tools.
Solution
Wallet Tracking
Watchlists an agent can add to and read from.
Docs
SDKs
TypeScript, Python and Rust clients.
Guide
MCP, Agent Kit or x402 for a trading agent
Three ways to wire the data in.
Guide
Research tokens and KOLs from Claude and Cursor
The MCP server in a research session.
FAQ
Next step
Check the service, wire the MCP server on a free key, then move to a plan or to x402.