Connect your AI tools to OpenSea using the Model Context Protocol (MCP), an open standard that lets AI assistants interact with NFTs, tokens, and blockchain data across multiple chains.
What is OpenSea MCP?
OpenSea MCP is a hosted server that gives AI tools secure access to blockchain data across NFTs, tokens, and wallets. Query real-time prices, swap tokens, analyze portfolios, and mint NFTs, all through natural language. It works with popular AI assistants like ChatGPT, Cursor, Claude, and Chorus.
Why use OpenSea MCP?
- Easy setup: Connect through a simple URL configuration
- Real-time data: Access live prices for NFTs, tokens, and cryptocurrencies
- Broad blockchain coverage: Support for Ethereum, Polygon, Base, Solana and other major chains
- Built for AI: Efficient data formatting and keyword search designed for AI agents
What can you do with OpenSea MCP?
- Analyze tokens and cryptocurrencies: Look up ERC-20 tokens, meme coins, and get real-time price data
- Swap tokens: Get quotes and transaction data for token swaps across supported chains
- Research NFT collections: Get floor prices, volume data, and trending collections
- Check wallet portfolios: View complete holdings including NFTs, tokens, and balances for any address
- Track market trends: Identify trending tokens, NFT collections, and monitor trading activity
- Mint NFTs from drops: Get drop details, check eligibility, and generate mint transactions
- Deploy NFT contracts: Deploy new SeaDrop NFT contracts and track deployment status
- Discover AI agent tools: Search the onchain Tool Registry (ERC-8257) for registered tools and check their access requirements
Getting Started
OpenSea MCP data tools require an OpenSea API key. The same API key works for REST and MCP.
Quickest way (for agents): Get an instant key with no signup:
curl -X POST https://api.opensea.io/api/v2/auth/keysThis returns a free-tier key (600/h read, 30/h write, 7-day expiry) you can use immediately. Agents can also mint this key from within a session by calling the built-in
get_instant_api_keytool (see Providing your API key).For higher rate limits: Sign in to opensea.io, go to Settings → Developer, and create a full API key.
Connect through your AI tool
To connect OpenSea MCP to your AI assistant, use one of these connection methods. You can start with only the URL for the handshake, tool discovery, and get_instant_api_key. Add the API key before calling data tools.
Streamable HTTP (Recommended)
- URL:
https://mcp.opensea.io/mcp - JSON config:
{
"mcpServers": {
"OpenSea": {
"url": "https://mcp.opensea.io/mcp"
}
}
}SSE (Server-Sent Events)
- URL:
https://mcp.opensea.io/sse - JSON config:
{
"mcpServers": {
"OpenSea": {
"url": "https://mcp.opensea.io/sse"
}
}
}Providing your API key
You can present your OpenSea API key in whichever way your client supports:
X-API-KEYheader (shown below): recommended.Authorization: Bearer YOUR_API_KEYheader: use this if your client only supports bearer-token auth (for example, Perplexity's connector). The same OpenSea API key is accepted here.
The same OpenSea API key works for both the REST API and MCP. There is no separate MCP token.
For an API-key-only client, add it to the connection headers:
{
"url": "https://mcp.opensea.io/mcp",
"headers": { "X-API-KEY": "YOUR_API_KEY" }
}OAuth wallet authentication
Standard clients discover OAuth from
https://mcp.opensea.io/.well-known/oauth-protected-resource, open the OpenSea
wallet sign-in flow, and send the resulting JWT in Authorization: Bearer.
A wallet JWT does not replace the API key. Send the API key in X-API-KEY and
the wallet JWT in Authorization: Bearer when calling wallet-scoped tools.
Wallet tools enforce the scopes advertised by the protected-resource metadata.
A hosted client must support both credentials at the same time: the API key in
X-API-KEYand the OAuth wallet JWT inAuthorization. If its setup screen
only lets you choose one authentication method, you can still test API-key
data tools, but wallet-scoped tools will not be authenticated.OpenSea uses a public PKCE OAuth client. If your client cannot register
dynamically and asks for OAuth credentials, use client ID
379893200225068569with no client secret. Do not paste your OpenSea API key
into the client secret field. A client that requires a secret cannot complete
this public OAuth flow.
MCP receives the short-lived wallet JWT, not the scoped PAT. A server-side agent that controls a signing key can use the manual SIWE and PAT flow, exchange the PAT for a JWT, and send that JWT in Authorization: Bearer.
If a data tool reports that an API key is missing, create or supply a key, add it as X-API-KEY, and reconnect. The MCP handshake and tools/list work without a key, but until a valid key is sent tools/list returns only get_instant_api_key.
Don't have a key yet? You can still connect. The MCP handshake and tool discovery (
tools/list) work without authentication, but until a valid key is senttools/listreturns only the built-inget_instant_api_keytool. An agent can connect with no key, call it to mint a free-tier key, then reconnect using that key as theX-API-KEYorAuthorization: Bearerheader. The other tools appear after it reconnects with a key.
Quick Start Examples
Once connected, try these prompts to explore OpenSea MCP capabilities:
- "What's the price of PEPE token on Ethereum?"
- "Show me trending tokens on Base"
- "Quote a swap of 1 ETH to USDC"
- "Check the complete portfolio for wallet 0x123..."
- "What's the floor price of Pudgy Penguins?"
- "Find the top meme coins by trading volume"
Sample Project
Prefer a working app? Try the Next.js + Vercel AI SDK starter preconfigured with OpenSea MCP:
https://github.com/ProjectOpenSea/opensea-mcp-next-sample
Supported Tools
Now that you have installed the OpenSea MCP, let's explore how AI assistants can use OpenSea MCP tools to search, analyze, and interact with blockchain and marketplace data.
These tools work together through prompts, and they are most useful in combination. With a single prompt, you can search for collections, check token prices, analyze wallet holdings, and get swap quotes across multiple blockchains.
| Name | Description | Sample prompts |
|---|---|---|
| get_instant_api_key | Create a free-tier OpenSea API key instantly with no signup or wallet required. Use this to bootstrap access when you don't have a key yet, then reconnect with the returned key. Free-tier keys have lower rate limits and expire after 7 days. | "Get me an OpenSea API key" "Bootstrap access to OpenSea so I can use the other tools" |
| search | Keyword search across OpenSea marketplace data, returning up to 5 results per entity type. Include a type word (token, NFT, account) to search that type; otherwise it searches collections and NFT items. When you know the type, search_tokens, search_collections, search_items, or account_lookup is more precise. | "Find BONK token on Solana" "Show me trending NFTs" "Search for gaming NFT collections" "Find Pudgy Penguins collection" |
| fetch | Retrieve full details of a specific OpenSea entity by its unique identifier with maximum data including activity, analytics, offers, and all other available information. | "Get details for collection_pudgypenguins" |
| search_collections | Search for NFT collections by name, description, or metadata. Returns minimal information (slug + name) for context efficiency. | "Search for Azuki collections" "Find art NFT collections on Ethereum" |
| get_collections | Retrieve detailed information about multiple NFT collections at once. Supports lightweight includes: recent_sales, sample_items, top_holders, traits, and attributes. | "Get details for boredapeyachtclub" "Show me stats for cryptopunks with trading activity" "What's the floor price of doodles-official?" |
| get_collection_stats | Retrieve detailed statistics for an NFT collection, including floor price, volume, sales counts, and owner counts. | "Get stats for boredapeyachtclub" "What's the 24h volume for doodles-official?" |
| get_collection_floor_prices | Retrieve historical floor prices for an NFT collection as a time series (timestamp, USD price, native amount, and chain). | "What's the floor price of pudgypenguins?" "Show Azuki's floor price history" |
| manage_collections | Modify collection settings, visibility, rich metadata, or request image upload context. Requires a wallet identity token with the write:collections scope. | "Update my collection description" "Change the visibility of my collection" |
| search_items | Search for individual NFT items/tokens across OpenSea. Returns minimal information (id + name + collection) for context efficiency. | "Find Bored Ape #1234" "Search for rare traits in Azuki" "Look for NFTs priced under 0.1 ETH" |
| get_items | Retrieve detailed information about multiple NFT items at once. Supports includes like recent_activity, active_offers, and ownership_info. | "Get details for BAYC token 5678" "Show me CryptoPunk #100 with price history" "Check the owner of this NFT at 0x123..." |
| search_tokens | Search for cryptocurrencies and tokens by name or symbol, including ERC-20 tokens and meme coins. Returns minimal information (id + name + symbol) for context efficiency. | "Find USDC token" "Search for PEPE coin" "Look up SHIB token address" |
| get_tokens | Retrieve detailed information about multiple cryptocurrencies/tokens at once, including current prices. | "Get info for USDT at 0xdac17f..." "Show WETH token with price history" "What's the contract for DAI?" |
| get_token_swap_quote | Get a swap quote and blockchain actions needed to perform a token swap. Requires sufficient wallet balance to cover amount and gas fees. | "Quote swap 1 ETH to USDC" "How much WETH can I get for 1000 USDT?" "Calculate gas for swapping tokens" |
| get_token_balances | Retrieve token balances for a specific wallet address with USD values and detailed currency metadata. Supports filtering by contracts and sorting by various metrics. | "Check token balances for 0x123..." "Show my wallet's token portfolio" |
| get_nft_balances | Retrieve NFTs owned by a wallet address, ENS name, or username, with metadata, collection details, current listings, and offers. Filter by chain or collection slug. Paginated. | "Show NFTs owned by 0x789..." "What NFTs does snoop.eth own?" "Check my NFT collection" |
| get_favorites | Get the authenticated wallet's favorited items. Requires a wallet identity token (OIDC JWT via Authorization: Bearer) with the read:favorites scope; the wallet address is derived from the token. | "Show my favorited NFTs" "What items have I favorited?" |
| manage_watchlist | Add or remove an item, token, collection, or perpetual from the authenticated wallet's watchlist. Requires a wallet identity token with the write:favorites scope. | "Add this NFT to my watchlist" "Stop watching this token" |
| get_activity | Retrieve trading activity (sales, transfers, listings) for collections, items, profiles, or tokens. Supports pagination and timeframe filtering. | "Show recent sales for Bored Apes" "Get trading history for wallet 0x123..." "Find all USDC transfer activity" |
| get_top_collections | Retrieve top NFT collections with stats explaining why they're top-ranked. Filter by category, chains, verification status and sort by various metrics. | "Show top NFT collections by volume" "What are the highest floor price collections?" "Top trending collections today" |
| get_trending_collections | Retrieve trending NFT collections with stats explaining why they're trending. Filter by category, chains, and specify timeframes (ONE_HOUR, ONE_DAY, SEVEN_DAYS, THIRTY_DAYS). | "Show trending NFTs in the last hour" "What collections are hot this week?" "Find collections trending on Polygon" |
| get_top_tokens | Retrieve top cryptocurrencies and tokens sorted by ONE_DAY_VOLUME in descending order. Filter by chains to identify highest volume tokens. | "Show top tokens by daily volume" "What are the most traded tokens on Ethereum?" "Find high volume meme coins" |
| get_trending_tokens | Retrieve trending tokens ranked by OpenSea's trending score, which tracks current market momentum. Filter by chains. | "Show tokens with biggest gains today" "What cryptocurrencies are pumping?" "Find trending tokens on Base" |
| get_profile | Retrieve comprehensive profile information for a wallet address including basic details and optionally additional data like NFT holdings, trading activity, listings, offers, balances, and favorites. | "Show profile for wallet 0xabc..." "Get trading activity for vitalik.eth" "Check complete portfolio for this address" |
| manage_profile | Update profile settings, claim a username, request image upload context, or manage profile shelves. Requires a wallet identity token with the write:profile scope. | "Update my profile bio" "Create a new profile shelf" |
| manage_wallets | Get a wallet-link nonce and statement, link a wallet with a SIWX message signed over them, or unlink a wallet from the authenticated account. Requires a wallet identity token with the write:wallets scope. | "Link this wallet to my account" "Unlink my old wallet" |
| manage_agent_account | Declare the authenticated account an agent or withdraw that declaration, and propose, confirm, or revoke an agent ownership relationship with another account. Requires a wallet identity token with the write:wallets scope. | "Declare my account an agent" "Propose that 0xabc... owns this agent account" |
| get_agent_relationships | List the authenticated account's agent ownership relationships, including pending proposals awaiting either side. Requires a wallet identity token with the read:wallets scope. | "Show my agent relationships" "Is a proposal waiting on me?" |
| account_lookup | Look up account information by ENS name, wallet address, or username. Resolves ENS names to addresses and finds usernames associated with addresses. | "Look up vitalik.eth" "Find username for wallet 0x123..." "Resolve ENS name to address" |
| get_account_collections | Retrieve the collections held by a specific wallet address, with ownership counts and collection metadata. | "What collections does 0x123... hold?" "Show collections owned by vitalik.eth" |
| get_chains | Retrieve a list of all blockchain networks supported by OpenSea with chain identifiers and display names. | "What chains does OpenSea support?" "Show me all available blockchains" "List supported networks" |
| get_upcoming_drops | Retrieve drops from the OpenSea drop calendar: featured (the default, which can include drops that are minting or already over), upcoming, or recently minted, with mint status, dates, and collection details. | "What drops are coming up this week?" "Show upcoming NFT drops" |
| get_drop_details | Get detailed information about a specific NFT drop by collection slug. Returns drop stages, pricing, supply, and minting status. To check wallet eligibility, use check_drop_eligibility. | "Get drop details for pudgypenguins" "What's the price for the current drop stage?" |
| manage_drops | Save drop configuration and items, update item metadata, manage media and allowlist uploads, or validate an allowlist. Requires a wallet identity token with the write:drops scope. | "Update my drop settings" "Validate this drop allowlist" |
| check_drop_eligibility | Check whether your wallet is eligible to mint from a drop, including allowlist status and per-stage eligibility. The wallet identity comes from an access token (JWT) with the read:eligibility scope, passed as Authorization: Bearer alongside X-API-KEY. See the Authentication guide. | "Am I eligible to mint from this drop?" "Check my allowlist status for this drop" |
| get_mint_action | Get the transaction data to mint NFTs from a SeaDrop drop. Returns transaction data that must be signed and submitted by the user's wallet. Check pricing and stages with get_drop_details and the wallet's eligibility with check_drop_eligibility first. | "Mint 2 NFTs from this drop" "Get mint transaction for collection xyz" "Prepare a mint transaction for my wallet" |
| cancel_orders | Cancel a single OpenSea listing or offer offchain by chain, protocol address, and order hash. A fulfillment signature issued before the cancel stays valid for up to 5 minutes; this is not an onchain cancel. Requires a wallet identity token (OIDC JWT via Authorization: Bearer) with the write:orders scope. | "Cancel my listing for this NFT" "Cancel order 0xabc... on Base" |
| deploy_seadrop_contract | Get the transaction data to deploy a new SeaDrop NFT contract. Supports ERC721 (standard or clone) and ERC1155 (clone) token types. Returns transaction data that must be signed and submitted by the user's wallet. | "Deploy a new ERC721 NFT contract on Base" "Create a SeaDrop collection called MyNFT" "Deploy an ERC1155 drop contract" |
| get_deploy_receipt | Check the status of a SeaDrop contract deployment by transaction hash. Returns the deployment status, contract address, and collection information once the transaction is confirmed. | "Check if my contract deployment succeeded" "Get the contract address from this deployment tx" "What's the status of transaction 0x123...?" |
| search_tools | Search the onchain Tool Registry (ERC-8257) for registered AI agent tools by keyword, tags, access type, creator, or chain. Returns enriched results with NFT collection details for gated tools. | "Search for NFT-gated AI tools" "Find tools tagged with 'defi' on Base" "Show tools created by 0xABC..." |
| get_tool | Retrieve detailed information about a specific registered tool by its composite key (registry chain, registry address, and tool ID). Includes manifest data, access predicate details, and enriched NFT collection info. | "Get details for tool 42 on Base registry" "Show me the access requirements for this tool" |
Common Use Cases
Token Trading:
"Get a quote to swap 0.5 ETH for USDC on Base, then show me the transaction data"
Token Discovery:
"Find trending meme coins on Solana and show their 24-hour price changes"
Portfolio Analysis:
"Show me all tokens and NFTs owned by vitalik.eth with current USD values"
Market Research:
"What are the top tokens by trading volume on Ethereum today?"
NFT Research:
"Find NFT collections trending in the last 24 hours with floor price under 1 ETH"
NFT Minting:
"Check if I'm eligible for the upcoming drop and prepare the mint transaction for 2 NFTs"
Tool Discovery (ERC-8257):
"Search for NFT-gated AI tools on Base and show what each one requires for access"
Chain Support
OpenSea MCP supports all of the blockchains supported on the OpenSea web front-end.
When using tools, you can specify the chain parameter to filter results to a specific blockchain.
Best Practices
- Name the type in searches - Search is keyword-routed, so include a type word (token, NFT, account) and a chain name in the query
- Combine tools - Get comprehensive insights by using multiple tools together
- Specify chains - When looking for specific blockchain data, include the chain name
- Check balances first - Before requesting swap quotes, verify wallet has sufficient tokens
- Use collection slugs - For specific collections, use their OpenSea slug (e.g., 'boredapeyachtclub')
- Use
includesfor extra data -get_collections,get_items, andget_profiletake an optionalincludesarray, for examplerecent_salesortop_holdersfor collections,active_offersfor items, andlistingsfor a profile - Specify amounts correctly - For swap quotes,
fromQuantitymust be an integer in the token's base units (wei for ETH, lamports for SOL); decimal amounts like0.001are rejected
Rate Limits and Performance
- Most queries return results within 1-3 seconds
- Rate limits apply per API key
- Use pagination for large result sets
- Cursor-based pagination available for trending and top collections/tokens
Error Handling
The MCP server provides clear error messages:
- Invalid addresses or contract addresses
- Unsupported chains
- Rate limit exceeded
- Insufficient token balance for swaps
For questions, feedback or support, contact [email protected].
Client setup
Claude
Claude supports remote MCP connectors in its web and desktop apps. On a Pro or Max plan:
- Open Customize > Connectors, click + Add, then Add custom connector.
- Name it
OpenSeaand set the URL tohttps://mcp.opensea.io/mcp. - Under Request headers, add
X-API-KEYwith your OpenSea API key. Without it, Claude can list onlyget_instant_api_key. - Keep sign-in enabled if you want the wallet tools, and complete the OpenSea wallet sign-in when Claude asks. Otherwise choose No sign in.
On Team and Enterprise plans, an owner adds the connector under Organization settings > Connectors first.
For Claude's hosted remote connector, you do not need to edit Claude Desktop's local JSON file.
See Claude's custom connector guide for current availability and setup details.
Cursor
Go to Cursor Settings > MCP > Add new global MCP server, or edit the file directly:
- Project-level:
.cursor/mcp.jsonin your project root - Global:
~/.cursor/mcp.json
Add the JSON config above. For API-key access, use the header example from
Providing your API key. If Cursor offers an
authentication action after discovering OpenSea OAuth, complete it to add your
wallet identity. The OpenSea server should then show a green status indicator in
Cursor Settings > MCP.
VS Code (GitHub Copilot)
Run MCP: Open User Configuration from the Command Palette to edit your user mcp.json, or create .vscode/mcp.json in your workspace, and add:
{
"servers": {
"OpenSea": {
"type": "http",
"url": "https://mcp.opensea.io/mcp",
"headers": {
"X-API-KEY": "YOUR_API_KEY"
}
}
}
}Open Copilot Chat, switch to Agent mode, and click the tools icon to confirm the OpenSea tools are available.
Windsurf
Go to Windsurf Settings > Cascade > MCP, or edit ~/.codeium/windsurf/mcp_config.json. Note: Windsurf uses serverUrl instead of url:
{
"mcpServers": {
"OpenSea": {
"serverUrl": "https://mcp.opensea.io/mcp",
"headers": {
"X-API-KEY": "YOUR_API_KEY"
}
}
}
}ChatGPT
ChatGPT treats custom MCP connectors as apps:
- Enable developer mode for your account or workspace.
- Go to Settings > Apps > Create.
- Add an app named
OpenSeawith the endpointhttps://mcp.opensea.io/mcp. - Choose OAuth when testing wallet authentication, then select Scan tools.
- Complete the OpenSea wallet sign-in and create the app.
Full MCP support is currently limited by plan and workspace settings. See
OpenAI's developer mode guide
for the current requirements.
Perplexity
An organization admin must first allow custom remote connectors:
- Go to Account settings > Connectors.
- Select Custom connector > Remote.
- Name the connector
OpenSeaand set its URL tohttps://mcp.opensea.io/mcp. - Choose Streamable HTTP as the transport.
- Choose API Key for data-only testing or OAuth for wallet authentication.
- Add the connector, open its card, and complete authentication.
Perplexity presents API Key and OAuth as separate authentication methods. Check
the two-credential requirement before testing a
wallet-scoped tool. See
Perplexity's remote connector guide
for organization controls and current setup details.
Check your connection
Test each client in a new conversation:
- Confirm the OpenSea tools appear.
- Call a data tool, such as asking for a token price, to verify the API key.
- Call
get_favoritesto verify OAuth wallet identity and the
read:favoritesscope. - If the client reports a missing API key after OAuth, it is not sending both
required credentials. Recheck its custom-header support.
When reporting a problem, include the client, plan, model, authentication
method, tool name, and exact error. Remove API keys, wallet JWTs, and other
secrets before sharing logs.
Custom Applications
Integrate OpenSea MCP into your own applications using any MCP-compatible SDK:
Vercel AI SDK: See the full starter project at opensea-mcp-next-sample. The MCP client ships in the @ai-sdk/mcp package (npm install @ai-sdk/mcp).
import { experimental_createMCPClient as createMCPClient } from "@ai-sdk/mcp";
const apiKey = process.env.OPENSEA_API_KEY;
if (!apiKey) throw new Error("OPENSEA_API_KEY is required");
const mcpClient = await createMCPClient({
transport: {
type: "sse",
url: "https://mcp.opensea.io/sse",
headers: { "X-API-KEY": apiKey },
},
});
const tools = await mcpClient.tools();Python
This uses the mcp package 2.x, which takes headers through an httpx2 client:
import httpx2
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
async with httpx2.AsyncClient(headers={"X-API-KEY": "YOUR_API_KEY"}) as http_client:
async with streamable_http_client(
"https://mcp.opensea.io/mcp", http_client=http_client
) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()TypeScript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://mcp.opensea.io/mcp"),
{ requestInit: { headers: { "X-API-KEY": "YOUR_API_KEY" } } }
);
const client = new Client({ name: "my-app", version: "1.0.0" });
await client.connect(transport);
const { tools } = await client.listTools();Prefer the header-based approach when possible. Avoid embedding API keys in URLs in client-side code where they may be visible in browser network logs.