返回市场
低温-MCP

低温-MCP

作者:z80dev90 星标更新:2025-03-10

项目介绍

Cryo MCP 🧊

用于Cryo区块链数据提取工具的模型完成协议(MCP)服务器。通过实现MCP协议的API服务器,Cryo MCP允许您轻松地从任何兼容MCP的客户端查询区块链数据。

针对LLM用户的:SQL查询工作流程指南

当使用此MCP服务器在区块链数据上运行SQL查询时,请遵循以下工作流程:

  1. 下载数据 使用 query_dataset

    result = query_dataset(
        dataset="blocks",  # 或者 "transactions", "logs" 等
        blocks="15000000:15001000",  # 或者使用 blocks_from_latest=100
        output_format="parquet"  # 重要:使用parquet以支持SQL
    )
    files = result.get("files", [])  # 获取返回的文件路径
    
  2. 探索模式 使用 get_sql_table_schema

    # 检查文件中可用的列
    schema = get_sql_table_schema(files[0])
    # 现在您可以查看所有列、数据类型和样本数据
    
  3. 运行SQL 使用 query_sql

    # 选项1:简单的表引用(DuckDB会将表名与文件匹配)
    sql_result = query_sql(
        query="SELECT block_number, timestamp, gas_used FROM blocks",
        files=files  # 传递步骤1中的文件
    )
    
    # 选项2:使用read_parquet()和显式的文件路径
    sql_result = query_sql(
        query=f"SELECT block_number, timestamp, gas_used FROM read_parquet('{files[0]}')",
        files=files  # 传递步骤1中的文件
    )
    

或者,使用组合方法 query_blockchain_sql

# 选项1:简单的表引用
result = query_blockchain_sql(
    sql_query="SELECT * FROM blocks",
    dataset="blocks",
    blocks_from_latest=100
)

# 选项2:使用read_parquet()
result = query_blockchain_sql(
    sql_query="SELECT * FROM read_parquet('/path/to/file.parquet')",  # 路径无关紧要
    dataset="blocks",
    blocks_from_latest=100
)

完整的示例,请参见 examples/sql_workflow_example.py

功能

  • 完全访问Cryo数据集:通过API服务器查询任何Cryo数据集
  • MCP集成:无缝与MCP客户端集成
  • 灵活的查询选项:支持所有主要的Cryo过滤和输出选项
  • 区块范围选项:查询特定区块、最新区块或相对范围
  • 合约过滤:按合约地址过滤数据
  • 最新区块访问:轻松访问最新的Ethereum区块数据
  • 多种输出格式:支持JSON、CSV和Parquet
  • 模式信息:获取详细的模式信息和样本数据
  • SQL查询:直接针对下载的区块链数据运行SQL查询

安装(可选)

如果您将直接使用 uvx 运行该工具,则不需要执行此操作。

# 使用UV安装(推荐)
uv tool install cryo-mcp

要求

  • Python 3.8+
  • uv
  • 已安装的 Cryo
  • 访问Ethereum RPC端点
  • DuckDB(用于SQL查询功能)

快速开始

使用Claude Code

  1. 运行 claude mcp add 以获得交互式提示。
  2. 输入 uvx 作为要运行的命令。
  3. 输入 cryo-mcp --rpc-url <ETH_RPC_URL> [--data-dir <DATA_DIR>] 作为参数。
  4. 或者,提供 ETH_RPC_URLCRYO_DATA_DIR 作为环境变量。

新的 claude 实例现在可以访问配置为击中您的RPC端点并存储指定目录数据的Cryo。

可用工具

Cryo MCP公开了以下MCP工具:

list_datasets()

返回所有可用的Cryo数据集列表。

示例:

client.list_datasets()

query_dataset()

使用各种过滤选项查询Cryo数据集。

