用于Cryo区块链数据提取工具的模型完成协议(MCP)服务器。通过实现MCP协议的API服务器,Cryo MCP允许您轻松地从任何兼容MCP的客户端查询区块链数据。
当使用此MCP服务器在区块链数据上运行SQL查询时,请遵循以下工作流程:
下载数据 使用 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", []) # 获取返回的文件路径
探索模式 使用 get_sql_table_schema:
# 检查文件中可用的列
schema = get_sql_table_schema(files[0])
# 现在您可以查看所有列、数据类型和样本数据
运行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。
如果您将直接使用 uvx 运行该工具,则不需要执行此操作。
# 使用UV安装(推荐)
uv tool install cryo-mcp
claude mcp add 以获得交互式提示。uvx 作为要运行的命令。cryo-mcp --rpc-url <ETH_RPC_URL> [--data-dir <DATA_DIR>] 作为参数。ETH_RPC_URL 和 CRYO_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()
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 URLCRYO_DATA_DIR: 当未通过命令行指定时使用的默认存储下载数据的目录Cryo MCP允许您针对区块链数据运行强大的SQL查询,结合SQL的灵活性和Cryo的数据提取能力:
您可以将数据提取和查询分为两个独立的步骤:
# 步骤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
)
为了方便,您也可以使用处理两个步骤的组合函数:
# 获取消耗最多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