Skip to main content
Glama
yasinozen35

free-etf-flows-mcp

by yasinozen35

Free Spot ETF Flows MCP Server

API Status MCP Support OpenAPI Spec License

🌐 Live Documentation & Website: https://yasinozen35.github.io/free-etf-flows-mcp/
📄 OpenAPI 3.0 Specification: openapi.json
📦 Smithery MCP Registry: https://smithery.ai/servers/yasinozen35/free-etf-flows-mcp
🦎 Glama MCP Registry: https://glama.ai/mcp/servers/yasinozen35/free-etf-flows-mcp

This is an open-source Model Context Protocol (MCP) server that connects your AI assistants (like Claude Desktop, Cursor, Windsurf) to Spot Bitcoin (BTC) and Ethereum (ETH) institutional net flow data.

It fetches clean, normalized data directly from the consolidated institutional data feeds, bypassing messy scrape formats.


✨ Features

  • Native AI Integration: Adds get_latest_etf_flows and query_etf_flows_by_date_range tools to your LLM context.

  • Normalized Values: Institutional formatting (like brackets for negative values (219.4)) are automatically converted to standard USD floats (-219400000.00).

  • Free/Preview Fallback: Works out-of-the-box without an API key in Limited Preview Mode (returns 3 latest records with a 1-day delay).

  • Pro Tier support: Full, real-time historical queries with higher rate limits when configured with an API key.


Related MCP server: etf-flow-mcp

🚀 Setup Instructions

Prerequisites

You need uv installed on your machine to run this server easily without managing virtual environments manually.

# Install uv (Mac/Linux)
curl -LsSf https://astral.sh/uv/install.sh | sh

1. Configure Claude Desktop

Add the following block to your claude_desktop_config.json (located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "etf-flows": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/free-etf-flows-mcp",
        "run",
        "python",
        "mcp_server.py"
      ],
      "env": {
        "ETF_FLOWS_API_KEY": "YOUR_PRO_API_KEY_HERE"
      }
    }
  }
}

Note: If you don't have an API key yet, you can leave the ETF_FLOWS_API_KEY empty (or omit it) to run in Free Preview Mode.

2. Configure Cursor

  1. Open Cursor Settings (Settings > Features > MCP).

  2. Click + Add New MCP Server.

  3. Fill in the details:

    • Name: etf-flows

    • Type: command

    • Command: uv --directory /absolute/path/to/free-etf-flows-mcp run python mcp_server.py

  4. Set the environment variable in your terminal/system or configure it directly in Cursor:

    • Key: ETF_FLOWS_API_KEY

    • Value: YOUR_PRO_API_KEY_HERE


🛠️ MCP Tools Provided

Once connected, your AI assistant will have access to the following tools:

1. get_latest_etf_flows

  • Description: Get the most recent Spot ETF flow records for a given ticker.

  • Arguments:

    • ticker (string, optional): 'BTC' or 'ETH'. Defaults to 'BTC'.

2. query_etf_flows_by_date_range

  • Description: Query historical ETF flows within a specific date range.

  • Arguments:

    • start_date (string, required): YYYY-MM-DD format.

    • end_date (string, required): YYYY-MM-DD format.

    • ticker (string, optional): 'BTC' or 'ETH'.


💳 Get a Pro API Key

To unlock unlimited historical data, real-time updates (0-day delay), and higher rate limits, purchase a Pro Developer key from our website:

👉 Get Pro API Key or visit our website https://yasinozen35.github.io/free-etf-flows-mcp/.

Available Tools

3 tools
get_latest_etf_flowsA

Fetch the most recent Spot ETF flow records for a given ticker (BTC or ETH).

