Cryo-MCP区块链数据提取API
一个实现模型完成协议(MCP)的API服务器,用于Cryo区块链数据提取,允许用户通过任何与MCP兼容的客户端查询以太坊区块链数据。
服务介绍
Cryo MCP 🧊
一个用于Cryo区块链数据提取工具的模型完成协议(MCP)服务器。
Cryo MCP 通过实现MCP协议的API服务器,使您能够访问Cryo强大的区块链数据提取功能,从而轻松地从任何兼容MCP的客户端查询区块链数据。
对于LLM用户:SQL查询工作流程指南
当使用此MCP服务器对区块链数据运行SQL查询时,请遵循以下工作流程:
-
下载数据 使用
query_dataset:result = query_dataset( dataset="blocks", # 或 "transactions", "logs" 等 blocks="15000000:15001000", # 或使用 blocks_from_latest=100 output_format="parquet" # 重要:对于SQL使用Parquet格式 ) 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 的组合方法:
# Option 1: Simple table reference
result = query_blockchain_sql(
sql_query="SELECT * FROM blocks",
dataset="blocks",
blocks_from_latest=100
)
# Option 2: Using read_parquet()
result = query_blockchain_sql(
sql_query="SELECT * FROM read_parquet('/path/to/file.parquet')", # Path doesn't matter
dataset="blocks",
blocks_from_latest=100
)
完整的示例见 examples/sql_workflow_example.py。
特性
- 完整Cryo数据集访问:通过API服务器查询任意Cryo数据集
- MCP集成:无缝对接MCP客户端
- 灵活的查询选项:支持所有主要的Cryo过滤和输出选项
- 区块范围选项:查询特定区块、最新区块或相对范围
- 合约过滤:按合约地址过滤数据
- 最新区块访问:轻松访问最新的以太坊区块数据
- 多种输出格式:支持JSON、CSV和Parquet
- 模式信息:获取详细的数据集模式和样本数据
- SQL查询:直接针对下载的区块链数据运行SQL查询
安装(可选)
如果您将直接使用 uvx 运行该工具,则不需要此步骤。
# install with UV (recommended)
uv tool install cryo-mcp
要求
- Python 3.8+
- uv
- 正确安装了Cryo
- 访问以太坊RPC端点
- DuckDB(用于SQL查询功能)
快速开始
与Claude Code一起使用
- 运行
claude mcp add以获取交互式提示。 - 输入
uvx作为要运行的命令。 - 输入
cryo-mcp --rpc-url <ETH_RPC_URL> [--data-dir <DATA_DIR>]作为参数。 - 或者,提供
ETH_RPC_URL和CRYO_DATA_DIR作为环境变量。
新的 claude 实例现在将能够访问 cryo,并按照配置访问您的 RPC 端点并在指定目录中存储数据。
可用工具
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, 可选): 从默认列中排除的列
示例:
# Get transactions from blocks 15M to 15.01M
client.query_dataset('transactions', blocks='15M:15.01M')
# Get logs for a specific contract from the latest 100 blocks
client.query_dataset('logs', blocks_from_latest=100, contract='0x1234...')
# Get just the latest block
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()
返回最新的以太坊区块信息。
示例:
client.get_latest_ethereum_block()
SQL 查询工具
Cryo MCP 包含了几个用于对区块链数据执行 SQL 查询的工具:
query_sql()
对下载的区块链数据执行 SQL 查询。
参数:
query(str): 要执行的 SQL 查询files(list, 可选): 要查询的 parquet 文件路径列表。如果为 None,则使用数据目录中的所有文件。include_schema(bool, 可选): 是否在结果中包含模式信息
示例:
# Run against all available files
client.query_sql("SELECT * FROM read_parquet('/path/to/blocks.parquet') LIMIT 10")
# Run against specific files
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, optional): 要查询的数据集(例如,'blocks', 'transactions')blocks(str, optional): 区块范围说明start_block(int, optional): 起始区块号end_block(int, optional): 结束区块号use_latest(bool, optional): 如果为 True,则查询最新区块blocks_from_latest(int, optional): 最新区块之前的区块数量contract(str, optional): 用于过滤的合约地址force_refresh(bool, optional): 即使数据已存在也强制下载新数据include_schema(bool, optional): 在结果中包含模式信息
示例:
# Automatically downloads blocks data if needed, then runs the SQL query
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: 以太坊 RPC URL(覆盖 ETH_RPC_URL 环境变量)--data-dir PATH: 存储下载数据的目录(覆盖 CRYO_DATA_DIR 环境变量,默认为 ~/.cryo-mcp/data/)
环境变量
ETH_RPC_URL: 当未通过命令行指定时使用的默认以太坊 RPC URLCRYO_DATA_DIR: 当未通过命令行指定时存储下载数据的默认目录
高级用法
对区块链数据进行 SQL 查询
Cryo MCP 允许您对区块链数据运行强大的 SQL 查询,结合了 SQL 的灵活性和 Cryo 的数据提取能力:
两步 SQL 查询流程
您可以将数据提取和查询分为两个独立的步骤:
# Step 1: Download data and get file paths
download_result = client.query_dataset(
dataset="transactions",
blocks_from_latest=1000,
output_format="parquet"
)
# Step 2: Use the file paths to run SQL queries
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 查询流程
为了方便起见,您还可以使用组合函数来处理这两个步骤:
# Get top gas-consuming contracts
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
)
# Find blocks with the most transactions
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"
)
# Analyze event logs by topic
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 的完整区块规格语法:
# Using block numbers
client.query_dataset('transactions', blocks='15000000:15001000')
# Using K/M notation
client.query_dataset('logs', blocks='15M:15.01M')
# Using offsets from latest
client.query_dataset('blocks', blocks_from_latest=100)
合约过滤
按合约地址过滤日志和其他数据:
# Get all logs for USDC contract
client.query_dataset('logs',
blocks='16M:16.1M',
contract='0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48')
列选择
仅包含所需的列:
# Get just block numbers and timestamps
client.query_dataset('blocks',
blocks='16M:16.1M',
include_columns=['number', 'timestamp'])
开发
项目结构
cryo-mcp/
├── cryo_mcp/ # Main package directory
│ ├── __init__.py # Package initialization
│ ├── server.py # Main MCP server implementation
│ ├── sql.py # SQL query functionality
├── tests/ # Test directory
│ ├── test_*.py # Test files
├── pyproject.toml # Project configuration
├── README.md # Project documentation
运行测试
uv run pytest
许可证
MIT