Skip to main content
Glama

NFT Analytics MCP

An MCP server that delivers NFT collection analytics powered by data from Dune Analytics.

GitHub License Python Version Status

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

  1. Clone the Repository

    git clone https://github.com/kukapay/nft-analytics-mcp.git
    cd nft-analytics-mcp
  2. Install Dependencies

    uv sync
  3. Installing 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-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 file for details.

Available Tools

5 tools
get_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.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

A3.5/5.0
Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness3/5

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

ActivityInactive
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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