返回市场
多边形-mcp

多边形-mcp

作者:Dbillionaer5 星标更新:2025-04-06

项目介绍

Polygon MCP Server

License: MIT Node.js: v18+

一个模型上下文协议(MCP)服务器,提供与Polygon区块链网络无缝集成的功能。此服务器使AI助手能够通过标准化接口与Polygon进行交互,提供了全面的钱包操作工具、智能合约部署、L2桥接、DeFi互动和交易模拟。

目录

简介

Polygon是一个以太坊的Layer 2扩展解决方案,它提供了更快和更便宜的交易,同时保持了以太坊的安全性。这个MCP服务器允许AI助手与Polygon网络进行交互,通过简单的标准化接口实现广泛的区块链操作。

该服务器作为AI系统和Polygon区块链之间的桥梁,处理区块链交互的复杂性,并提供了一个干净、易于使用的API来执行常见操作。

┌─────────────┐     ┌───────────────┐     ┌─────────────────┐
│             │     │               │     │                 │
│  AI系统     ├─────┤  Polygon MCP  ├─────┤  Polygon链     │
│             │     │    服务器     │     │                 │
└─────────────┘     └───────────────┘     └─────────────────┘

快速开始

先决条件

  • Node.js (v18或更高版本)
  • npm 或 yarn
  • 一个Polygon钱包私钥(用于签名交易)
  • Polygon主网和Amoy测试网的RPC端点

安装

  1. 克隆仓库或下载源代码
  2. 安装依赖项:
cd polygonmcp
npm install
  1. 创建一个.env文件,包含以下变量:
# 网络RPC端点
POLYGON_MAINNET_RPC=https://polygon-rpc.com
POLYGON_AMOY_RPC=https://rpc-amoy.polygon.technology
ETHEREUM_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY  # Sepolia用于Amoy的L1

# API密钥
POLYGONSCAN_API_KEY=YOUR_EXPLORER_API_KEY  # 使用OKLink API密钥用于Amoy

# 钱包(重要:在生产环境中使用安全密钥管理)
PRIVATE_KEY=your_private_key_here
DEFAULT_NETWORK=amoy  # 使用'amoy'用于测试网

# DeFi配置(可选)
DEFAULT_SLIPPAGE=0.5
DEFAULT_DEADLINE_MINUTES=20

运行服务器

启动服务器:

npm start

为了开发时自动重启:

npm run dev

第一步

  1. 检查你的钱包余额

    import { PolygonMCPServer } from './polygon-mcp.js';
    const server = new PolygonMCPServer();
    
    async function checkBalance() {
      // 在服务器启动时如果PRIVATE_KEY在.env中,则会自动连接钱包
      // await server.connectWallet(process.env.PRIVATE_KEY);
      const balances = await server.listBalances();
      console.log('钱包余额:', balances);
    }
    
    checkBalance().catch(console.error);
    
  2. 获取测试网POL(仅限Amoy测试网):

    async function getTestPol() {
      // 在服务器启动时如果PRIVATE_KEY在.env中,则会自动连接钱包
      // await server.connectWallet(process.env.PRIVATE_KEY);
      const result = await server.getTestnetPol();
      console.log('水龙头结果:', result);
    }
    
  3. 模拟交易

    // 如果PRIVATE_KEY在.env中,则会在服务器启动时自动连接钱包
    
    async function simulateTransaction() {
      const result = await server.simulateTransaction({
        to: '0x1234...', // 接收地址
        value: '0.01',    // 数量(单位:MATIC或本地代币)
      });
      console.log('模拟结果:', result);
    }
    

特性

钱包操作

工具描述示例
get-address获取当前钱包地址const address = await server.getAddress()
get-testnet-pol请求测试网POL(仅限Amoy测试网)await server.getTestnetPol()
list-balances列出已连接钱包的代币余额const balances = await server.listBalances()
transfer-funds将POL或ERC20代币转移到另一个地址await server.transferFunds('0x1234...', '0.1', 'MATIC')

钱包管理器提供:

  • 增强的钱包连接验证
  • 支持多个网络
  • 改进的错误处理,带有详细的错误信息
  • 安全的私钥管理

智能合约操作

工具描述示例
deploy-contract部署智能合约到Polygonawait server.deployContract(name, code, args)
verify-contract在Polygonscan上验证已部署的合约await server.verifyContract(address, name, code, args)
list-contract-templates列出可用的合约模板const templates = await server.listContractTemplates()

支持的合约类型:

  • ERC20代币
  • ERC721 NFT集合
  • ERC1155多代币
  • 质押合约
  • 多签钱包

L2桥接操作

