基于MCP协议的EVM区块链AI智能体交互服务器部署与实战
1. 项目概述为AI智能体打开区块链世界的大门如果你是一名开发者或者正在探索AI与区块链结合的领域那么你一定遇到过这样的困境想让一个大型语言模型LLM或者一个AI智能体Agent去查询某个钱包的余额、读取一个智能合约的状态甚至执行一笔链上交易却发现这中间隔着一道巨大的鸿沟。AI模型本身并不理解RPC调用、ABI编码或者交易签名这些底层细节。传统的做法是你需要为每一个区块链操作编写大量的胶水代码将自然语言指令翻译成复杂的API调用这个过程不仅繁琐而且极易出错。今天要介绍的这个项目——mcpdotdirect/evm-mcp-server就是为了彻底解决这个问题而生的。它是一个基于模型上下文协议Model Context Protocol, MCP的服务器专门为AI智能体提供了与60多个EVM兼容区块链网络进行交互的统一接口。简单来说它就像是一个精通所有EVM链的“翻译官”和“执行器”坐在AI和区块链之间。当AI说“帮我查一下vitalik.eth在以太坊主网上的ETH余额”这个服务器就能理解这个请求自动调用以太坊的RPC解析ENS域名并返回一个AI能直接理解的结构化结果。这个项目的核心价值在于标准化和自动化。它通过22个精确定义的工具Tools和10个引导式提示Prompts将区块链交互的复杂性完全封装起来。开发者不再需要为不同的链以太坊、Optimism、Arbitrum、Polygon等维护不同的客户端配置也不需要手动处理ABI获取、数据解码、Gas估算等琐事。更重要的是它对AI极其友好支持使用人类可读的ENS域名如vitalik.eth替代一长串的十六进制地址并且具备智能的ABI自动获取能力让AI可以像查询数据库一样自然地与区块链对话。无论你是在构建一个能分析链上数据的AI助手一个能自动执行DeFi策略的交易机器人还是一个能验证NFT所有权的客服应用这个MCP服务器都能为你提供坚实、可靠的基础设施。接下来我将带你深入拆解它的设计思路、核心功能并分享从零开始部署、配置到实际应用的全过程以及我在使用中积累的一些关键技巧和避坑指南。2. 核心架构与设计哲学解析2.1 为什么是MCP协议层的统一价值在深入代码之前我们必须先理解MCP是什么以及它为何是连接AI与外部服务的理想桥梁。Model Context Protocol是由Anthropic提出的一种开放协议旨在为标准化的方式为LLM提供工具、资源和上下文信息。你可以把它想象成AI世界的“USB协议”——它定义了一套标准的插口接口和通信规范任何符合MCP标准的设备服务器都能被任何支持MCP的主机AI客户端即插即用。evm-mcp-server正是这样一个符合MCP标准的“区块链USB设备”。它的设计哲学体现在几个层面声明式接口服务器向AI客户端“声明”自己拥有哪些能力工具每个工具需要什么参数返回什么格式的数据。AI客户端如Cursor、Claude Desktop在连接时就能自动发现这些能力无需硬编码。这解决了传统集成中需要为每个AI模型定制适配器的问题。无状态与松耦合MCP服务器本身不维护会话状态每次工具调用都是独立的。这使得服务器可以轻松扩展、负载均衡也符合区块链交互本身无状态的特性。资源抽象除了工具MCP还定义了“资源”Resources的概念可以理解为一种只读的数据源。该项目将区块链数据如区块、交易、余额也通过资源URI的形式暴露出来如evm://ethereum/block/latest让AI不仅能执行操作还能“浏览”链上数据。这个架构带来的最大好处是生态互操作性。一旦你的AI应用通过MCP接入了这个EVM服务器理论上它就能与未来任何其他遵循MCP标准的服务如数据库查询、天气API、日历服务无缝协作构建出功能极其复杂的智能体而无需修改核心逻辑。2.2 核心组件拆解工具、资源与提示的三位一体项目的功能通过三大核心组件提供理解它们的分工是高效使用的基础。工具Tools这是服务器的“主动技能”用于执行会改变状态或需要复杂计算的操作。例如transfer_native: 发送原生代币如ETH。write_contract: 调用智能合约的写入函数。sign_message: 为消息签名。multicall: 将多个合约只读调用打包成一个RPC请求极大提升查询效率。每个工具都有严格的输入输出Schema。例如get_balance工具要求address和network参数并返回包含原始值和格式化值的JSON。这种强类型约束确保了AI调用时的安全性和准确性。资源Resources这是服务器的“被动信息”提供对链上数据的只读访问。它们通过统一的URI模式来定位。例如evm://optimism/address/vitalik.eth/balance: 获取vitalik.eth在Optimism上的ETH余额。evm://arbitrum/tx/0x...: 获取某笔交易的详情。资源的妙处在于AI客户端可以像浏览器访问网页一样“读取”这些URI获取实时数据作为上下文而无需显式调用工具。这非常适合用于数据监控、信息展示等场景。提示Prompts这是引导AI正确使用工具的“脚手架”或“工作流模板”。它超越了简单的工具描述提供了更上层的指导。例如transaction_preparation: 引导AI逐步规划一笔交易检查余额、估算Gas、确认接收地址等。approval_auditing: 引导AI系统性地检查一个地址对各类代币的授权情况识别潜在风险。error_diagnosis: 当交易失败时提供一套排查逻辑Gas不足合约暂停参数错误。提示的存在极大地降低了AI犯低级错误的概率使其能够执行更复杂、更安全的链上操作。它相当于把资深区块链开发者的经验编码成了AI可执行的检查清单。2.3 多链支持的实现Viem与统一抽象层支持60多条链并非易事。项目底层依赖于Viem这个优秀的以太坊TypeScript接口库。Viem本身提供了对多链的良好支持但evm-mcp-server在其之上构建了一个更友好的抽象层。在src/core/chains.ts中你会找到一个庞大的链配置对象。它不仅包含了每条链的id、name和rpcUrl还预置了对应的公共RPC端点。这是项目开箱即用的关键——用户无需自己寻找或搭建RPC节点。// 示例链配置的结构 export const CHAINS: Recordstring, ChainConfig { ethereum: { id: 1, name: Ethereum, network: homestead, rpcUrl: https://eth.llamarpc.com, // 使用的公共RPC explorerUrl: https://etherscan.io, nativeCurrency: { symbol: ETH, decimals: 18 } }, optimism: { id: 10, name: Optimism, network: optimism, rpcUrl: https://mainnet.optimism.io, explorerUrl: https://optimistic.etherscan.io, nativeCurrency: { symbol: ETH, decimals: 18 } }, // ... 其他60条链 };当用户通过network参数如optimism指定一条链时服务器会根据这个配置表自动创建连接到对应RPC的Viem客户端。所有后续的余额查询、合约调用、交易发送都通过这个统一的客户端接口进行从而实现了“写一次逻辑跑在所有链上”的效果。实操心得RPC的选择与备用方案虽然项目提供了公共RPC但在生产环境或高频使用场景下公共RPC可能有速率限制或稳定性问题。我的经验是对于主网操作最好配置自己的RPC节点服务如Infura、Alchemy、QuickNode。你可以修改chains.ts文件将rpcUrl替换为你自己的节点URL。对于测试网使用公共RPC通常问题不大但也要注意其可用性。3. 从零开始环境配置与服务器部署3.1 环境准备与依赖安装项目推荐使用Bun作为运行时这是一个新兴的、速度极快的JavaScript/TypeScript工具链。当然使用Node.js 20也完全兼容。步骤一安装Bun推荐如果你还没有Bun可以通过以下命令安装macOS/Linuxcurl -fsSL https://bun.sh/install | bash安装完成后重启终端运行bun --version确认安装成功。步骤二克隆项目并安装依赖git clone https://github.com/mcpdotdirect/evm-mcp-server.git cd evm-mcp-server bun installbun install会读取package.json安装所有必要的依赖主要是viem、modelcontextprotocol/sdk以及其他工具库。整个过程通常很快。如果遇到网络问题导致依赖安装失败可以尝试切换npm源或使用bun install --verbose查看详细日志。3.2 钱包配置私钥与助记词的安全抉择要让服务器能够执行发送交易、调用合约等写入操作必须为其配置一个钱包。项目提供了两种方式各有优劣。方式一使用私钥简单直接export EVM_PRIVATE_KEY0x你的64位十六进制私钥不带0x前缀也可优点配置简单一目了然。缺点安全性最低。私钥一旦泄露对应地址的资产将完全失控。不适合团队协作或需要管理多个地址的场景。方式二使用助记词推荐更灵活export EVM_MNEMONIC你的12个或24个助记词用空格分隔 export EVM_ACCOUNT_INDEX0 # 可选默认为0优点安全性相对更好助记词可以离线生成和保管私钥由程序在内存中按需派生。支持HD钱包遵循BIP-44标准派生路径为m/44/60/0/0/{accountIndex}。这意味着你可以通过一个助记词管理无数个地址只需改变EVM_ACCOUNT_INDEX即可切换操作账户。这对于区分测试账户、主账户、合约部署账户等场景非常有用。如何选择accountIndex通常0是第一个外部账户。你可以使用钱包工具如MetaMask查看你常用地址对应的索引。如果你不确定保持为0即可。安全警告与最佳实践绝对不要将私钥或助记词提交到版本控制系统如Git。.env文件如果包含这些信息必须加入.gitignore。对于生产环境考虑使用硬件钱包的签名服务或使用AWS KMS、GCP Secret Manager等云服务密钥管理方案来注入私钥而不是使用环境变量。为MCP服务器创建一个专用的、仅包含少量测试资金的地址切勿使用存有大量资产的主钱包。助记词要离线备份在安全的地方如物理保险箱中的助记词板。3.3 可选但重要的配置Etherscan API密钥ABI应用二进制接口是调用智能合约的“说明书”。该项目一个杀手级特性是自动从区块链浏览器获取ABI。为此你需要一个Etherscan API密钥。访问 Etherscan 并注册账号。在API Keys页面点击“Add”创建一个新的API Key名称可以填mcp-server。复制生成的密钥一串字母数字组合。设置环境变量export ETHERSCAN_API_KEY你的API密钥这个密钥不仅用于以太坊主网还通过Etherscan的v2 API支持了项目中列出的所有60多条链的ABI查询。没有这个密钥get_contract_abi工具和read_contract/write_contract工具的自动ABI获取功能将无法工作你必须在每次调用时手动提供ABI JSON便利性大打折扣。3.4 启动服务器两种模式详解配置好环境变量后就可以启动服务器了。项目支持两种运行模式适应不同场景。模式一Stdio模式默认用于CLI/桌面AI集成bun start # 或开发模式代码修改后自动重启 bun dev这种模式下服务器通过标准输入输出stdio与父进程通信。这是与Cursor、Claude Desktop等AI客户端集成的最常用方式。客户端会作为一个子进程启动这个服务器并通过管道进行JSON-RPC通信。模式二HTTP模式用于Web应用/远程调用bun start:http # 或开发模式 bun dev:http这种模式下服务器会启动一个HTTP服务默认端口3001并提供一个Server-Sent Events (SSE) 端点 (http://localhost:3001/sse)。这允许远程的Web应用或其他服务通过HTTP连接到这个MCP服务器。当你需要在一个中心化的服务中运行MCP服务器供多个前端或多个AI Agent同时连接时这个模式非常有用。启动后你应该能在终端看到类似MCP EVM Server running on stdio或HTTP server listening on port 3001的日志表示服务器已就绪。4. 与AI工作流深度集成以Cursor为例服务器跑起来只是第一步如何让它成为你AI工作流中无缝的一部分才是关键。这里以目前非常流行的AI代码编辑器Cursor为例展示最优雅的集成方式。4.1 项目级配置使用.cursor/mcp.json最推荐的方式是在你的项目根目录下创建.cursor/mcp.json文件。这样当你在这个项目中打开Cursor时它会自动加载这个MCP服务器配置并且这个配置可以提交到Git与团队成员共享。{ mcpServers: { evm-mcp-server: { command: npx, args: [-y, mcpdotdirect/evm-mcp-server] } } }command: 告诉Cursor用什么命令启动服务器。这里用npx直接从npm运行包无需全局安装。args: 传递给命令的参数。-y让npx在找不到本地包时自动同意安装mcpdotdirect/evm-mcp-server是包名。更高级的配置示例{ mcpServers: { evm-mcp-local: { command: bun, args: [/绝对路径/到/你的/evm-mcp-server, start], env: { EVM_MNEMONIC: 你的助记词, ETHERSCAN_API_KEY: 你的Etherscan密钥 } }, evm-mcp-http: { url: http://localhost:3001/sse } } }evm-mcp-local: 指向你本地克隆并开发的项目目录并直接设置环境变量。适合深度定制和开发。evm-mcp-http: 连接到已运行的HTTP服务器。适合服务器常驻后台的场景。创建好配置文件后重启Cursor或打开该项目。你会在Cursor界面的MCP Servers区域看到新添加的服务器并可以启用/禁用它。4.2 实战演练在Cursor中与区块链对话配置成功后魔法就开始了。你不再需要编写复杂的Web3代码可以直接用自然语言指挥AI。场景一快速查询在Cursor的Chat界面中你可以直接提问“vitalik.eth在以太坊主网上有多少ETH”“查一下Arbitrum Sepolia测试网最新的区块号是多少”“0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48这个合约是什么代币它的符号和精度是多少”Cursor会理解你的问题自动调用MCP服务器中对应的工具get_balance,get_latest_block,read_contract并将结果清晰地展示给你。场景二辅助编程与调试假设你正在写一个DeFi相关的脚本需要与合约交互。你可以在代码注释中写下“这里需要调用Uniswap V2 Router的getAmountsOut函数计算用1个ETH可以换多少USDC。”然后问Cursor“帮我写一下调用0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D这个合约getAmountsOut函数的代码参数是1e18和[WETH地址, USDC地址]在以太坊主网上。”Cursor会利用MCP服务器获取合约ABI理解函数签名并为你生成使用Viem或Ethers.js的正确调用代码片段。场景三执行链上操作需谨慎在配置了钱包私钥/助记词后你甚至可以让AI协助执行操作“从我的钱包转0.01个ETH到0x...这个地址在Sepolia测试网上。”“为我的地址查询一下对Uniswap Router的USDC授权额度是多少。”“帮我在Goerli测试网上的某个合约上调用mint函数参数是5。”重要警告让AI执行写入操作风险极高务必遵循以下原则仅在测试网操作所有涉及资产转移或合约写入的操作先在Sepolia、Goerli等测试网上充分测试。小额测试即使是在测试网也先用极小金额测试流程。人工复核对于任何AI生成的交易在发送前务必自己仔细检查接收地址、金额、Gas Limit等关键参数。AI可能会“幻觉”出错误的地址或数值。使用Prompt引导充分利用服务器内置的transaction_preparation等提示让AI按步骤检查减少错误。4.3 集成到Claude Desktop等其他客户端除了Cursor任何支持MCP的客户端都可以连接。例如在Claude Desktop中你可以通过命令行添加claude mcp add evm-mcp-server npx mcpdotdirect/evm-mcp-server然后启动Claude它就能获得同样的区块链能力。这为构建跨平台的AI区块链助手提供了可能。5. 核心工具深度解析与实战技巧了解了基本集成后我们来深入剖析几个最常用、最强大的工具并分享一些教科书里不会写的实战技巧。5.1 智能合约交互的“黑科技”自动ABI获取read_contract和write_contract是使用频率最高的工具。它们的强大之处在于abiJson参数是可选的。如果你不提供ABI服务器会尝试自动从Etherscan获取。内部工作原理你调用read_contract传入contractAddress,functionName,args但不传abiJson。服务器检查是否有缓存的ABI。若无缓存则使用配置的ETHERSCAN_API_KEY向对应网络的区块链浏览器发起API请求。获取到ABI后解析并找到匹配的函数。使用Viem对参数进行编码发起RPC调用。对返回的数据进行解码并以结构化JSON返回。实战技巧处理未验证合约自动ABI获取的前提是合约在区块链浏览器上已经验证过源代码。对于未验证的合约此功能会失败。此时你有两个选择手动提供ABI如果你通过其他途径拿到了ABI可以将其作为JSON字符串传入abiJson参数。使用低级调用对于非常简单的调用如获取余额你可以直接使用eth_call但这就需要你手动处理编码失去了工具的便利性。建议优先寻找或验证合约ABI。5.2 性能利器Multicall批量查询在DeFi仪表盘或数据分析场景中经常需要同时查询大量数据如多个用户的多个代币余额。如果逐个调用RPC速度会非常慢。multicall工具就是为了解决这个问题。它底层集成了Multicall3合约。这是一个部署在几乎所有EVM链上的通用合约允许你将多个view/pure函数调用打包进一个交易进行静态调用仅消耗一次RPC往返的开销。示例同时查询多个信息假设你想获取一个地址的ETH余额、USDC余额和某个NFT的所有权状态。// 通过MCP工具调用multicall const result await mcp.invokeTool(multicall, { network: ethereum, calls: [ { target: 0x...Multicall3地址..., callData: encodeBalanceOfCall(0x目标地址) }, { target: USDC_ADDRESS, callData: encodeBalanceOfCall(0x目标地址) }, { target: NFT_ADDRESS, callData: encodeOwnerOfCall(tokenId) } ] });注意你需要自己用Viem或Ethers提前编码好callData。虽然多了一步但对于批量查询场景性能提升是数量级的。避坑指南Multicall的局限性仅支持只读调用Multicall只能用于view和pure函数不能用于发送交易或改变状态的函数。Gas限制虽然是一次RPC调用但合约内部执行每个调用仍需消耗Gas。如果批量调用的函数非常复杂可能会达到Gas限制而失败。需要合理控制批量调用的数量和复杂度。错误处理默认情况下一个调用失败会导致整个批量调用失败。你可以设置allowFailure: true来容忍单个失败只返回成功的结果。5.3 消息签名打通Web2与Web3的桥梁sign_message和sign_typed_data是两个至关重要的工具它们使得AI能代表用户进行“链下”的授权和认证。sign_message的应用场景Sign-In with Ethereum (SIWE)让用户用钱包签名一条特定格式的消息如“我同意使用服务X”完成去中心化登录。简单授权证明某个地址持有特定私钥用于API访问控制等。sign_typed_data(EIP-712) 的进阶应用这是更强大、更安全的结构化数据签名标准。它签名的不是普通字符串而是一个包含类型信息的JSON对象。主要用途Gasless Trading (Meta-Transaction)用户签名一个“订单”包含交易详情如用A代币换B代币然后将签名提交给一个中继服务器由中继服务器支付Gas并提交交易。这是很多DEX聚合器如Matcha的基础。Permit授权ERC-20代币的permit函数允许用户通过签名授权其他地址使用自己的代币而无需事先发起一笔链上approve交易节省了Gas费和等待时间。复杂协议签名如DAO投票、数字资产所有权证明等。在AI工作流中的意义这意味着你的AI助手不仅可以“看”链上数据还可以代表用户进行安全的、无需即时支付Gas的授权操作极大地扩展了应用场景。6. 常见问题排查与性能优化实录在实际使用中你肯定会遇到各种问题。下面是我踩过坑后总结的常见问题速查表和优化建议。6.1 连接与配置问题问题现象可能原因解决方案服务器启动失败提示Cannot find module依赖未安装或Node.js版本过低。1. 运行bun install或npm install。2. 确保Node.js版本 ≥ 20 或 Bun版本 ≥ 1.0。工具调用返回Missing or invalid private key/mnemonic未配置钱包环境变量或变量值格式错误。1. 检查EVM_PRIVATE_KEY或EVM_MNEMONIC是否已正确设置。2. 私钥需为64位十六进制数可带0x前缀。3. 助记词需为12或24个单词用空格分隔。ABI获取失败错误信息包含Max rate limit reachedEtherscan API调用频率超限。免费API有每秒/每天调用次数限制。1. 申请多个Etherscan API Key在代码中实现简单的轮询。2. 对于高频使用的合约将获取到的ABI缓存到本地文件或数据库避免重复查询。3. 考虑使用付费的Etherscan API套餐。调用write_contract时交易一直pending或失败Gas费设置过低、网络拥堵、合约逻辑错误、或账户余额不足。1. 使用get_gas_price工具获取当前网络Gas价格并适当提高Gas Premium。2. 检查发送地址的Native Token余额是否足够支付Gas。3. 在测试网充分测试合约调用逻辑使用read_contract先模拟调用看是否会报错。ENS解析失败1. 当前连接的RPC节点不支持ENS。2. ENS域名不存在或已过期。3. 网络参数错误如在Polygon网络查询以太坊主网的ENS。1. 确保使用的RPC支持ENS公共RPC通常支持。2. 手动在Etherscan或ENS官网检查域名状态。3. 确认调用工具时指定的network参数是ethereumENS是以太坊主网的服务。6.2 性能优化与最佳实践RPC节点选择公共RPC方便但有速率限制和延迟。仅适用于低频测试。自建节点性能最好控制力最强但运维成本高。节点服务商推荐折中方案。使用Infura、Alchemy、QuickNode等服务。它们提供稳定的连接、更快的响应、更高的调用限额以及诸如Webhook等高级功能。在chains.ts中替换rpcUrl即可。ABI缓存策略 自动获取ABI虽然方便但每次调用都去Etherscan查询是无法忍受的。实现一个简单的内存或Redis缓存能极大提升性能。// 伪代码示例简单的内存缓存 const abiCache new Mapstring, any(); async function getCachedAbi(contractAddress: string, network: string) { const cacheKey ${network}:${contractAddress}; if (abiCache.has(cacheKey)) { return abiCache.get(cacheKey); } const abi await fetchAbiFromEtherscan(contractAddress, network); abiCache.set(cacheKey, abi); return abi; } // 可以设置TTL例如1小时过期错误处理与重试 区块链网络不稳定是常态。为所有RPC调用添加指数退避重试机制。import { retry } from async; async function robustRpcCall(action: () Promiseany) { return retry( { times: 3, interval: (retryCount) Math.pow(2, retryCount) * 1000, // 指数退避 }, action ); }监控与日志 为生产环境中的MCP服务器添加详细的日志记录特别是对于交易发送、签名等敏感操作。监控RPC调用延迟、失败率以及Etherscan API的剩余配额。6.3 安全加固建议最小权限原则为MCP服务器配置的钱包只授予其完成任务所必需的最小权限。如果是用于查询则根本不需要私钥。如果需要发送交易确保钱包里只有完成任务所需的资金。输入验证与沙箱虽然MCP客户端如Cursor会做一层校验但在服务器端对传入的参数如地址格式、金额数值进行严格的二次验证是必要的。防止恶意构造的参数导致意外行为。操作确认机制对于涉及资产转移或重要合约调用的操作可以考虑实现一个二次确认流程。例如AI生成交易参数后先返回给用户界面审核用户手动点击确认后再实际发送。环境隔离将测试网和主网的配置完全分开。使用不同的环境变量文件.env.testnet,.env.mainnet甚至运行不同的服务器实例避免误操作。7. 扩展开发添加自定义工具与网络开源项目的魅力在于可以按需定制。如果你需要支持一条新的EVM链或者添加一个项目特有的工具可以轻松地扩展这个服务器。7.1 添加新的EVM网络假设要添加一条新的链如Berachain。打开src/core/chains.ts文件。在CHAINS常量对象中添加新的配置项export const CHAINS: Recordstring, ChainConfig { // ... 已有配置 berachain: { id: 80094, // Berachain的主网Chain ID name: Berachain, network: berachain, rpcUrl: https://rpc.berachain.com, // 替换为实际的RPC URL explorerUrl: https://berascan.com, nativeCurrency: { symbol: BERA, decimals: 18 } }, berachain-testnet: { id: 80085, // 测试网ID name: Berachain Testnet, network: berachain-testnet, rpcUrl: https://rpc.testnet.berachain.com, explorerUrl: https://testnet.berascan.com, nativeCurrency: { symbol: BERA, decimals: 18 } } };确保你使用的Viem版本支持该链的特定交易格式或预编译合约大多数EVM链都是兼容的。重新启动服务器新的网络标识符如berachain就可以在工具调用的network参数中使用了。7.2 创建自定义工具假设你想添加一个工具用于计算两个ERC20代币在Uniswap V2中的实时兑换率。在src/core/services/目录下创建一个新文件例如swap.ts。实现核心逻辑import { createPublicClient, http, parseAbi } from viem; import { getChainConfig } from ../chains.js; import { handleError } from ./utils.js; export async function getSwapRate(params: { network: string; tokenIn: string; tokenOut: string; amountIn: string; }) { try { const chain getChainConfig(params.network); const client createPublicClient({ chain, transport: http(chain.rpcUrl), }); // Uniswap V2 Router地址 (假设) const routerAddress 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; const routerAbi parseAbi([ function getAmountsOut(uint amountIn, address[] memory path) public view returns (uint[] memory amounts), ]); const path [params.tokenIn, params.tokenOut]; const amounts await client.readContract({ address: routerAddress, abi: routerAbi, functionName: getAmountsOut, args: [BigInt(params.amountIn), path], }); return { tokenIn: params.tokenIn, tokenOut: params.tokenOut, amountIn: params.amountIn, amountOut: amounts[1].toString(), path, network: params.network, }; } catch (error) { handleError(error, Failed to get swap rate); } }在src/core/services/index.ts中导出这个新函数。在src/core/tools.ts中注册新的MCP工具import { getSwapRate } from ./services/index.js; // 在 tools 数组中添加 { name: get_swap_rate, description: Get the estimated swap output amount from Uniswap V2., inputSchema: { type: object, properties: { network: { type: string, description: EVM network name }, tokenIn: { type: string, description: Input token address }, tokenOut: { type: string, description: Output token address }, amountIn: { type: string, description: Input amount in smallest unit }, }, required: [network, tokenIn, tokenOut, amountIn], }, handler: async ({ params }) { return await getSwapRate(params); }, }重新编译并启动服务器你的AI助手现在就可以使用get_swap_rate这个新工具了。通过这种方式你可以将任何复杂的区块链逻辑封装成简单的工具极大地增强AI智能体的能力边界。这个项目不仅仅是一个开箱即用的服务器更是一个强大的、可扩展的区块链AI集成框架。