nft-farm-mcp
Enables scanning Abstract chain for profitable free-mint NFT collections and identifying wallets that farm them, using on-chain Seaport data.
Enables scanning Ethereum for profitable free-mint NFT collections and identifying wallets that farm them, using on-chain Seaport data.
Enables scanning Optimism for profitable free-mint NFT collections and identifying wallets that farm them, using on-chain Seaport data.
Enables scanning Polygon for profitable free-mint NFT collections and identifying wallets that farm them, using on-chain Seaport data.
Default chain; enables scanning Robinhood Chain for profitable free-mint NFT collections and identifying wallets that farm them, using on-chain Seaport data.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nft-farm-mcpscan base chain for top free-mint collections this week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
nft-farm-mcp
Find free-mint NFT collections that went up, and the wallets farming them, ranked by secondary-market PnL read directly from chain state.
Ships as an MCP server (stdio) and a CLI. Works on any EVM chain with a Seaport deployment; Robinhood Chain by default.
Reads only
eth_getLogs/eth_call/eth_getTransaction. No API key, no account, no wallet. Every tool is read-only and never sends a transaction.Data comes from Seaport
OrderFulfilledevents (sales) andTransferfrom0x0(mints). No third-party indexer.Requires Node ≥ 20.
Tiếng Việt: README.vi.md
Install
claude mcp add nft-farm -- npx -y nft-farm-mcp@latest{
"mcpServers": {
"nft-farm": {
"command": "npx",
"args": ["-y", "nft-farm-mcp@latest"],
// optional — public RPCs are rate-limited; a private endpoint helps a lot
// on busy chains like Ethereum and Base
"env": {
"NFT_FARM_CHAIN": "robinhood",
"NFT_FARM_RPC_BASE": "https://your-base-endpoint"
}
}
}
}The package has no runtime dependencies — viem and the MCP SDK are bundled, so
npx fetches one 305 kB tarball instead of installing a dependency tree.
Two binaries ship: nft-farm-mcp is the MCP server, nft-farm is the CLI.
Related MCP server: SOL Claimer MCP Server
Tools
Tool | Purpose |
| List built-in chains, or resolve one chain spec and get its measured block time, detected Seaport address and scan-cost estimate |
| Rank free-mint collections by secondary PnL in a block window |
| Rank the wallets that minted those collections; flag wallets minting several (overlap = farming signal) |
| Poll / cancel a background scan and read its result |
Recommended call order
// 1. confirm the chain is supported and see what a scan will cost
list_chains { "chain": "base", "days": 1 }
// 2. rank collections — start narrow, async is the safe default
scan_collections { "chain": "base", "days": 1, "top": 10, "probe": 20, "async": true }
// 3. poll until status leaves "running"
job_status { "jobId": "<id from step 2>" }
// 4. take the interesting collections further: who minted them?
scan_wallets { "chain": "base", "days": 1, "topCollections": 10, "minOverlap": 2, "async": true }Pass async: true unless the window is genuinely small. A scan that exceeds
the inline budget is started as a background job automatically, but the estimate
is approximate — an explicit async: true can never time out, and costs one
extra job_status round-trip when the scan turns out to be fast.
Arguments
Shared by scan_collections and scan_wallets
Chain
Arg | Type | Default | Meaning |
| string |
| Built-in key, numeric chain id ( |
| string[] | chain defaults | First is primary, the rest are failover |
| string | detected | Marketplace address override |
| number | measured | Skip block-time measurement |
Window — omit all four and you get the last 7 days.
Arg | Type | Default | Meaning |
| number, ≤ 90 |
| Rolling window ending at chain tip |
| string (decimal) | tip | Explicit blocks. Strings, not numbers |
| string | — | ISO date or unix seconds |
Cost / tuning
Arg | Type | Default | Meaning |
| boolean | auto |
|
| number, 1–16 |
| Max in-flight |
| number | per chain | Max block span per |
| number, 1–500 |
| Max |
| number, ≤ 90 |
| How far before the window to look for mints |
| boolean |
| Disk cache of immutable history |
scan_collections only
Arg | Type | Default | Meaning |
| number, 1–200 |
| Rows returned |
| number, 1–400 |
| Top-by-volume collections to mint-probe. Dominates runtime |
| number |
| Minimum secondary sales to qualify |
| enum |
|
|
| boolean |
|
|
scan_wallets only
Arg | Type | Default | Meaning |
| number, 1–200 |
| Wallet rows per table |
| number, 1–100 |
| Profitable collections used as seeds |
| number |
| Distinct seeded collections a wallet must have minted |
| number |
| Mint events to fetch per collection |
| number |
| Minimum sales to seed (note: |
| number, 1–400 |
| Candidates before the free-mint filter |
| enum |
|
|
list_chains / job_status
list_chains takes chain, rpcUrls, days — all optional. With no chain it
just lists the built-ins.
job_status takes jobId (omit to list recent jobs) and cancel (abort instead
of read).
Ranges are rejected, not clamped: days: 120 is a validation error.
Reading the output
Every tool returns a markdown table in content and typed data in
structuredContent. All *Eth fields are decimal strings, not numbers —
parse before comparing, or "9" sorts above "10". Amounts are in the chain's
native token (chain.nativeSymbol: POL on Polygon, APE on ApeChain, BNB, AVAX),
despite the Eth suffix.
collections[]
Field | Meaning |
| Computed only from sales inside the requested window. |
|
|
| Median of the sampled mint transaction values; |
|
|
|
|
| number, or the string |
| Transactions actually sampled / mint logs seen. Low |
topWallets[], overlapWallets[]
Field | Meaning |
| Gross Seaport proceeds. The only figure backed by real sales. No gas, royalty or marketplace fee deducted |
| Number of those sales |
| Mints the wallet still holds × the collection's window average sale. Mark-to-market, not money received |
|
|
| True count of seeded collections this wallet minted |
| Capped at the top 5 collections by mint count — use |
What "realized" counts. A sale is credited to a wallet only when all three hold: it is a listing-side fill (Seaport bid fills have no resolvable seller), the collection is one of the seeded ones, and that wallet appears in the sampled minter set for it. It is therefore a floor on actual proceeds, not a full P&L.
How freeMint is decided. At most 8 mint transactions are sampled;
freeMint is true when ≥ 80 % of them carry value == 0. It reads native
tx.value only, so mints priced in ERC-20, routed through an aggregator, or
batched (one transaction minting many tokens) are mis-priced.
Sampling. maxMints bounds how many mint events are fetched per collection,
so minter sets are a sample of the largest minters, not the full holder list.
None of this is financial advice — verify on-chain before acting on a wallet.
When something goes wrong
Symptom | What it means / what to do |
| That endpoint refuses log queries. Several widely-listed public RPCs answer |
| No Seaport 1.6/1.5/1.4 on that chain. Pass |
| Supply |
Tool call times out | Re-issue with |
Empty | Widen |
| No collection passed the free + profitable seed filter. Run |
job_status.status is one of running, done, error, cancelled. Stop
polling on any of the last three, and read error when it is non-null. Poll
every 5–15 s. Jobs live in the server process only: the last 32 are retained and
all are lost if the server restarts.
Chain support
Built-in keys: robinhood, ethereum, base, optimism, arbitrum,
polygon, zora, blast, apechain, abstract, bnb, avalanche.
chain also accepts a numeric id or a bare RPC URL. For an unknown chain the
server detects and caches what it needs: chain id from eth_chainId, block time
measured from two block timestamps, and the marketplace by probing Seaport's
deterministic address (1.6 → 1.5 → 1.4) with getCode.
maxLogSpan defaults differ per chain — Ethereum 2 000, Base/OP/Polygon/Zora/
Blast/BNB/Avalanche 10 000, ApeChain/Abstract 20 000, Arbitrum 50 000, Robinhood
100 000, auto-detected chains 10 000 — then auto-tune to what the endpoint
actually accepts. list_chains reports the current value.
Environment variables
Variable | Purpose |
| Default RPC; comma-separated for failover |
| Per-chain override, e.g. |
| Default chain (default |
| Cache location (default |
| Estimated calls allowed inline before switching to a job (default 40) |
Performance and caching
Block history is immutable, so decoded Seaport sales are cached in aligned block
buckets under ~/.nft-farm/cache and reused; only the tip is re-fetched.
Collection names, token standards, mint-cost probes and minter sets are cached
too. Buckets within ~10 minutes of head are never cached, so a reorg cannot
poison the store. Delete the directory to reset; cache: false bypasses it.
Robinhood (1 day, 73k sale legs, | Base (0.15 day, | |
Cold — Seaport phase | 34.3 s | 0.4 s |
Cold — mint probe | 59.6 s | 30 s |
Cold total | 1 m 36 s | 39 s |
Warm — Seaport phase | 0.9 s | 0.8 s |
Those numbers are at probe 3–10. The default is probe: 80 over 7 days, which
is minutes of work — another reason to start narrow and use async.
Cache size scales with sales volume: one day of Robinhood Seaport (73 k sale legs) is ~2.3 MB gzipped.
CLI
Same engine, no MCP client needed:
npx -y -p nft-farm-mcp nft-farm scan --days 7 --top 20
npx -y -p nft-farm-mcp nft-farm chains
# or from source
npm install && npm run build
npm run scan -- --chain base --days 1 --top 10
npm run wallets -- --days 1 --top 20 --min-overlap 2nft-farm --help lists every flag. Flags mirror the MCP arguments
(--chain, --rpc repeatable/comma-separated, --days, --top, --probe,
--sort, --all for paid mints, --json, --concurrency, --max-span,
--mint-probe-calls, --mint-lookback, --no-cache, --cache-dir).
Two CLI-only differences worth knowing: --min-sales defaults to 1 for both
commands (the MCP scan_wallets uses 2), and --sort pnlFloor is an alias that
sorts by floor price, not by floor PnL.
Development
npm run typecheck
npm test # typecheck + bundle + MCP stdio smoke testMCP_PLAN.md records the RPC measurements behind the design and the places the first design was wrong — useful if you port this to another chain or RPC provider.
MIT.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that analyzes wallets’ trading activity and profitability on Pump.fun and PumpSwap.41MIT
- AlicenseAqualityAmaintenanceAn MCP server that enables AI assistants to analyze Solana wallets for empty or low-value token accounts. It allows users to identify opportunities to recover SOL rent by closing or burning these accounts through the SOL Claimer API.48MIT
- AlicenseAqualityCmaintenanceCross-chain DeFi intelligence MCP server for AI agents. 7 tools for yield discovery, pool analysis, profit simulation, risk scoring, whale tracking, impermanent loss calculation, and DeFi overview across 86 chains and 6,500+ liquidity pools.71AGPL 3.0
- Alicense-qualityCmaintenanceMCP server that provides AI agents with crypto token safety checks (honeypot, liquidity, rug risk) and alpha signals (smart money buys, fresh rug radar) across PulseChain, Monad, Base, and BSC.47MIT
Related MCP Connectors
Solana on-chain intelligence — token scans, wallet profiling, bundle detection, 19 MCP tools.
Solana token risk-scoring MCP server for AI trading agents with insider wallet cluster detection.
Memecoin Intelligence MCP — 9 tools: rug check, momentum, whale watch, 80+ chains.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/0xsyncroot/nft-farm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server