工具描述示例
deposit-eth从以太坊向Polygon存入ETHawait server.mcpServer.callTool('deposit-eth', { amount: '0.1' })
withdraw-eth从Polygon向以太坊提取ETH/POLawait server.mcpServer.callTool('withdraw-eth', { amount: '0.1' })
deposit-token从以太坊向Polygon存入ERC20代币await server.mcpServer.callTool('deposit-token', { token: 'USDC', amount: '100' })
withdraw-token从Polygon向以太坊提取ERC20代币await server.mcpServer.callTool('withdraw-token', { token: 'USDC', amount: '100' })
check-bridge-status检查桥接交易的状态(尚未实现为工具)N/A

特性:

  • 支持通过PolygonBridge类进行ETH和ERC20代币的桥接。
  • bridge-operations.js中封装了MaticPOSClient的使用。
  • 增强的桥接操作错误处理。
  • 检查点意识(源自MaticPOSClient)。

注意: 当前实现使用了MaticPOSClient的模拟版本,因为存在ESM兼容性问题。直到创建了适当的ESM兼容实现,桥接操作可能无法正常工作。

DeFi互动

QuickSwap DEX

工具描述示例
swap-tokens使用QuickSwap交换代币await server.swapTokens('MATIC', 'USDC', '10')
get-swap-quote获取代币交换的价格报价const quote = await server.getSwapQuote('MATIC', 'USDC', '10')
add-liquidity向QuickSwap池添加流动性await server.addLiquidity('MATIC', 'USDC', '10', '20')

Uniswap V3

工具描述示例
uniswapV3SwapSingle执行单跳交换await server.uniswapV3SwapSingle(tokenIn, tokenOut, amount, fee)
uniswapV3SwapMulti执行多跳交换await server.uniswapV3SwapMulti(path, amounts)
getUniswapV3QuoteSingle获取单跳交换的报价const quote = await server.getUniswapV3QuoteSingle(tokenIn, tokenOut, amount, fee)
getUniswapV3QuoteMulti获取多跳交换的报价const quote = await server.getUniswapV3QuoteMulti(path, amount)

Polymarket预测市场

工具描述示例
getPolymarketInfo获取市场信息const info = await server.getPolymarketInfo(marketId)
placePolymarketBet通过购买位置代币下注await server.placePolymarketBet(marketId, outcome, amount)
getPolymarketPositions获取用户在市场的仓位const positions = await server.getPolymarketPositions(marketId)

交易模拟

工具描述示例
simulate-transaction模拟交易以预览其效果const result = await server.simulateTransaction(txParams)
estimate-gas估计交易的gas费用const gas = await server.estimateGas(txParams)

特性:

  • 支持EIP-1559的gas估算
  • 代币转移检测和分析
  • 合约交互模拟
  • 增强的BigInt处理
  • 改进的错误上下文

网络工具

工具描述示例
get-gas-price获取Polygon上的当前gas价格const price = await server.getGasPrice()
switch-network在Polygon主网和Amoy测试网之间切换await server.switchNetwork('mainnet')

架构

Polygon MCP服务器采用模块化架构,分离关注点并促进维护性:

flowchart TD
    MCPServer["Polygon MCP Server (polygon-mcp.js)"]

    subgraph Modules
        BridgeOps["Bridge Operations (bridge-operations.js)"]
        ContractOps["Contract Templates (contract-templates.js)"]
        DeFiOps["DeFi Interactions (defi-interactions.js)"]
        SimOps["Transaction Simulator (transaction-simulation.js)"]
    end

    subgraph Common ["Common Utilities (common/)"]
        WalletManager["Wallet Manager (Singleton)"]
        ConfigManager["Configuration Manager"]
        Utils["Utility Functions (utils.js)"]
        Constants["Constants"]
        Logger["Logger (logger.js)"]
        Errors["Error Handling (errors.js)"]
        Validation["Validation (validation.js)"]
    end

    MCPServer -- 实例化/使用 --> Modules
    MCPServer -- 使用 --> Common
    Modules -- 使用 --> Common

关键组件

  1. Polygon MCP服务器 (polygon-mcp.js):主要入口点,处理MCP通信,实例化模块,注册工具,委托调用。
  2. 通用工具 (common/)
    • 钱包管理器:单例,用于集中化的钱包状态和访问。
    • 配置管理器:单例,用于集中化的配置加载(getConfig)。
    • 实用函数:共享辅助函数如resolveTokenAddress
    • 常量:共享ABIs,地址。
    • 日志记录器,错误处理,验证:支持组件。
  3. 功能性模块
    • 桥接操作 (bridge-operations.js):封装MaticPOSClient和桥接逻辑。
    • 合约模板 (contract-templates.js):处理合约编译,从模板部署。
    • DeFi互动 (defi-interactions.js):与DEXs(QuickSwap,Uniswap),Polymarket互动。
    • 交易模拟器 (transaction-simulation.js):使用eth_call模拟交易。

数据流

  1. 客户端请求由MCP服务器接收。
  2. 请求被验证,参数被检查。
  3. 适当的模块处理请求。
  4. 通过ethers.js执行区块链交互。
  5. 结果被格式化并返回给客户端。

API参考

钱包操作(通过MCP工具)

get-address

获取连接的钱包地址。

返回值: JSON字符串 { "address": "0x..." }

list-balances

列出连接的钱包(或指定地址)的本地和已知代币余额。

参数(可选):

  • address (字符串):要检查的地址(默认为连接的钱包)

返回值: JSON字符串 { "address": "...", "nativeBalance": "...", "tokens": { "USDC": "...", ... } }

transfer-funds

将本地代币(POL)或ERC20代币转移到另一个地址。

参数:

  • to (字符串):接收地址
  • amount (字符串):要转移的数量
  • token (字符串,可选):代币符号或地址(省略表示本地POL)

返回值: JSON字符串 { "success": true, "txHash": "0x...", ... }

合约操作(通过MCP工具)

list-contract-templates

列出可用的合约模板。

返回值: JSON字符串 [{"id": "erc20", "name": "...", ...}, ...]

deploy-contract

从模板部署合约。

参数:

  • templateId (字符串):模板ID(例如,'erc20','nft')
  • params (对象):特定于模板的参数(例如,{ "name": "MyToken", ... }
  • constructorArgs (数组,可选):合约构造函数的参数

返回值: JSON字符串 { "address": "0x...", "transactionHash": "0x...", ... }

verify-contract(目前未作为MCP工具暴露)

在Polygonscan上验证合约。

参数:

  • address (字符串):合约地址
  • name (字符串):合约名称
  • code (字符串):合约源代码
  • constructorArgs (数组):构造函数参数

返回值: 对象 - 验证结果(如果实现为工具)

桥接操作(通过MCP工具)

deposit-eth

从以太坊向Polygon存入ETH。

参数:

  • amount (字符串):要存入的ETH数量

返回值: JSON字符串 { "txHash": "0x...", "status": "pending" }

withdraw-eth

从Polygon向以太坊提取本地代币(POL)。注意:Polygon已经将MATIC重新命名为POL,适用于主网和测试网。

参数:

  • amount (字符串):要提取的本地代币(POL)数量

返回值: JSON字符串 { "txHash": "0x...", "status": "pending" }

deposit-token

从以太坊向Polygon存入ERC20代币。

参数:

  • token (字符串):代币符号或地址
  • amount (字符串):要存入的数量

返回值: JSON字符串 { "txHash": "0x...", "status": "pending" }

withdraw-token

从Polygon向以太坊提取ERC20代币。

参数:

  • token (字符串):代币符号或地址
  • amount (字符串):要提取的数量

返回值: JSON字符串 { "txHash": "0x...", "status": "pending" }

(注意:check-bridge-status已在PolygonBridge中实现,但尚未作为MCP工具暴露)

高级用法

组合多个操作

// 示例:交换代币然后桥接到以太坊(概念性使用MCP工具)
async function swapAndBridge() {
  // 假设服务器正在运行且钱包通过env/config连接

  // 交换MATIC为USDC(使用假设的交换工具 - 需要实现)
  // const swapResult = await server.mcpServer.callTool('swap-tokens', { fromToken: 'MATIC', toToken: 'USDC', amount: '10' });
  // console.log('交换结果:', swapResult);
  // await server.provider.waitForTransaction(swapResult.content[0].text.txHash); // 等待交换交易

  // 桥接USDC到以太坊
  const bridgeResult = await server.mcpServer.callTool('withdraw-token', { token: 'USDC', amount: '10' });
  console.log('桥接结果:', bridgeResult);
}

自定义合约部署

// 使用模板部署自定义ERC20代币(概念性使用MCP工具)
async function deployCustomToken() {
  // 假设服务器正在运行且钱包通过env/config连接

  // 获取ERC20模板信息(可选步骤)
  // const templates = await server.mcpServer.callTool('list-contract-templates', {});
  // console.log(templates);

  // 定义参数
  const templateId = 'erc20';
  const params = { name: 'MyCustomToken' }; // 名称用于模板处理
  const constructorArgs = ['MyCustomToken', 'MCT', '1000000000000000000000000']; // 名称,符号,初始供应量(以wei计)

  // 部署合约
  const deployResult = await server.mcpServer