Args: ticker: The asset ticker, either 'BTC' or 'ETH' (default 'BTC')

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerNoBTC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/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 identifies the operation as a read ('Fetch') and specifies the ticker scope, but does not disclose details like whether multiple records are returned, ordering, or any side effects. It implicitly indicates read-only behavior but lacks explicit confirmation.

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 appropriately concise, with a single purpose statement and an args section that directly explains the only parameter. There is no redundant or filler content; every sentence contributes value.

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 simplicity (one optional parameter) and the existence of an output schema, the description provides the essential purpose and parameter semantics. It does not mention alternatives or edge cases, but for a basic read tool this is sufficient for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no property descriptions (0% coverage), so the description compensates fully by explaining the 'ticker' parameter with its valid values ('BTC' or 'ETH') and default of 'BTC'. This adds clear meaning beyond the raw type and default in the schema, leaving no ambiguity about the parameter.

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 tool's function with a specific verb ('Fetch') and resource ('Spot ETF flow records'), scoped to the most recent records for a given ticker. It distinguishes itself from sibling tools like query_etf_flows_by_date_range, which focuses on date-range queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context that this tool is for retrieving the latest ETF flows for a ticker, implying its use case. However, it does not explicitly mention alternatives or when not to use it, such as using query_etf_flows_by_date_range for historical data. This is a minor gap in guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pro_access_infoA

Get information on how to upgrade to a Pro API Key for unlimited real-time Spot ETF flow queries.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It specifies the subject of the information (upgrade to Pro) but does not describe the response format, whether authentication is needed, or explicitly state it is a read-only operation. The word 'Get' implies safety but adds limited detail beyond the name.

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 a single, concise sentence that fully conveys the tool's purpose without any wasted words. It is front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter informational tool with an output schema, the description is sufficient. It clearly indicates what the tool provides and requires no further elaboration.

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 zero parameters, so the description does not need to add parameter meaning. Baseline of 4 for zero-parameter tools applies.

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 tool provides information on upgrading to a Pro API Key for unlimited real-time Spot ETF flow queries, using the specific verb 'Get' and a clear resource. It distinguishes itself from sibling tools that query flow data directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case (wanting to upgrade to Pro) and the context is clear from the sibling tool names, but it does not explicitly state when not to use this tool or name alternatives. Still, the purpose is self-evident enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_etf_flows_by_date_rangeA

Query historical ETF flows within a specific date range.

Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format ticker: Optional asset ticker ('BTC' or 'ETH') to filter the query

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerNo
end_dateYes
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the full burden. It indicates a read-only query operation, but does not disclose potential rate limits, authentication requirements, or edge-case behavior like empty results. It adds date-range context but lacks deeper behavioral details.

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 minimal and front-loaded with a clear one-sentence purpose, followed by a compact parameter list. No unnecessary words or repetition; every line adds value.

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 has an output schema (so return values are covered) and a low-complexity parameter set, the description is mostly complete. However, it does not mention whether the date range is inclusive or how to filter for both assets, leaving minor gaps.

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?

Schema coverage is 0%, so the description compensates by specifying date format ('YYYY-MM-DD') and the allowed ticker values ('BTC' or 'ETH'). This adds meaning beyond the bare parameter names in the schema, though it does not clarify the default behavior when ticker is omitted.

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 tool's function: 'Query historical ETF flows within a specific date range.' The verb 'query' and resource 'historical ETF flows' are specific, and the date-range scope distinguishes it from sibling tools like get_latest_etf_flows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies historical, date-scoped usage, which contrasts with the 'latest' in get_latest_etf_flows. However, it does not explicitly name alternatives or state when not to use this tool, so it falls short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.0
    • First observedget_latest_etf_flows
    • First observedget_pro_access_info
    • First observedquery_etf_flows_by_date_range

TDQS

A4.3/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a distinct purpose: one fetches latest flows, one queries a date range, and one provides account upgrade info. No overlap or ambiguity in their roles.

Naming Consistency4/5

All names follow a verb-noun pattern, but 'query' in the second tool is a slight deviation from the 'get' used in the other two. Overall, names are clear and predictable.

Tool Count4/5

Three tools is a reasonable count for a focused ETF flow server, though it sits at the lower boundary of the typical well-scoped range. The purpose is narrow, so the count feels appropriate.

Completeness4/5

The tools cover the core data retrieval needs: latest flows and historical range queries. A minor gap is the lack of a direct 'get all flows' without a date range, but users can work around with broad dates. The pro access tool adds useful context.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers