nft-analytics-mcp
Provides NFT collection analytics for Ethereum blockchain, including trading volume, sales data, average prices, and unique trader metrics for top NFT collections.
Shows repository information and installation process from GitHub, allowing users to access the source code and installation instructions.
Returns NFT analytics results in formatted markdown tables for easy reading within conversation interfaces.
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-analytics-mcpshow me the daily trading volume for top NFT collections over the last 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 Analytics MCP
An MCP server that delivers NFT collection analytics powered by data from Dune Analytics.
Features
Analytics:
Daily trading volume for top 5 Ethereum NFT collections
Number of daily sales by collection
Average selling prices per collection
Unique buyers and sellers by collection
New NFT owner counts
Returns results in formatted markdown tables for easy reading
Related MCP server: hyperliquid-info-mcp
Prerequisites
Python 3.10+
uv (recommended package manager)
A valid Dune Analytics API key
Installation
Clone the Repository
git clone https://github.com/kukapay/nft-analytics-mcp.git cd nft-analytics-mcpInstall Dependencies
uv syncInstalling to Claude Desktop:
Install the server as a Claude Desktop application:
uv run mcp install main.py --name "NFT Analytics"Configuration file as a reference:
{ "mcpServers": { "NFT Analytics": { "command": "uv", "args": [ "--directory", "/path/to/nft-analytics-mcp", "run", "main.py" ], "env": { "DUNE_API_KEY": "dune_api_key"} } } }Replace
/path/to/nft-analytics-mcpwith your actual installation path, anddune_api_keywith your API key from Dune Analytics.
Usage
The server provides the following tools, accessible via the MCP interface:
get_daily_trading_volume_by_collection(limit: int = 1000): Retrieves daily trading volume for top 5 Ethereum NFT collections.get_daily_sales_by_collection(limit: int = 1000): Fetches the number of daily sales per collection.get_average_price_by_collection(limit: int = 1000): Gets the average selling price for each collection.get_unique_traders_by_collection(limit: int = 1000): Tracks unique buyers and sellers by collection.get_new_owners(): Returns the count of new NFT wallet owners.
All tools return data in markdown table format (except get_new_owners, which returns a string).
get_daily_trading_volume_by_collection
Prompt:
Show me the daily trading volume for the top 5 Ethereum NFT collections over the last 500 records.Output:
| day | Bored Ape Yacht Club | Doodles | Good Vibes Club | PudgyPenguins |
|:-----------|-----------------------:|----------:|------------------:|-----------------:|
| 2025-06-12 | 344501 | 35871.7 | 21391.8 | 179928 |
| 2025-06-11 | 156750 | 119613 | 62610.2 | 262158 |
| 2025-06-10 | 243575 | 108845 | 124961 | 290297 |
| 2025-06-09 | 31536.8 | 226234 | 101207 | 163011 |
| 2025-06-08 | 117099 | 137788 | 83116.6 | 136718 |
| 2025-06-07 | 180229 | 52635.8 | 110748 | 140412 |
| 2025-06-06 | 309650 | 57154 | 33671.2 | 425785 |
| 2025-06-05 | 258358 | 93874.1 | 79988 | 330515 |
| 2025-06-04 | 208540 | 110977 | 118858 | 309126 |
| 2025-06-03 | 321258 | 80658.5 | 77724.4 | 217688 |
| 2025-06-02 | 215127 | 198097 | 153964 | 120258 |
| 2025-06-01 | 77824.4 | 157749 | 141651 | 185943 |
| 2025-05-31 | 155234 | 133476 | 210537 | 118505 |get_daily_sales_by_collection
Prompt:
Get the number of daily sales for NFT collections, limited to 500 records.Output:
| day | Bored Ape Yacht Club | Doodles | Good Vibes Club | PudgyPenguins |
|:-----------|-----------------------:|----------:|------------------:|----------------:|
| 2025-06-12 | 10 | 13 | 9 | 7 |
| 2025-06-11 | 4 | 43 | 24 | 10 |
| 2025-06-10 | 7 | 35 | 31 | 11 |
| 2025-06-09 | 1 | 86 | 40 | 7 |
| 2025-06-08 | 3 | 49 | 35 | 6 |
| 2025-06-07 | 5 | 20 | 40 | 6 |
| 2025-06-06 | 9 | 22 | 14 | 19 |
| 2025-06-05 | 8 | 33 | 31 | 15 |
| 2025-06-04 | 7 | 39 | 28 | 13 |
| 2025-06-03 | 9 | 29 | 27 | 9 |
| 2025-06-02 | 8 | 63 | 51 | 5 |
| 2025-06-01 | 2 | 55 | 38 | 7 |
| 2025-05-31 | 6 | 49 | 74 | 5 |get_average_price_by_collection
Prompt:
What are the average selling prices for NFT collections? Limit to 500 records.Output:
| | average_price_usd | collection |
|---:|--------------------:|:---------------------|
| 0 | 35340.6 | Bored Ape Yacht Club |
| 1 | 25076.2 | PudgyPenguins |
| 2 | 6912.56 | Milady |
| 3 | 6530.12 | Azuki |
| 4 | 5796.55 | MutantApeYachtClub |
| 5 | 3122.59 | LilPudgys |
| 6 | 3056.9 | Doodles |
| 7 | 2778.29 | Good Vibes Club |
| 8 | 1815.92 | Moonbirds |get_unique_traders_by_collection
Prompt:
List the unique buyers and sellers for NFT collections, up to 500 records.Output:
| | collection | unique_buyers | unique_sellers |
|---:|:---------------------|----------------:|-----------------:|
| 0 | Doodles | 518 | 511 |
| 1 | PudgyPenguins | 170 | 201 |
| 2 | Good Vibes Club | 492 | 670 |
| 3 | Bored Ape Yacht Club | 134 | 151 |get_new_owners
Prompt:
How many new wallets have acquired NFTs recently?`Output:
63302License
This project is licensed under the MIT License. See the LICENSE file for details.
Available Tools
5 toolsget_average_price_by_collectionC
Retrieve average selling price for NFT collections.
Args:
limit (int, optional): Maximum number of rows to fetch from the query. Defaults to 1000.
Returns:
str: Markdown table of average prices by collection, or error message if the query fails.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that the tool returns a markdown table or error message, which adds some context about output format. However, it lacks details on critical behavioral traits like rate limits, authentication needs, data freshness, or whether it's a read-only operation (implied by 'Retrieve' but not explicit). For a tool with no annotations, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, with the purpose stated clearly in the first sentence. The Args and Returns sections are structured efficiently, though the 'Returns' section could be more concise (e.g., by omitting 'or error message if the query fails' if errors are assumed). Overall, it avoids unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (1 parameter, no output schema, no annotations), the description is somewhat complete but has gaps. It covers the basic purpose and parameter, and hints at output format. However, it lacks details on behavioral aspects and usage context, which are important for effective tool selection and invocation. Without annotations or output schema, more comprehensive guidance would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds minimal semantics beyond the input schema. It explains that 'limit' is 'Maximum number of rows to fetch from the query' and defaults to 1000, which matches the schema's default value. However, with 0% schema description coverage, the description doesn't fully compensate by providing details like valid ranges or implications of the limit parameter. The baseline is 3 since it adds some value but not enough to overcome the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Retrieve average selling price for NFT collections.' It specifies the verb ('Retrieve') and resource ('average selling price for NFT collections'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'get_daily_sales_by_collection' or 'get_daily_trading_volume_by_collection', which also involve collection data but focus on different metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools or contexts where this tool is preferred, such as for price analysis rather than sales volume or trader metrics. Without such guidance, users must infer usage based on the tool name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_sales_by_collectionB
Retrieve number of daily sales for NFT collections.
Args:
limit (int, optional): Maximum number of rows to fetch from the query. Defaults to 1000.
Returns:
str: Markdown table of daily sales counts by collection, or error message if the query fails.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adequately describes the core functionality (retrieving sales counts) and output format (Markdown table or error message), but lacks details about performance characteristics, rate limits, authentication requirements, or what constitutes a 'failed' query beyond error messages.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured with a clear purpose statement followed by dedicated Args and Returns sections. Every sentence adds value without redundancy, making it easy to scan and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (single optional parameter, no output schema, no annotations), the description covers the basics adequately but has gaps. It explains what the tool does and the parameter, but doesn't address sibling differentiation, error conditions in detail, or data freshness, which would help an agent use it more effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context for the single parameter 'limit' by explaining it controls 'Maximum number of rows to fetch from the query' and provides the default value. Since schema description coverage is 0% and there's only one parameter, this compensates well, though it could specify units or constraints like minimum/maximum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Retrieve') and resource ('number of daily sales for NFT collections'), making the purpose immediately understandable. However, it doesn't explicitly differentiate this tool from its siblings like 'get_daily_trading_volume_by_collection' or 'get_average_price_by_collection', which would require more specific language about what distinguishes sales counts from other metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus its siblings. It doesn't mention alternatives, prerequisites, or specific contexts where this tool is preferred over others like 'get_daily_trading_volume_by_collection' for volume data or 'get_average_price_by_collection' for price metrics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_trading_volume_by_collectionA
Retrieve daily trading volume for top 5 Ethereum NFT collections.
Args:
limit (int, optional): Maximum number of rows to fetch from the query. Defaults to 1000.
Returns:
str: Markdown table of daily trading volumes by collection, or error message if the query fails.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the return format ('Markdown table') and error handling ('error message if the query fails'), which adds useful context beyond basic functionality. However, it lacks details on rate limits, data freshness, or authentication needs, leaving gaps for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by structured sections for Args and Returns. Every sentence adds value without redundancy, making it efficient and easy to parse for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (1 parameter, no output schema, no annotations), the description is largely complete. It covers purpose, parameter semantics, and return format. However, it lacks explicit guidance on when to use versus siblings and omits behavioral details like data sources or update frequency, which could enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful semantics for the single parameter 'limit', explaining it as 'Maximum number of rows to fetch from the query' with a default of 1000. Since schema description coverage is 0%, this compensates well by clarifying the parameter's purpose and default behavior, though it doesn't specify constraints like minimum/maximum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Retrieve daily trading volume') and resource ('top 5 Ethereum NFT collections'), distinguishing it from siblings like get_average_price_by_collection or get_daily_sales_by_collection. It precisely defines the scope and target data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching daily trading volume data, but does not explicitly state when to use this tool versus alternatives like get_daily_sales_by_collection or get_average_price_by_collection. No exclusions or prerequisites are mentioned, leaving usage context inferred rather than defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_new_ownersB
Retrieve count of new NFT owners.
Returns:
str: Count of new wallet owners as a string, or "N/A" if no data is available,
or error message if the query fails.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions return values (count as string, 'N/A', or error message), which adds some context, but fails to disclose critical traits like whether this is a read-only operation, potential rate limits, authentication needs, or how 'new owners' is defined (e.g., time window). This leaves significant gaps for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, followed by a concise explanation of return values. Every sentence adds value without waste, making it efficiently structured and appropriately sized for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is adequate but has clear gaps. It explains the return format, which is helpful, but lacks context on usage guidelines and behavioral traits like data scope or limitations, making it minimally viable but incomplete for optimal agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, but it correctly avoids unnecessary details, earning a baseline high score for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Retrieve' and the resource 'count of new NFT owners', making the purpose specific and understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_unique_traders_by_collection', which might retrieve similar but distinct data about traders rather than new owners.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_unique_traders_by_collection' or other sibling tools. It lacks context about prerequisites, such as whether it applies to a specific collection or timeframe, leaving usage unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unique_traders_by_collectionA
Retrieve count of unique buyers and sellers for NFT collections.
Args:
limit (int, optional): Maximum number of rows to fetch from the query. Defaults to 1000.
Returns:
str: Markdown table of unique traders by collection, or error message if the query fails.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds some context by specifying the return format (Markdown table) and error handling, but lacks details on permissions, rate limits, or side effects. This is adequate but has clear gaps for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by structured sections for Args and Returns. Every sentence earns its place, with no wasted words, making it efficient and easy to parse for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one optional parameter) and no output schema, the description is reasonably complete. It covers purpose, parameter semantics, and return format, though it could benefit from more behavioral context like error conditions or performance notes to be fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful semantics beyond the input schema, which has 0% coverage. It explains that 'limit' controls the maximum rows fetched and defaults to 1000, compensating for the schema's lack of descriptions. With only one parameter, this provides sufficient context for agent understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb ('retrieve count') and resource ('unique buyers and sellers for NFT collections'), distinguishing it from siblings like get_average_price_by_collection or get_daily_sales_by_collection. It precisely defines what the tool does without being vague or tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like get_new_owners or other sibling tools. It lacks context about use cases, prerequisites, or exclusions, leaving the agent to infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes focused on different NFT analytics metrics (average price, daily sales, trading volume, new owners, unique traders), but get_daily_sales_by_collection and get_daily_trading_volume_by_collection could potentially be confused as both relate to daily collection-level activity. The descriptions help clarify, but there's some overlap in their temporal and collection focus.
All tools follow a consistent verb_noun_by_collection pattern (get_average_price_by_collection, get_daily_sales_by_collection, etc.), with the exception of get_new_owners which omits 'by_collection' but maintains the same verb_noun structure. This minor deviation doesn't break the overall consistency, making the naming highly predictable and readable.
With 5 tools, the count is reasonable for an NFT analytics server, covering key metrics without being overwhelming. However, it feels slightly thin for a comprehensive analytics suite, as it lacks tools for broader analysis like trends over time or cross-collection comparisons, but it's well within an appropriate range for its focused scope.
The toolset covers several important NFT analytics metrics (price, sales, volume, owners, traders), but there are notable gaps. It lacks tools for updating or managing data, historical trend analysis, or filtering by specific parameters beyond collections, which limits the depth of analysis an agent can perform. The surface is functional but incomplete for advanced analytics workflows.
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 Connectors
Crypto market intelligence, token rug-checks, and wallet verification in one MCP server.
Unlock the power of real-time cryptocurrency data with our Crypto Price Insights MCP server.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
An MCP server giving access to Grafana dashboards, data and more.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA mcp server that bridges Dune Analytics data to AI agents.41MIT
- AlicenseAqualityFmaintenanceAn MCP server that provides real-time data and insights from the Hyperliquid perp DEX for use in bots, dashboards, and analytics.1729MIT
- AlicenseAqualityDmaintenanceAn MCP server that analyzes wallets’ trading activity and profitability on Pump.fun and PumpSwap.41MIT
- AlicenseAqualityDmaintenanceAn MCP server that tracks daily activity and graduate metrics across multiple Solana launchpads.41MIT
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/kukapay/nft-analytics-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server