Getting started
Thirty seconds, two commands. Install the MCP server in your agent, then ask it anything about Solana.
# Install in any MCP-aware client
mcp add techkern
# Set your key (get one at https://techkern.xyz/dashboard)
export TECHKERN_API_KEY="tk_live_8c7f...3a91"Restart your client. The agent now has ten new tools. Ask it something real:
> Find Solana memecoins with over $100K volume in the last 5 minutes
where the dev still holds more than 50%.
→ techkern.query_solana_swaps({
last_minutes: 5,
min_volume_usd: 100000,
where: { dev_hold_pct: { gt: 50 } }
})
→ 3 matches: $MOCHI ($412K vol, dev 72%), $ZIGGY ($188K vol,
dev 64%), $POPCAT ($121K vol, dev 51%).No webhooks. No polling. No glue code. The agent picks the right tool, calls it, and reasons over the response. You move on.
Install
Every MCP-aware client takes the same shape of config. The server ships as a single npm package, fetched lazily on client launch. Source on GitHub: github.com/kern-tech/techkern.
Claude Desktop
Edit claude_desktop_config.json. On macOS it lives at ~/Library/Application Support/Claude/claude_desktop_config.json. On Windows: %APPDATA%\Claude\claude_desktop_config.json.
{
"mcpServers": {
"techkern": {
"command": "npx",
"args": ["-y", "@techkern/mcp-server"],
"env": {
"TECHKERN_API_KEY": "tk_live_8c7f...3a91"
}
}
}
}Quit Claude Desktop fully (not just close the window) and relaunch. The hammer icon shows ten new Solana tools.
Cursor
Edit ~/.cursor/mcp.json, then open Cursor Settings → MCP and toggle the server on.
{
"mcpServers": {
"techkern": {
"command": "npx",
"args": ["-y", "@techkern/mcp-server"],
"env": { "TECHKERN_API_KEY": "tk_live_..." }
}
}
}Cline
Edit ~/Documents/Cline/MCP/cline_mcp_settings.json. Add read-only tools to autoApprove to skip per-call confirmation:
{
"mcpServers": {
"techkern": {
"command": "npx",
"args": ["-y", "@techkern/mcp-server"],
"env": { "TECHKERN_API_KEY": "tk_live_..." },
"autoApprove": [
"query_solana_swaps",
"query_pump_fun_launches",
"query_token_holders",
"query_kol_wallets",
"mint_authority_check",
"dev_token_history",
"whale_tracker",
"liquidity_depth",
"holder_distribution"
]
}
}
}Continue
Edit ~/.continue/config.json and append to the mcpServers array:
{
"mcpServers": [
{
"name": "techkern",
"command": "npx",
"args": ["-y", "@techkern/mcp-server"],
"env": { "TECHKERN_API_KEY": "tk_live_..." }
}
]
}Zed
Edit ~/.config/zed/settings.json and add under assistant.mcp_servers:
{
"assistant": {
"mcp_servers": {
"techkern": {
"command": "npx",
"args": ["-y", "@techkern/mcp-server"],
"env": { "TECHKERN_API_KEY": "tk_live_..." }
}
}
}
}OpenAI Agents SDK
For programmatic agents in Node, Bun, or Deno, use the hosted SSE endpoint — no local subprocess, lower latency.
import { Agent } from "@openai/agents";
import { MCPServerSse } from "@openai/agents/mcp";
const techkern = new MCPServerSse({
name: "techkern",
url: "https://api.techkern.xyz/mcp",
headers: {
Authorization: `Bearer ${process.env.TECHKERN_API_KEY}`,
},
});
const agent = new Agent({
name: "Solana Research Bot",
model: "gpt-4.1",
mcpServers: [techkern],
instructions:
"You research Solana using techkern — swaps, pump.fun launches, holders, KOL wallets.",
});
const result = await agent.run(
"Find pump.fun launches with >100 holders in the last hour."
);
console.log(result.output);Authentication
Two paths. Bearer token for everything programmatic, Solana wallet sign-in for pay-per-query without an account.
Bearer token
Tokens are scoped per environment — tk_test_ for development, tk_live_ for production. Pass the key in the Authorization header on every request:
curl https://api.techkern.xyz/v1/query \
-H "Authorization: Bearer tk_live_8c7f3a91d2b8e4f5c1a9b6d7" \
-H "Content-Type: application/json" \
-d '{
"tool": "query_pump_fun_launches",
"input": { "last_minutes": 60, "min_holders": 100 }
}'Rotate keys from the dashboard with a 24-hour overlap so deploys cross cleanly. Keys are hashed at rest (Argon2id) and never logged.
Solana wallet sign-in
Connect Phantom, Backpack, or Solflare. The dashboard issues an API key tied to your wallet, and pay-per-query in $TECH or USDC settles automatically on every call — no monthly invoice, no Stripe. The signed challenge expires after 5 minutes:
import { SigninMessage } from "@techkern/sdk";
const msg = new SigninMessage({
domain: "techkern.xyz",
publicKey: wallet.publicKey.toBase58(),
nonce: crypto.randomUUID(),
issuedAt: new Date().toISOString(),
});
const signature = await wallet.signMessage(msg.prepare());
const { apiKey } = await fetch("https://api.techkern.xyz/v1/auth/wallet", {
method: "POST",
body: JSON.stringify({ message: msg.serialize(), signature }),
}).then((r) => r.json());Tools
Ten tools. Every input is JSON-schema validated. Every output is structured JSON — never a markdown blob the model has to re-parse. All ten are backed by four ClickHouse shards (swaps, pumpfun, holders, kol) fed by Helius RPC + Jito MEV bundles, indexed every Solana slot (~400ms).
query_solana_swapsSwapsDEX swaps across Jupiter, Raydium, Orca, and Meteora. Filter by token, time window, USD floor, dev-hold percentage, or holder count. Use this when an agent needs to surface live activity matching a thesis.
Input schema
interface QuerySolanaSwapsInput {
min_volume_usd?: number; // default 0
last_minutes?: number; // default 60, max 10080 (7d)
tokens?: string[]; // mint addresses
where?: {
dev_hold_pct?: { gt?: number; lt?: number };
holder_count?: { gt?: number; lt?: number };
};
limit?: number; // default 50, max 500
}Example prompt
Find Solana swaps over $50K in the last 10 minutes
where the dev still holds more than 40%.Example response
{
"results": [
{
"token": "MOCHI",
"ca": "7xK9rR4nT2vMqLp8wJ5sF3yH6zXcVbNm1aQpEdRtYuQp",
"volume_usd": 412300,
"dev_hold_pct": 72.4,
"first_swap": "2026-05-22T14:32:11Z",
"dex": "raydium",
"signature": "5jKvN8...Hp3RqW"
},
{
"token": "ZIGGY",
"ca": "9pM2qR5xT8vNbKj4wH7sG2yF6zXcVbNm1aQpEdRtYuQp",
"volume_usd": 188400,
"dev_hold_pct": 64.1,
"first_swap": "2026-05-22T14:29:48Z",
"dex": "jupiter",
"signature": "3xLpQ2...Vn8MkT"
},
{
"token": "POPCAT",
"ca": "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr",
"volume_usd": 121800,
"dev_hold_pct": 51.0,
"first_swap": "2026-05-22T14:27:02Z",
"dex": "orca",
"signature": "2bRtY9...Lk4FsX"
}
],
"result_count": 3,
"latency_ms": 31
}query_pump_fun_launchesPump.funFresh pump.fun mints in a recency window. Filter on holder count, market-cap floor, and whether the bonding curve has graduated to Raydium. The pre-graduation alpha stream.
Input schema
interface QueryPumpFunLaunchesInput {
last_minutes?: number; // default 30
min_mcap_usd?: number; // default 0
min_holders?: number; // default 0
bonding_complete?: boolean; // filter graduated vs pre-grad
limit?: number; // default 50, max 500
}Example prompt
Show pump.fun launches in the last hour with at least
100 holders that have not yet bonded.Example response
{
"results": [
{
"token": "KERN",
"ca": "Hm4qN2pR8sT5vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"mcap_usd": 47200,
"age_minutes": 12,
"holders": 184,
"dev_wallet": "9ab2cD4eF6gH8jK1mN3pQ5rS7tU9vW2xY4zA6bC8dE",
"bonding_progress_pct": 68.3
},
{
"token": "WIBBLE",
"ca": "Bn5pT3qR8sV2vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"mcap_usd": 31900,
"age_minutes": 27,
"holders": 142,
"dev_wallet": "4cD6eF8gH1jK3mN5pQ7rS9tU2vW4xY6zA8bC1dE3f",
"bonding_progress_pct": 41.8
},
{
"token": "FLOPPY",
"ca": "Cm2pT5qR8sV3vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"mcap_usd": 22400,
"age_minutes": 44,
"holders": 109,
"dev_wallet": "7eF9gH2jK4mN6pQ8rS1tU3vW5xY7zA9bC2dE4fG6h",
"bonding_progress_pct": 22.1
}
],
"result_count": 3,
"latency_ms": 18
}query_token_holdersHoldersTop-N holder list for any SPL mint with concentration metrics (top-10%, top-50%, Gini), dev-wallet balance, and sniper-cluster flags. The DD pipeline staple.
Input schema
interface QueryTokenHoldersInput {
token_mint: string; // required, base58 mint
top_n?: number; // default 10, max 100
}Example prompt
Pull the top 10 holders of mint Hm4q...YuQp
and tell me if it looks centralized.Example response
{
"token_mint": "Hm4qN2pR8sT5vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"unique_holders": 184,
"top_10_pct": 38.2,
"dev_balance_pct": 4.2,
"gini_coefficient": 0.71,
"top_n": [
{ "address": "9ab2cD4eF6gH8jK1mN3pQ5rS7tU9vW2xY4zA6bC8dE", "pct": 8.1, "first_block_buy": false },
{ "address": "2cF4dE6gH8jK1mN3pQ5rS7tU9vW2xY4zA6bC8dE0fG", "pct": 5.4, "first_block_buy": true },
{ "address": "Cented7y3Tg9bN5pT3qR8sV2vKj7wL3xH9yF6zXcV", "pct": 4.9, "first_block_buy": false }
],
"latency_ms": 14
}query_kol_walletsKOLRecent buys from the 1,400+ tracked Solana alpha-trader wallets, tagged with handle, size, mint, and 30-day PnL. Filter by minimum PnL, recency, or a wallet shortlist.
Input schema
interface QueryKolWalletsInput {
min_pnl_30d_usd?: number; // default 0
recent_buy_minutes?: number; // default 60
wallets?: string[]; // shortlist filter
limit?: number; // default 50
}Example prompt
Show me KOL wallets with >$500K 30d PnL
that bought anything in the last 30 minutes.Example response
{
"results": [
{
"wallet": "Cented7y3TgN8rL4pK2mJ9hG6fD3sA1qW5xZ7vY9b",
"recent_buy": {
"token": "KERN",
"ca": "Hm4qN2pR8sT5vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"at": "2026-05-22T14:42:18Z"
},
"size_usd": 12400,
"pnl_30d_usd": 1240000,
"tracked_since": "2024-08-12"
},
{
"wallet": "Ansem8Lk2qN5pT3rR8sV2vKj7wL3xH9yF6zXcVbNm",
"recent_buy": {
"token": "WIF",
"ca": "EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm",
"at": "2026-05-22T14:38:02Z"
},
"size_usd": 84000,
"pnl_30d_usd": 2980000,
"tracked_since": "2023-11-04"
}
],
"result_count": 2,
"latency_ms": 22
}dev_token_historyWalletsEvery token a wallet has ever deployed, with launch time, current market cap, and rug status. Use this to filter out serial ruggers before acting on a fresh mint.
Input schema
interface DevTokenHistoryInput {
wallet: string; // required, base58
limit?: number; // default 100
}Example prompt
Has the wallet 9ab2...8dE deployed anything before?
Show me the last 5 tokens with their outcome.Example response
{
"wallet": "9ab2cD4eF6gH8jK1mN3pQ5rS7tU9vW2xY4zA6bC8dE",
"results": [
{
"name": "KERN",
"ca": "Hm4qN2pR8sT5vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"deploy_at": "2026-05-22T14:30:00Z",
"current_mcap": 47200,
"rug_status": "active"
},
{
"name": "OOPS",
"ca": "2cF4dE6gH8jK1mN3pQ5rS7tU9vW2xY4zA6bC8dE0fG",
"deploy_at": "2026-05-18T03:12:00Z",
"current_mcap": 0,
"rug_status": "rugged"
},
{
"name": "OOPS2",
"ca": "3dG5eF7gH9jK2mN4pQ6rS8tU1vW3xY5zA7bC9dE1fG",
"deploy_at": "2026-05-17T19:48:00Z",
"current_mcap": 0,
"rug_status": "rugged"
}
],
"result_count": 3,
"latency_ms": 16
}whale_trackerWhalesLarge swaps anywhere on Solana DEXes. Filter by minimum USD size, specific token, and time window. Pairs with query_kol_wallets for confirmed-alpha mirroring.
Input schema
interface WhaleTrackerInput {
min_size_usd?: number; // default 100000
token_mint?: string; // optional filter
last_minutes?: number; // default 60
limit?: number; // default 50
}Example prompt
Show me every swap over $250K in the last 15 minutes.Example response
{
"results": [
{
"wallet": "Cented7y3TgN8rL4pK2mJ9hG6fD3sA1qW5xZ7vY9b",
"side": "buy",
"size_usd": 412000,
"token": "WIF",
"ca": "EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm",
"dex": "jupiter",
"at": "2026-05-22T14:44:02Z"
},
{
"wallet": "5HqWxY3zA7bC9dE1fG3hJ5kM8nP2qR4sT6vN9pM2qR5",
"side": "sell",
"size_usd": 318000,
"token": "BONK",
"ca": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"dex": "raydium",
"at": "2026-05-22T14:41:18Z"
},
{
"wallet": "Ansem8Lk2qN5pT3rR8sV2vKj7wL3xH9yF6zXcVbNm",
"side": "buy",
"size_usd": 284000,
"token": "POPCAT",
"ca": "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr",
"dex": "raydium",
"at": "2026-05-22T14:38:55Z"
}
],
"result_count": 3,
"latency_ms": 27
}new_token_alertsStreamStream of new SPL mints crossing initial-liquidity and dev-age thresholds. Returns WebSocket-friendly events — designed to be subscribed to, not polled.
Input schema
interface NewTokenAlertsInput {
min_initial_liquidity_usd?: number; // default 5000
dev_wallet_min_age_days?: number; // default 0
limit?: number; // default 100
}Example prompt
Alert me when a new mint launches with >$10K initial
liquidity from a dev wallet at least 30 days old.Example response
{
"events": [
{
"type": "new_mint",
"token": "ZIGGY",
"ca": "9pM2qR5xT8vNbKj4wH7sG2yF6zXcVbNm1aQpEdRtYuQp",
"initial_liquidity_usd": 18400,
"dev_wallet": "4cD6eF8gH1jK3mN5pQ7rS9tU2vW4xY6zA8bC1dE3f",
"dev_wallet_age_days": 142,
"at": "2026-05-22T14:45:01Z"
},
{
"type": "new_mint",
"token": "FLOPPY",
"ca": "Cm2pT5qR8sV3vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"initial_liquidity_usd": 12100,
"dev_wallet": "7eF9gH2jK4mN6pQ8rS1tU3vW5xY7zA9bC2dE4fG6h",
"dev_wallet_age_days": 67,
"at": "2026-05-22T14:43:48Z"
}
],
"stream": true,
"result_count": 2
}liquidity_depthLiquidityOrder-book depth at price levels for any mint across every DEX that lists it. Useful for sizing entries and modeling slippage before placing routes through Jupiter.
Input schema
interface LiquidityDepthInput {
token_mint: string; // required
levels?: number; // default 10, max 50
}Example prompt
What's the liquidity depth on KERN at the top 10 levels?
I want to size a $40K entry without eating more than 2% slippage.Example response
{
"token_mint": "Hm4qN2pR8sT5vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"mid_price_usd": 0.00041,
"bids": [
{ "price_usd": 0.000408, "size_usd": 8400, "dex": "raydium" },
{ "price_usd": 0.000404, "size_usd": 12200, "dex": "raydium" },
{ "price_usd": 0.000401, "size_usd": 6800, "dex": "orca" }
],
"asks": [
{ "price_usd": 0.000412, "size_usd": 9100, "dex": "raydium" },
{ "price_usd": 0.000416, "size_usd": 14800, "dex": "raydium" },
{ "price_usd": 0.000420, "size_usd": 7200, "dex": "jupiter" }
],
"depth_2pct_buy_usd": 31100,
"depth_2pct_sell_usd": 27600,
"latency_ms": 19
}holder_distributionHoldersDetailed holder breakdown over time — distribution curve, top percentages at multiple buckets, and the holder-count history series. Pass snapshot_at for a historical block.
Input schema
interface HolderDistributionInput {
token_mint: string; // required
snapshot_at?: string; // ISO 8601 or slot number
}Example prompt
How has the holder distribution on KERN evolved
in the last 24 hours? Plot the top-10% over time.Example response
{
"token_mint": "Hm4qN2pR8sT5vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"snapshot_at": "2026-05-22T14:45:00Z",
"top_pcts": {
"top_10": 38.2,
"top_50": 71.4,
"top_100": 84.9
},
"distribution_curve": [
{ "bucket_usd": "0-100", "holders": 84 },
{ "bucket_usd": "100-1000", "holders": 62 },
{ "bucket_usd": "1000-10000", "holders": 28 },
{ "bucket_usd": "10000+", "holders": 10 }
],
"holder_count_history": [
{ "at": "2026-05-21T14:45:00Z", "holders": 12 },
{ "at": "2026-05-21T20:45:00Z", "holders": 47 },
{ "at": "2026-05-22T02:45:00Z", "holders": 98 },
{ "at": "2026-05-22T08:45:00Z", "holders": 141 },
{ "at": "2026-05-22T14:45:00Z", "holders": 184 }
],
"latency_ms": 28
}Streaming
Subscriptions push events as they happen instead of requiring polling. End-to-end latency: ~400ms from Solana slot finalization to subscriber. Four streams are live today.
subscribe.solana.new_mint— every fresh SPL mint, regardless of programsubscribe.solana.swaps.large— DEX swaps over a configurable USD thresholdsubscribe.pumpfun.bonding_complete— pump.fun launches that just graduated to Raydiumsubscribe.kol.recent_buy— every entry from the 1,400+ tracked KOL wallets
Subscribe payload
Inside an MCP client, the agent calls subscribe; push events arrive as MCP notifications, one per matching event, until unsubscribe.
// Agent-side
subscribe({
stream: "subscribe.kol.recent_buy",
filters: {
min_size_usd: 5000,
wallets: ["Cented7y3TgN8rL4pK2mJ9hG6fD3sA1qW5xZ7vY9b"]
}
});Example streamed event
{
"stream": "subscribe.kol.recent_buy",
"event": {
"wallet": "Cented7y3TgN8rL4pK2mJ9hG6fD3sA1qW5xZ7vY9b",
"token": "KERN",
"ca": "Hm4qN2pR8sT5vKj7wL3xH9yF6zXcVbNm1aQpEdRtYuQp",
"side": "buy",
"size_usd": 12400,
"dex": "raydium",
"signature": "5jKvN8mPqR2sT4vXcVbNm1aQpEdRtYuQpHm4qN2pR8s",
"at": "2026-05-22T14:45:11Z"
},
"delivered_at": "2026-05-22T14:45:11.412Z"
}Raw WebSocket access is available outside MCP for low-level consumers — connect to wss://stream.techkern.xyz/v1 with the same bearer token and send the same payload over the wire.
Rate limits
Limits are enforced per API key, sliding-window over the last rolling day. When you hit a limit the API returns 429 with a Retry-After header. Every response also carries x-ratelimit-remaining and x-ratelimit-reset so you can build proactive backoff.
| Plan | Per day | Per second | Concurrent subs |
|---|---|---|---|
| Hobby | 1,000 | 5 | 2 |
| Pro | 50,000 | 100 | 50 |
| Scale | Unlimited | 2,000 | 500 |
429 retry semantics
Retry-After is always in seconds. The recommended client behavior is exponential backoff with full jitter, capped at 60s. The official SDKs handle this automatically:
HTTP/1.1 429 Too Many Requests
Retry-After: 7
x-ratelimit-remaining: 0
x-ratelimit-reset: 1716345607
Content-Type: application/json
{
"error": {
"code": "rate_limit_exceeded",
"message": "Daily limit reached for plan 'hobby'.",
"retry_after_seconds": 7
}
}Errors
Standard HTTP status codes. The body is always JSON with an error object describing what went wrong and what to do next.
| Code | Meaning | Client should |
|---|---|---|
| 400 | Bad request — invalid input. | Validate against the input schema. Do not retry. |
| 401 | Missing or invalid API key. | Re-issue a key and update env. Do not retry. |
| 403 | Key valid but lacks the requested scope. | Upgrade plan or request scope. Do not retry. |
| 429 | Rate limit exceeded. | Honor Retry-After; exponential backoff with full jitter. |
| 500 | Unexpected server error. | Retry once after 500ms; report if persistent. |
| 503 | Indexer shard offline. | We re-route within 15s. Retry with backoff. |
| 504 | Upstream RPC or ClickHouse query timeout. | Narrow time window or add a mint filter; retry. |
Example error body
{
"error": {
"code": "shard_offline",
"message": "Indexer shard 'holders' is rebalancing. Re-route in progress.",
"shard": "holders",
"retry_after_seconds": 15,
"request_id": "req_4f8c2a1d9b3e7h2k"
}
}SDKs
Official SDKs for Node, Python, and Rust. Each wraps the same REST + WebSocket surface and handles auth, retries, and streaming. Source on GitHub: github.com/kern-tech/techkern.
Node
import { TechKernClient } from "@techkern/sdk";
const client = new TechKernClient({ apiKey: process.env.TECHKERN_API_KEY! });
const swaps = await client.querySolanaSwaps({ last_minutes: 5, min_volume_usd: 100000 });
console.log(swaps.results);Python
from techkern import Client
client = Client(api_key=os.environ["TECHKERN_API_KEY"])
swaps = client.query_solana_swaps(last_minutes=5, min_volume_usd=100_000)
print(swaps["results"])Rust
use techkern::Client;
let client = Client::new(std::env::var("TECHKERN_API_KEY")?);
let swaps = client.query_solana_swaps()
.last_minutes(5)
.min_volume_usd(100_000)
.send().await?;
println!("{:#?}", swaps.results);Recipes
Real prompts to drop into any MCP-aware agent. Each shows the literal Claude prompt, the tool invocation it triggers under the hood, and the expected response shape.
Memecoins with high volume and dev still in
Prompt:
> Find Solana memecoins with >$100K volume in the last 5 min
where the dev still holds >50%.
Triggers:
techkern.query_solana_swaps({
last_minutes: 5,
min_volume_usd: 100000,
where: { dev_hold_pct: { gt: 50 } }
})
Response shape:
{ results: [{ token, ca, volume_usd, dev_hold_pct, dex }], result_count }Pump.fun mints from fresh dev wallets
Prompt:
> Track every new pump.fun mint where the dev wallet is <7 days old.
Triggers:
techkern.new_token_alerts({
min_initial_liquidity_usd: 1000,
dev_wallet_min_age_days: 0
})
↓ filter client-side: dev_wallet_age_days < 7
Response shape:
{ events: [{ token, ca, dev_wallet, dev_wallet_age_days, at }], stream: true }Recent buys of a specific wallet with PnL
Prompt:
> Show me the last 20 buys of wallet Cented7y3Tg...vY9b with PnL deltas.
Triggers:
techkern.whale_tracker({
last_minutes: 1440,
limit: 20
})
↓ filter: wallet == "Cented7y3TgN8rL4pK2mJ9hG6fD3sA1qW5xZ7vY9b"
↓ enrich each with: techkern.holder_distribution(ca) for current price
Response shape:
{ results: [{ wallet, side, size_usd, token, ca, dex, at }] }Alert on large KOL buys
Prompt:
> Alert me when any KOL wallet I track buys >$10K of any token
in the last hour.
Triggers:
techkern.subscribe({
stream: "subscribe.kol.recent_buy",
filters: { min_size_usd: 10000 }
})
Event shape:
{ stream, event: { wallet, token, ca, side, size_usd, dex, at } }Pre-trade rug screen in one call
Prompt:
> Before I buy KERN, give me the full safety check —
mint authority, holder concentration, dev history.
Triggers (in parallel):
techkern.mint_authority_check({ token_mint: "Hm4q...YuQp" })
techkern.holder_distribution({ token_mint: "Hm4q...YuQp" })
techkern.dev_token_history({ wallet: "<dev from mint_authority_check>" })
Synthesized response:
- is_renounced: true ✓
- top_10_pct: 38.2% (acceptable)
- dev history: 1 active, 0 rugs → low riskFAQ
Is techkern compliant with MCP spec v1.0?
Yes. Verified against Claude Desktop, Cursor, Cline, Continue, Zed, the OpenAI Agents SDK, and the official MCP TypeScript + Python reference clients. Tool schemas pass mcp-validator --strict.
Can I self-host?
On the Scale plan, yes — single-tenant deployment with your own Helius keys and ClickHouse cluster. Contact hello@techkern.xyz for the deployment kit and license terms.
Does this work with Anthropic API tool use (non-MCP)?
Yes — every tool is also exposed as a plain REST endpoint, and we ship a tool-use bridge that translates Anthropic tools definitions into REST calls. See the bridge example at examples/anthropic-bridge.
What about Solana network upgrades?
The indexer auto-syncs to new program IDs as they roll out (Token-2022, ALT activations, new DEX program upgrades). Last 12 months: 99.96% uptime across the four shards. See /status for live SLO history.
Can I get historical data?
Yes — pass snapshot_at (ISO timestamp or slot number) on any compatible tool. Retention: Hobby 7 days, Pro 90 days, Scale unlimited. Bulk historical exports (CSV / Parquet) ship from the dashboard for Pro and Scale.
How is data freshness guaranteed?
The indexer subscribes to every Solana slot via Helius gRPC plus Jito MEV bundles. End-to-end pipeline: slot finalization → parse → ClickHouse insert in ~400ms (p95). Query lag from insert to read is <500ms p95.
What about Jito MEV data?
Jito bundles are tracked as a separate event type. Every swap response carries a jito_bundle_id field when the transaction was bundled, and a dedicated subscribe.jito.bundles stream is in beta — ask in the discussions for access.
Is there a free tier?
Yes — Hobby is 1,000 queries/day, no card required. Sign in with a Solana wallet or email and you get a tk_live_ key immediately. Upgrade to Pro ($49/mo) when you outgrow it.