参数:

  • dataset (str): 要查询的数据集名称(例如,'blocks', 'transactions', 'logs')
  • blocks (str, 可选): 区块范围规范(例如,'1000:1010')
  • start_block (int, 可选): 开始区块编号(替代blocks)
  • end_block (int, 可选): 结束区块编号(替代blocks)
  • use_latest (bool, 可选): 如果为True,则查询最新区块
  • blocks_from_latest (int, 可选): 从最新区块开始包括的区块数
  • contract (str, 可选): 用于过滤的合约地址
  • output_format (str, 可选): 输出格式('json', 'csv', 'parquet')
  • include_columns (list, 可选): 除了默认列外要包含的列
  • exclude_columns (list, 可选): 从默认列中排除的列

示例:

# 获取区块15M到15.01M之间的交易
client.query_dataset('transactions', blocks='15M:15.01M')

# 获取最新100个区块中特定合约的日志
client.query_dataset('logs', blocks_from_latest=100, contract='0x1234...')

# 获取仅最新的区块
client.query_dataset('blocks', use_latest=True)

lookup_dataset()

获取有关特定数据集的详细信息,包括模式和样本数据。

参数:

  • name (str): 要查找的数据集名称
  • sample_start_block (int, 可选): 样本数据的起始区块
  • sample_end_block (int, 可选): 样本数据的结束区块
  • use_latest_sample (bool, 可选): 使用最新区块作为样本
  • sample_blocks_from_latest (int, 可选): 从最新区块开始的样本区块数

示例:

client.lookup_dataset('logs')

get_latest_ethereum_block()

返回关于最新Ethereum区块的信息。

示例:

client.get_latest_ethereum_block()

SQL查询工具

Cryo MCP包括几个用于针对区块链数据运行SQL查询的工具:

query_sql()

针对已下载的区块链数据运行SQL查询。

参数:

  • query (str): 要执行的SQL查询
  • files (list, 可选): 要查询的parquet文件路径列表。如果为None,则使用数据目录中的所有文件。
  • include_schema (bool, 可选): 是否在结果中包含模式信息

示例:

# 针对所有可用文件运行
client.query_sql("SELECT * FROM read_parquet('/path/to/blocks.parquet') LIMIT 10")

# 针对特定文件运行
client.query_sql(
    "SELECT * FROM read_parquet('/path/to/blocks.parquet') LIMIT 10",
    files=['/path/to/blocks.parquet']
)

query_blockchain_sql()

使用SQL查询区块链数据,自动下载所需的任何数据。

参数:

  • sql_query (str): 要执行的SQL查询
  • dataset (str, 可选): 要查询的数据集(例如,'blocks', 'transactions')
  • blocks (str, 可选): 区块范围规范
  • start_block (int, 可选): 开始区块编号
  • end_block (int, 可选): 结束区块编号
  • use_latest (bool, 可选): 如果为True,则查询最新区块
  • blocks_from_latest (int, 可选): 从最新区块开始包括的区块数
  • contract (str, 可选): 用于过滤的合约地址
  • force_refresh (bool, 可选): 即使存在数据也强制下载新数据
  • include_schema (bool, 可选): 在结果中包含模式信息

示例:

# 自动下载所需的数据,然后运行SQL查询
client.query_blockchain_sql(
    sql_query="SELECT block_number, gas_used, timestamp FROM blocks ORDER BY gas_used DESC LIMIT 10",
    dataset="blocks",
    blocks_from_latest=100
)

list_available_sql_tables()

列出所有可用的可以使用SQL查询的表。

示例:

client.list_available_sql_tables()

get_sql_table_schema()

获取特定parquet文件的模式。

参数:

  • file_path (str): parquet文件的路径

示例:

client.get_sql_table_schema("/path/to/blocks.parquet")

get_sql_examples()

获取不同区块链数据集的示例SQL查询。

示例:

client.get_sql_examples()

配置选项

启动Cryo MCP服务器时,您可以使用这些命令行选项:

  • --rpc-url URL: Ethereum RPC URL(覆盖ETH_RPC_URL环境变量)
  • --data-dir PATH: 存储下载数据的目录(覆盖CRYO_DATA_DIR环境变量,默认为~/.cryo-mcp/data/)

环境变量

  • ETH_RPC_URL: 当未通过命令行指定时使用的默认Ethereum RPC URL
  • CRYO_DATA_DIR: 当未通过命令行指定时使用的默认存储下载数据的目录

高级用法

针对区块链数据的SQL查询

Cryo MCP允许您针对区块链数据运行强大的SQL查询,结合SQL的灵活性和Cryo的数据提取能力:

两步SQL查询流程

您可以将数据提取和查询分为两个独立的步骤:

# 步骤1:下载数据并获取文件路径
download_result = client.query_dataset(
    dataset="transactions",
    blocks_from_latest=1000,
    output_format="parquet"
)

# 步骤2:使用文件路径运行SQL查询
file_paths = download_result.get("files", [])
client.query_sql(
    query=f"""
    SELECT 
        to_address as contract_address, 
        COUNT(*) as tx_count,
        SUM(gas_used) as total_gas,
        AVG(gas_used) as avg_gas
    FROM read_parquet('{file_paths[0]}')
    WHERE to_address IS NOT NULL
    GROUP BY to_address
    ORDER BY total_gas DESC
    LIMIT 20
    """,
    files=file_paths
)

组合SQL查询流程

为了方便,您也可以使用处理两个步骤的组合函数:

# 获取消耗最多gas的合约
client.query_blockchain_sql(
    sql_query="""
    SELECT 
        to_address as contract_address, 
        COUNT(*) as tx_count,
        SUM(gas_used) as total_gas,
        AVG(gas_used) as avg_gas
    FROM read_parquet('/path/to/transactions.parquet')
    WHERE to_address IS NOT NULL
    GROUP BY to_address
    ORDER BY total_gas DESC
    LIMIT 20
    """,
    dataset="transactions",
    blocks_from_latest=1000
)

# 查找交易最多的区块
client.query_blockchain_sql(
    sql_query="""
    SELECT 
        block_number, 
        COUNT(*) as tx_count
    FROM read_parquet('/path/to/transactions.parquet')
    GROUP BY block_number
    ORDER BY tx_count DESC
    LIMIT 10
    """,
    dataset="transactions",
    blocks="15M:16M"
)

# 分析事件日志的主题
client.query_blockchain_sql(
    sql_query="""
    SELECT 
        topic0, 
        COUNT(*) as event_count
    FROM read_parquet('/path/to/logs.parquet')
    GROUP BY topic0
    ORDER BY event_count DESC
    LIMIT 20
    """,
    dataset="logs",
    blocks_from_latest=100
)

注意:对于SQL查询,始终使用 output_format="parquet" 下载数据以确保与DuckDB的最佳性能。当使用 query_blockchain_sql 时,应在SQL中直接引用文件路径使用 read_parquet() 函数。

使用区块范围查询

Cryo MCP支持Cryo的全部区块规范语法:

# 使用区块编号
client.query_dataset('transactions', blocks='15000000:15001000')

# 使用K/M表示法
client.query_dataset('logs', blocks='15M:15.01M')

# 使用相对于最新区块的偏移量
client.query_dataset('blocks', blocks_from_latest=100)

合约过滤

按合约地址过滤日志和其他数据:

# 获取USDC合约的所有日志
client.query_dataset('logs', 
                    blocks='16M:16.1M', 
                    contract='0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48')

列选择

仅包含您需要的列:

# 获取仅区块编号和时间戳
client.query_dataset('blocks', 
                    blocks='16M:16.1M', 
                    include_columns=['number', 'timestamp'])

开发

项目结构

cryo-mcp/
├── cryo_mcp/           # 主包目录
│   ├── __init__.py     # 包初始化
│   ├── server.py       # 主MCP服务器实现
│   ├── sql.py          # SQL查询功能
├── tests/              # 测试目录
│   ├── test_*.py       # 测试文件
├── pyproject.toml      # 项目配置
├── README.md           # 项目文档

运行测试

uv run pytest

许可证

MIT

致谢

  • 基于Paradigm的出色工具Cryo
  • 使用MCP协议进行API通信