区块数据服务

一个生产就绪的MCP服务器,通过标准输入输出暴露Chunk MedianFeeds工具,用于获取和处理区块链上的指标数据。

  • by chunknet
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 chunknet/mcp-server

使用说明

Chunk MCP 服务器

已准备好投入生产的MCP服务器,通过标准I/O接口暴露Chunk MedianFeeds工具。

  • 网络:Chunk 测试网(默认 RPC: https://rpc.chunknet.org)
  • 合同:MedianFeeds(默认): 0x78D02A47fA898ffF4B37A9B414Eace5eed3e7fAD

要求

  • Node.js 18+(ESM 模块)

快速入门

  • 安装
    • cd mcp-server
    • npm install
  • 构建
    • npm run build
  • 运行(stdio 传输)
    • npm start

配置

  • 环境变量
    • CHUNK_RPC — JSON-RPC 端点(默认: https://rpc.chunknet.org)
    • CHUNK_MEDIAN_ADDR — MedianFeeds 合约地址(默认: 0x78D02A47fA898ffF4B37A9B414Eace5eed3e7fAD)
    • METRICS_CACHE_TTL_MS — 指标缓存TTL(存活时间)以毫秒为单位(默认值:30000)

生产环境配置文件 .env(可选覆盖)

CHUNK_RPC=https://rpc.chunknet.org
CHUNK_MEDIAN_ADDR=0x78D02A47fA898ffF4B37A9B414Eace5eed3e7fAD
METRICS_CACHE_TTL_MS=30000

注:您可以省略 .env 完全——这些是内置的默认值。

工具

  • list_metrics — 列出MedianFeeds中的指标定义
    • 参数: { chain?, rpcUrl?, contractAddress?, currency?, tagIncludes?, nameContains?, limit?, offset? }
  • quote_metrics — 获取给定指标名称的最后一条报价
    • 参数: { names: string[], chain?, rpcUrl?, contractAddress?, format?: 'raw'|'int'|'decimal'|'all', decimals?: number }
  • get_signed_root — 获取当前签名的默克尔树根(纪元)
    • 参数: { chain?, rpcUrl?, contractAddress? }
  • get_metrics_count — 总指标数量
  • has_metric — 检查是否存在具有指定名称的度量指标
  • get_metrics_map — 地图绘制 name -> id (基于索引的)
  • quote_by_ids — 用数字ID引用指标
    • 参数: { ids: number[], chain?, rpcUrl?, contractAddress?, format?, decimals? }
  • quote_metrics_at_block — 在特定区块号处引用指标
    • 参数: { names: string[], blockNumber: number, chain?, rpcUrl?, contractAddress?, format?, decimals? }
  • quote_metrics_at_epoch_end — 在一个周期结束时引用指标
    • 参数: { names: string[], epochDuration?: number, epochId?: number, chain?, rpcUrl?, contractAddress?, format?, decimals? }
  • quote_metrics_at_timestamp — 在特定的UNIX时间戳(秒)下引用指标
    • 参数: { names: string[], timestamp: number, chain?, rpcUrl?, contractAddress?, format?, decimals? }
  • get_health — RPC健康信息 { chainId, blockNumber }
  • check_staleness — 检查指标是否相对于(某基准/时间点)已过时 maxAgeSeconds
  • check_thresholds — 形式规则的阈值检查 { name, op: 'lt'|'lte'|'gt'|'gte'|'eq'|'neq', value: string|number }

格式化

  • 原始值以链上2**112倍缩放的整数形式返回。
  • 使用 format: 'decimal' 并且 decimals 获取经过四舍五入后更易于人类理解的字符串。

资源

  • chunk://median/{chain}/metrics — 链的指标JSON数组(chunk (受支持的)
  • chunk://median/{chain}/metric/{name} — 包含指标最新报价的JSON对象

订阅

  • 服务器注册 resources.subscribe 能力。
  • 在纪元更迭时, resources/updated 为已订阅的URI发送通知。

客户端示例(Node.js)

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';

const transport = new StdioClientTransport({
  command: 'node',
  args: ['dist/server.js'],
  env: process.env,
});

const client = new Client({ name: 'chunk-mcp', version: '0.1.0' });
await client.connect(transport);

const list = await client.callTool({ name: 'list_metrics', arguments: { limit: 5 } });
const names = list.structuredContent.metrics.map(m => m.name).slice(0, 2);
const quotes = await client.callTool({ name: 'quote_metrics', arguments: { names, format: 'decimal', decimals: 6 } });
console.log(quotes.structuredContent.quotes);

await client.close();

Claude Desktop(MCP)配置(示例)

  • 配置一个stdio MCP服务器:
{
  "mcpServers": {
    "chunk-mcp": {
      "command": "node",
      "args": ["dist/server.js"],
      "env": {
        "CHUNK_RPC": "https://rpc.chunknet.org",
        "CHUNK_MEDIAN_ADDR": "0x78D02A47fA898ffF4B37A9B414Eace5eed3e7fAD"
      }
    }
  }
}

操作说明

  • 超时时间和RPC限制取决于您的服务提供商。
  • 在客户端处理网络错误和瞬时故障,并通过重试机制来应对。
  • 对于生产环境,请固定一个稳定的RPC端点和合约地址。

项目结构

  • src/server.js — 来源(ESM)
  • dist/server.js — 打包构建(在之后 npm run build)
  • 此目录中不包含任何测试,这是设计上的决定。