MCP server

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/keys

This 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_key tool (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-KEY header (shown below): recommended.
  • Authorization: Bearer YOUR_API_KEY header: 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-KEY and the OAuth wallet JWT in Authorization. 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
379893200225068569 with 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 sent tools/list returns only the built-in get_instant_api_key tool. An agent can connect with no key, call it to mint a free-tier key, then reconnect using that key as the X-API-KEY or Authorization: Bearer header. The other tools appear after it reconnects with a key.

Quick Start Examples

Once connected, try these prompts to explore OpenSea MCP capabilities:

  1. "What's the price of PEPE token on Ethereum?"
  2. "Show me trending tokens on Base"
  3. "Quote a swap of 1 ETH to USDC"
  4. "Check the complete portfolio for wallet 0x123..."
  5. "What's the floor price of Pudgy Penguins?"
  6. "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.

NameDescriptionSample prompts
get_instant_api_keyCreate 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"
searchKeyword 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"
fetchRetrieve 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_collectionsSearch 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_collectionsRetrieve 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_statsRetrieve 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_pricesRetrieve 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_collectionsModify 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_itemsSearch 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_itemsRetrieve 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_tokensSearch 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_tokensRetrieve 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_quoteGet 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_balancesRetrieve 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_balancesRetrieve 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_favoritesGet 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_watchlistAdd 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_activityRetrieve 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_collectionsRetrieve 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_collectionsRetrieve 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_tokensRetrieve 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_tokensRetrieve 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_profileRetrieve 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_profileUpdate 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_walletsGet 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_accountDeclare 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_relationshipsList 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_lookupLook 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_collectionsRetrieve 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_chainsRetrieve 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_dropsRetrieve 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_detailsGet 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_dropsSave 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_eligibilityCheck 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_actionGet 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_ordersCancel 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_contractGet 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_receiptCheck 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_toolsSearch 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_toolRetrieve 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

  1. Name the type in searches - Search is keyword-routed, so include a type word (token, NFT, account) and a chain name in the query
  2. Combine tools - Get comprehensive insights by using multiple tools together
  3. Specify chains - When looking for specific blockchain data, include the chain name
  4. Check balances first - Before requesting swap quotes, verify wallet has sufficient tokens
  5. Use collection slugs - For specific collections, use their OpenSea slug (e.g., 'boredapeyachtclub')
  6. Use includes for extra data - get_collections, get_items, and get_profile take an optional includes array, for example recent_sales or top_holders for collections, active_offers for items, and listings for a profile
  7. Specify amounts correctly - For swap quotes, fromQuantity must be an integer in the token's base units (wei for ETH, lamports for SOL); decimal amounts like 0.001 are 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:

  1. Open Customize > Connectors, click + Add, then Add custom connector.
  2. Name it OpenSea and set the URL to https://mcp.opensea.io/mcp.
  3. Under Request headers, add X-API-KEY with your OpenSea API key. Without it, Claude can list only get_instant_api_key.
  4. 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.json in 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:

  1. Enable developer mode for your account or workspace.
  2. Go to Settings > Apps > Create.
  3. Add an app named OpenSea with the endpoint https://mcp.opensea.io/mcp.
  4. Choose OAuth when testing wallet authentication, then select Scan tools.
  5. 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:

  1. Go to Account settings > Connectors.
  2. Select Custom connector > Remote.
  3. Name the connector OpenSea and set its URL to https://mcp.opensea.io/mcp.
  4. Choose Streamable HTTP as the transport.
  5. Choose API Key for data-only testing or OAuth for wallet authentication.
  6. 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:

  1. Confirm the OpenSea tools appear.
  2. Call a data tool, such as asking for a token price, to verify the API key.
  3. Call get_favorites to verify OAuth wallet identity and the
    read:favorites scope.
  4. 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.