基于MCP协议的AI助手区块链数据查询工具开发实践
1. 项目概述为AI助手装上区块链之眼最近在折腾AI编程助手比如Cursor、Claude Desktop时我一直在想能不能让它们直接“看到”并操作区块链上的数据比如让AI帮我查一个钱包的余额、分析一笔交易的详情甚至调用智能合约的只读方法。这听起来像是把两个前沿领域——AI代理和区块链——给硬桥硬马地连接起来。市面上虽然有一些零散的插件但要么功能单一要么配置复杂很难有一个统一、标准的接口让AI模型去调用。于是我动手搞了ethereum-rpc-mpc这个项目。本质上它是一个基于Model Context Protocol的服务器。你可以把它理解成一个“翻译官”或者“适配器”。它一端连着标准的以太坊JSON-RPC节点比如Infura、Alchemy或者任何公共/私有节点另一端则通过MCP协议向AI助手暴露出一整套熟悉的、可编程的工具。这样一来你在Cursor里跟AI聊天时就可以直接说“帮我看看vitalik.eth这个地址还有多少ETH” AI就能通过我这个服务器去链上拿到真实数据并回答你。这个项目特别适合开发者、区块链研究员或者任何想用自然语言与区块链交互的人它极大地降低了链上数据查询和初步分析的门槛。2. 核心架构与设计思路拆解2.1 为什么选择MCPModel Context Protocol在决定技术栈时我评估过几种方案。一种是给每个AI助手Cursor、Claude、Windsurf单独写插件但这意味着重复劳动和后期维护的噩梦。另一种是做一个通用的HTTP API服务然后让AI去调用但这又引入了API密钥管理、请求格式标准化等一堆问题。最终选择MCP是因为它正在成为AI助手扩展能力的“事实标准”。MCP定义了一套标准协议让任何服务器称为MCP Server都能以统一的方式向兼容MCP的客户端如Cursor、Claude Desktop提供“工具”和“资源”。对于AI来说我提供的这些工具比如eth_getBalance,eth_getTransactionByHash就像它原生就有的功能一样可以直接在对话中被理解和调用。这实现了“一次开发多处使用”的目标。只要AI助手支持MCP我的服务器就能无缝接入不需要为每个平台重写一遍逻辑。2.2 核心组件与数据流整个服务器的架构非常清晰主要包含三个核心层MCP适配层这是项目的“门面”。它基于modelcontextprotocol/sdk开发负责实现MCP Server的规范。这一层定义了AI助手可以看到哪些“工具”Tools每个工具对应什么JSON-RPC方法以及如何将AI的自然语言请求或结构化参数映射成对下一层的调用。例如当AI想要调用“获取余额”工具时适配层会准备好eth_getBalance方法所需的参数。JSON-RPC客户端层这是项目的“引擎”。我使用了viem这个优秀的以太坊TypeScript库作为核心。viem不仅提供了类型安全的RPC客户端还封装了连接管理、错误重试、请求批处理等复杂逻辑。这一层接收来自适配层的标准化请求通过HTTP或WebSocket发送到用户配置的以太坊RPC节点并处理返回结果。选择viem而非直接使用fetch手动构造请求极大地提升了代码的健壮性和开发效率。配置与扩展层这是项目的“控制面板”。它处理启动参数如RPC URL、链名称、管理可选的中间件如分析中间件并为未来的多链、多RPC支持预留了接口。目前服务器设计为单RPC连接但架构上已经考虑了向多连接演进的路径。注意这里有一个关键设计决策。我没有将所有的JSON-RPC方法eth_,net_,web3_一股脑地暴露为上百个独立的MCP工具那样会让AI的工具列表变得臃肿不堪难以使用。相反我实现了一个动态工具分发器。AI客户端请求一个通用的ethereum_rpc_call工具并传入method和params参数。服务器再根据method的值去调用对应的viem方法。这样既保持了灵活性又能让AI通过有限的工具描述理解其功能。数据流的典型路径如下用户在AI客户端提问 - AI识别意图并调用我提供的MCP工具 - 请求通过MCP协议发送到我的服务器 - 服务器适配层解析请求 - JSON-RPC客户端层向目标链节点发起调用 - 节点返回数据 - 数据经客户端层和适配层格式化 - 通过MCP协议返回给AI客户端 - AI生成最终回答呈现给用户。3. 从零开始的部署与配置实操3.1 环境准备与项目初始化首先你需要一个Node.js环境建议v18或以上版本和包管理器yarn或npm。然后通过Git获取项目代码。# 克隆项目仓库到本地 git clone https://github.com/Phillip-Kemper/ethereum-rpc-mpc.git cd ethereum-rpc-mpc # 安装项目依赖。这里使用yarn如果你习惯npm用 npm install 也一样。 # 这个过程会安装TypeScript编译器、MCP SDK、viem等核心库。 yarn install # 编译TypeScript代码到JavaScript。项目源码在 /src编译后会输出到 /dist 目录。 yarn build完成以上步骤后/dist目录下会生成可运行的JavaScript文件主要是server/index.js。3.2 获取并配置以太坊RPC节点这是最关键的一步。服务器本身不提供区块链数据它需要连接到一个真实的以太坊节点。你有几个选择公共节点免费但有速率限制不适合高频使用。例如https://eth.llamarpc.com(项目默认)https://rpc.ankr.com/ethhttps://cloudflare-eth.com节点服务商稳定、可靠通常有免费额度。需要注册获取API Key。Infura:https://mainnet.infura.io/v3/YOUR_API_KEYAlchemy:https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEYQuickNode:https://your-endpoint.quiknode.pro/YOUR_TOKEN/实操心得对于开发和测试公共节点足够。但如果你打算让AI助手频繁查询数据比如分析多个地址强烈建议使用Infura或Alchemy的免费层它们的稳定性和速率限制更友好。将包含API Key的URL视为密码不要在公共代码或聊天记录中泄露。3.3 启动服务器并与AI助手连接服务器启动方式非常灵活你可以根据使用场景选择。方式一使用npx临时运行最简单这是体验和测试最快的方式无需全局安装。# 基本用法npx -y ethereum-rpc-mpc [RPC_URL] [CHAIN_NAME] npx -y ethereum-rpc-mpc https://eth.llamarpc.com Ethereum-y参数表示直接同意安装临时包。命令会启动服务器并监听一个本地端口通常是3000或5173具体看启动日志。方式二使用编译后的本地脚本如果你已经克隆并构建了项目可以直接运行编译后的文件。# 在项目根目录下 yarn start https://eth.llamarpc.com Ethereum # 或者 node ./dist/server/index.js https://eth.llamarpc.com Ethereum方式三配置到Cursor以Cursor为例这是让服务器长期为你AI助手服务的方式。你需要将服务器命令配置到Cursor的MCP设置中。打开Cursor进入Settings-Cursor Settings- 搜索或找到MCP设置项。点击Add New MCP Server。在弹出的配置窗口中填写Name: 给你这个连接起个名字比如Ethereum Mainnet。Type: 选择Command。Command: 这里填写启动服务器的命令。我强烈推荐使用绝对路径的本地脚本方式稳定性最高。示例请将/path/to/替换为你电脑上项目的实际路径node /Users/yourname/Projects/ethereum-rpc-mpc/dist/server/index.js https://eth.llamarpc.com Ethereum可选Arguments: 如果Command只写node /path/to/index.js可以把RPC URL和链名填在这里。保存配置。Cursor会自动启动你配置的命令行服务器。你可以在Cursor的底部状态栏或“输出”面板看到MCP服务器的连接日志。配置成功后当你下次在Cursor中与AI对话时AI就已经具备了查询以太坊的能力。你可以尝试问它“What is the current gas price on Ethereum?” 看看它是否能正确调用工具并返回结果。4. 核心功能详解与使用范例服务器通过MCP暴露了一系列工具本质上是对以太坊JSON-RPC方法的封装。AI模型如Claude理解这些工具的描述后就能在对话中智能地调用它们。下面我结合具体场景展示几个最常用的功能。4.1 基础链上信息查询这是最直接的应用。AI可以帮你获取区块链的实时状态。查询当前区块号用户提问“What‘s the current block number on Ethereum?”AI背后操作调用eth_blockNumber方法。预期结果AI会返回一个十六进制数如0x1291c3b及其对应的十进制数约 1948万告诉你区块链的高度。查询Gas价格用户提问“How high are the gas fees right now?”AI背后操作可能调用eth_gasPrice获取基础价格或调用eth_feeHistory获取更详细的历史费用数据供分析。预期结果AI会返回当前的Gas价格例如 “The current base fee is around 15 Gwei”这对于评估交易成本非常有用。4.2 地址与余额监控你可以让AI扮演一个链上监控助手。查询ETH余额用户提问“Check the ETH balance for address 0x742d35Cc6634C0532925a3b844Bc454e4438f44e.”AI背后操作调用eth_getBalance方法传入地址和区块参数默认latest。预期结果AI返回该地址的ETH余额单位是Wei。一个贴心的AI通常会帮你转换成更容易理解的ETH单位如 “It holds approximately 1, 234.56 ETH”。验证地址类型用户提问“Is 0x6B175474E89094C44Da98b954EedeAC495271d0F a contract or an externally owned account (EOA)?”AI背后操作首先调用eth_getCode方法。如果返回的字节码不是0x则说明是合约账户。预期结果AI会告诉你这是一个智能合约地址。你还可以进一步追问“What is the contract?” AI可能会尝试通过链上数据或外部知识库如果它具备告诉你这是DAI稳定币的合约。4.3 交易与区块深度分析当你在链上看到一笔有趣的交易或区块时可以让AI帮你解读。获取交易详情用户提问“Show me the details of transaction 0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060.”AI背后操作调用eth_getTransactionByHash方法。预期结果AI会返回一个结构化的交易对象包含发送方from、接收方to、转账金额value、输入数据input、Gas设置gas,gasPrice等。AI可以进一步总结“This is a transfer of 1 ETH from address A to address B.”获取交易回执用户提问“Was transaction [hash] successful? How much gas was used?”AI背后操作调用eth_getTransactionReceipt方法。预期结果AI会返回交易回执关键信息包括状态status: 1成功 / 0失败、实际使用的GasgasUsed、以及可能触发的日志logs。这对于调试失败的合约交互至关重要。获取区块信息用户提问“What transactions are in block number 19234567?”AI背后操作调用eth_getBlockByNumber方法将fullTransactions参数设为true。预期结果AI会返回该区块的完整信息包括时间戳、矿工、难度以及包含的所有交易列表。4.4 智能合约交互只读AI甚至可以通过调用只读view/pure函数帮你从智能合约中查询数据。查询ERC-20代币余额用户提问“How much USDC does address 0x... hold?”AI背后操作这需要组合多个RPC调用。首先它需要知道USDC合约的ABI应用二进制接口中balanceOf函数的编码方式。如果AI的知识库里有常见合约的ABI它可以直接使用否则你可能需要提供。然后调用eth_call方法向USDC合约地址发送一个编码好的balanceOf(address)调用数据。预期结果AI解码返回的字节码告诉你该地址持有的USDC数量带小数位。查询Uniswap池子信息用户提问“What‘s the total liquidity in the WETH/USDC pool on Uniswap V3 at address 0x...?”AI背后操作同样通过eth_call调用合约的相应函数如liquidity()。预期结果AI返回池子的流动性数值。重要提示目前AI模型如Claude对特定合约ABI的内部知识是有限的。为了让AI能成功进行复杂的eth_call最可靠的方式是在提问时直接提供所需的函数签名或ABI片段。例如“Using the USDC contract at 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, call thebalanceOf(address)function for address 0x... . The function signature for encoding isbalanceOf(address).” 未来的版本可能会集成类似 Etherscan 的API来自动获取ABI以简化这个过程。5. 高级特性与定制化配置5.1 支持Zircuit等特定L2网络项目的一个亮点是对特定区块链的扩展支持。以Zircuit一个采用Sequencer Level Security的Layer2为例。当你使用Zircuit的RPC端点启动服务器时它会自动激活一组特有的RPC方法。# 连接到Zircuit主网 yarn start https://mainnet.zircuit.com Zircuit启动后除了标准以太坊方法AI还可以调用Zircuit特有的方法这对于监控该网络上的交易安全状态非常有用zirc_isQuarantined检查特定交易是否被隔离。用户提问“Is transaction 0x... quarantined on Zircuit?”AI操作调用此方法传入交易哈希。用途在Zircuit上如果交易行为可疑可能会被序列器Sequencer隔离。这个方法让你可以主动查询状态。zirc_getQuarantined查询所有被隔离的交易可按地址过滤。用户提问“List all currently quarantined transactions involving address 0x... on Zircuit.”AI操作调用此方法可选地传入一个地址参数。用途项目方或安全研究员可以用它来监控网络上的潜在攻击或异常行为。这个设计模式根据链ID或链名称动态加载特定方法为项目支持更多EVM兼容链如Polygon, Arbitrum, Base及其原生扩展方法铺平了道路。5.2 集成分析中间件MCP Analytics Middleware如果你想知道你的AI助手到底多频繁地使用区块链查询或者哪些RPC方法最常用可以启用分析功能。这依赖于另一个配套项目mcp-analytics-middleware。启动服务器时加上--analytics标志并指定一个SQLite数据库文件路径即可npx -y ethereum-rpc-mpc https://eth.llamarpc.com Ethereum --analytics --db-path /path/to/analytics.db启用后中间件会静默记录每一次工具调用请求时间和工具名称如ethereum_rpc_call。请求参数如调用的具体RPC方法eth_getBalance。响应状态成功或错误。请求耗时。你可以定期用SQLite浏览器打开这个.db文件或者写个简单脚本来分析AI的链上行为模式。这对于优化提示词让AI更有效地使用工具或了解项目使用情况非常有帮助。5.3 自定义与扩展开发作为一个开源项目你可以根据需求对其进行修改和扩展。添加对新链的支持项目核心在src/chains目录下定义了链的配置。要添加一个新链例如Polygon你可以在chains.ts或类似配置文件中添加该链的链ID、名称和可能的特殊RPC方法映射。在服务器启动逻辑中根据传入的CHAIN_NAME或从RPC URL自动探测的链ID加载对应的配置。暴露更多/更少的RPC方法默认情况下服务器通过一个通用工具暴露所有支持的RPC方法。如果你觉得某些危险方法如eth_sendRawTransaction发送交易不应该被AI随意调用你可以在工具处理逻辑中添加过滤层。相反如果你想将某些高频方法如eth_getBalance单独暴露为一个有更好描述的工具以提升AI调用的准确率也可以在src/tools下创建新的专用工具定义。修改请求处理逻辑所有对RPC节点的调用都通过viem客户端进行。你可以在src/client或类似的服务层中添加额外的逻辑比如请求限流、缓存常见查询结果如区块号、失败重试策略等以提升服务的稳定性和性能。6. 常见问题与故障排除实录在实际搭建和使用过程中你可能会遇到一些问题。下面是我在开发和测试中踩过的一些坑以及解决方案。6.1 服务器启动与连接问题问题1启动服务器时提示Address already in use或端口冲突。原因默认端口可能是3000或5173已被其他程序占用。排查使用命令lsof -i :3000Mac/Linux或netstat -ano | findstr :3000Windows查看占用端口的进程。解决终止占用端口的进程。或者修改服务器代码让它在启动时监听另一个端口例如5174。这通常需要修改src/server/index.ts中创建McpServer时的传输配置。问题2Cursor显示MCP服务器连接失败红色错误提示。原因A启动命令配置错误。排查检查Cursor中MCP Server的“Command”配置。如果使用npx确保网络通畅如果使用本地node路径确保路径完全正确且dist目录已成功构建。解决在终端手动运行一遍你配置的命令看服务器能否独立启动。建议在Command中使用绝对路径。原因BRPC URL不可用或网络问题。排查服务器启动日志通常会打印连接测试结果。如果看到“Failed to connect to RPC”之类的错误说明节点有问题。解决换一个可用的RPC URL。用浏览器或curl测试一下curl -X POST -H Content-Type: application/json --data {jsonrpc:2.0,method:eth_blockNumber,params:[],id:1} YOUR_RPC_URL看是否有响应。6.2 AI工具调用与响应问题问题3AI不识别或不会调用我提供的以太坊工具。原因AMCP服务器未成功连接或未向AI客户端宣告工具。排查在Cursor的设置-MCP页面确认你的服务器状态是“已连接”绿色。查看服务器的启动日志看初始化过程中是否成功注册了工具。解决重启Cursor和MCP服务器。确保服务器版本与MCP SDK兼容。原因BAI模型如Claude的上下文或提示词未引导它使用工具。解决在提问时更明确地指示。例如不要说“Vitalik有多少ETH”而说“使用可用的以太坊RPC工具查询地址 0x... 的ETH余额。” 通常AI在知道有工具可用后经过一两次明确引导就能学会在合适场景下主动调用。问题4AI调用工具后返回错误如invalid argument或method not found。原因A参数格式错误。例如地址没有以0x开头或者区块参数格式不对。排查查看AI发送给工具的原始参数。可以在服务器日志中看到详细的请求和响应。解决指导AI使用正确的格式。例如地址必须是42字符的十六进制字符串包括0x。区块号可以是十六进制如0x1291c3b或标签如latest,earliest,pending。原因B调用了当前链不支持的方法。比如在Zircuit上请求一个只有以太坊主网才有的历史方法。解决这是预期行为。需要让AI了解不同链的能力差异或者在服务器端对工具可用性做更精细的控制。6.3 性能与稳定性优化问题5查询响应慢尤其是公共节点。原因公共RPC节点有速率限制且可能负载较高。解决升级节点切换到Infura、Alchemy等专业服务商的节点它们的响应速度和稳定性有质的提升。启用缓存对于不常变化的数据如某个地址的合约代码eth_getCode可以在服务器端实现一个简单的内存缓存如使用node-cache设定一个较短的TTL如30秒能显著减少重复请求。批量请求如果AI在短时间内需要多个独立数据如多个地址的余额可以探索修改工具逻辑将多个请求合并成一个eth_batch调用如果节点支持但这需要改动MCP工具的定义和AI的调用模式。问题6服务器运行一段时间后内存占用过高或崩溃。原因可能是内存泄漏或者连接未正确关闭。排查与解决使用yarn inspector启动服务器这通常会启用调试和更完善的资源管理。确保使用的是项目的最新稳定版本已知问题可能已被修复。定期重启服务器例如通过进程管理工具pm2设置定时重启作为一个简单的应对措施。6.4 安全注意事项RPC URL安全切勿将包含私钥或API Key的RPC URL提交到公开仓库或分享给他人。考虑使用环境变量来管理# 在启动命令中引用环境变量 yarn start $ETH_RPC_URL Ethereum工具权限当前实现将所有只读RPC方法暴露给了AI。理论上如果AI被恶意提示词诱导它可能会通过eth_call调用消耗大量Gas的视图函数尽管不改变状态但可能对节点造成负载。在生产环境中如果担心这一点可以考虑在服务器端实现一个允许列表Allow List只开放安全的、必要的方法。依赖安全定期运行yarn audit或npm audit检查项目依赖是否存在已知安全漏洞并及时更新。这个项目就像在AI助手和区块链世界之间架起了一座标准化的桥梁。从我自己的使用体验来看最大的改变是工作流的简化——我不再需要频繁在浏览器、终端和IDE之间切换来查链上数据大部分基础的查询和验证工作在编码对话中就能顺手完成。它目前可能还不是一个“全自动”的链上分析机器人但作为一个强大的、可编程的“数据抓取手”和“状态查询器”已经能解决很多实际场景下的效率痛点。如果你也在这两个领域交叉探索不妨试试看或许能碰撞出更多有趣的应用场景。