nft-analytics-mcp
# 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
## Prerequisites
- Python 3.10+
- [uv](https://github.com/astral-sh/uv) (recommended package manager)
- A valid Dune Analytics API key
## Installation
1. **Clone the Repository**
```bash
git clone https://github.com/kukapay/nft-analytics-mcp.git
cd nft-analytics-mcp
```
2. **Install Dependencies**
```bash
uv sync
```
3. **Installing to Claude Desktop**:
Install the server as a Claude Desktop application:
```bash
uv run mcp install main.py --name "NFT Analytics"
```
Configuration file as a reference:
```json
{
"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-mcp` with your actual installation path, and `dune_api_key` with 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**:
```
63302
```
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
TDQS
Scored across 5 tools
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.