区块链交互服务

Polygon MCP Server是一个为AI助手提供与Polygon区块链网络无缝集成的服务,支持钱包操作、智能合约部署、L2桥接、DeFi交互和交易模拟等功能。

  • by Dbillionaer
  • JavaScript
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 Dbillionaer/polygon-mcp

使用说明

多边形MCP服务器

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

目录

引言

Polygon是以太坊的第2层扩展解决方案,在保持以太坊安全性的同时提供更快、更便宜的交易。此MCP服务器允许AI助手与Polygon网络交互,通过简单、标准化的界面实现广泛的区块链操作。

该服务器充当人工智能系统和Polygon区块链之间的桥梁,处理区块链交互的复杂性,并为常见操作提供干净、易于使用的API。

┌─────────────┐     ┌───────────────┐     ┌─────────────────┐
│             │     │               │     │                 │
│  AI System  ├─────┤  Polygon MCP  ├─────┤  Polygon Chain  │
│             │     │    Server     │     │                 │
└─────────────┘     └───────────────┘     └─────────────────┘

快速开始

先决条件

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

安装

  1. 克隆存储库或下载源代码
  2. 安装依赖项:
cd polygonmcp
npm install
  1. 创建一个 .env 包含以下变量的文件:
# Network RPC endpoints
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 for Amoy's L1

# API Keys
POLYGONSCAN_API_KEY=YOUR_EXPLORER_API_KEY  # Use OKLink API key for Amoy

# Wallet (IMPORTANT: Use secure key management in production)
PRIVATE_KEY=your_private_key_here
DEFAULT_NETWORK=amoy  # Use 'amoy' for testnet

# DeFi Configuration (Optional)
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() {
      // Wallet is connected automatically on server start if PRIVATE_KEY is in .env
      // await server.connectWallet(process.env.PRIVATE_KEY);
      const balances = await server.listBalances();
      console.log('Wallet balances:', balances);
    }
    
    checkBalance().catch(console.error);
    
  2. 获取测试网POL (仅厦门测试网):

    async function getTestPol() {
      // Wallet is connected automatically on server start if PRIVATE_KEY is in .env
      // await server.connectWallet(process.env.PRIVATE_KEY);
      const result = await server.getTestnetPol();
      console.log('Faucet result:', result);
    }
    
  3. 模拟交易:

    // Wallet is connected automatically on server start if PRIVATE_KEY is in .env
    
    async function simulateTransaction() {
      const result = await server.simulateTransaction({
        to: '0x1234...', // Recipient address
        value: '0.01',    // Amount in MATIC (or native token)
      });
      console.log('Simulation result:', result);
    }
    

特性

钱包操作

工具 说明 示例
get-address 检索当前钱包地址 const address = await server.getAddress()
get-testnet-pol 从水龙头请求测试网POL(仅限淘测试网) await server.getTestnetPol()
list-balances 列出连接钱包的令牌余额 const balances = await server.listBalances()
transfer-funds 将POL或ERC20代币转移到另一个地址 await server.transferFunds('0x1234...', '0.1', 'MATIC')

钱包管理器提供:

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

智能合约操作

工具 说明 示例
deploy-contract 将智能合约部署到Polygon await 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 将ETH从以太坊存入Polygon await server.mcpServer.callTool('deposit-eth', { amount: '0.1' })
withdraw-eth 从Polygon提取ETH/POL到以太坊 await server.mcpServer.callTool('withdraw-eth', { amount: '0.1' })
deposit-token 将ERC20从以太坊存入Polygon await server.mcpServer.callTool('deposit-token', { token: 'USDC', amount: '100' })
withdraw-token 将ERC20从Polygon撤回到以太坊 await server.mcpServer.callTool('withdraw-token', { token: 'USDC', amount: '100' })
check-bridge-status 检查桥接事务的状态(尚未作为工具实现) N/A

特征:

  • 通过以下方式支持ETH和ERC20代币桥接 PolygonBridge 类。
  • 封装 MaticPOSClient 内部使用 bridge-operations.js.
  • 增强了桥接操作的错误处理。
  • 检查点意识(固有于 MaticPOSClient).

注: 由于ESM兼容性问题,当前的实现使用MaticPOSClient的模拟版本。在创建适当的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)

多市场预测市场

工具 说明 示例
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 估算交易的天然气 const gas = await server.estimateGas(txParams)

特征:

  • 在EIP-1559支持下进行天然气估算
  • 令牌转移检测和分析
  • 合同交互模拟
  • 增强的BigInt处理
  • 改进了错误上下文

网络工具

工具 说明 示例
get-gas-price 获取Polygon上的当前天然气价格 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 -- instantiates/uses --> Modules
    MCPServer -- uses --> Common
    Modules -- use --> Common

关键组件

  1. 多边形MCP服务器(polygon-mcp.js):主入口点,处理MCP通信,实例化模块,注册工具,委托调用。
  2. 公用设施(common/):
    • 钱包管理器:Singleton用于集中钱包状态和访问。
    • 配置管理器:Singleton用于集中配置加载(getConfig).
    • 工具函数:共享助手,如 resolveTokenAddress.
    • 常量:共享ABI、地址。
    • 记录器、错误、验证:支持组件。
  3. 功能模块:
    • 桥梁运营(bridge-operations.js):封装 MaticPOSClient 以及桥接逻辑。
    • 合同模板(contract-templates.js):处理合约编译、从模板部署。
    • DeFi交互(defi-interactions.js):与DEX(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 (string):要检查的地址(默认为已连接的钱包)

退货: JSON字符串 { "address": "...", "nativeBalance": "...", "tokens": { "USDC": "...", ... } }

transfer-funds

将本机令牌(POL)或ERC20令牌转移到另一个地址。

参数:

  • to (string):收件人地址
  • amount (string):转账金额
  • token (字符串,可选):令牌符号或地址(对于本机POL省略)

退货: JSON字符串 { "success": true, "txHash": "0x...", ... }

合同操作(通过MCP工具)

list-contract-templates

列出可用的合同模板。

退货: JSON字符串 [{ "id": "erc20", "name": "...", ... }, ...]

deploy-contract

从模板部署合同。

参数:

  • templateId (string):模板的ID(例如,'erc20'、'nft')
  • params (object):模板特有的参数(例如。, { "name": "MyToken", ... })
  • constructorArgs (数组,可选):合约构造函数的参数

退货: JSON字符串 { "address": "0x...", "transactionHash": "0x...", ... }

verify-contract (目前未作为MCP工具公开)

在Polygonscan上验证合同。

参数:

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

退货: 对象-验证结果(如果作为工具实施)

桥接操作(通过MCP工具)

deposit-eth

将ETH从以太坊存入Polygon。

参数:

  • amount (string):要存入的ETH金额

退货: JSON字符串 { "txHash": "0x...", "status": "pending" }

withdraw-eth

将原生代币(POL)从Polygon撤回到以太坊。注:Polygon已在主网和测试网上从MATIC更名为POL。

参数:

  • amount (string):要提取的本地令牌(POL)的数量

退货: JSON字符串 { "txHash": "0x...", "status": "pending" }

deposit-token

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

参数:

  • token (string):令牌符号或地址
  • amount (string):存款金额

退货: JSON字符串 { "txHash": "0x...", "status": "pending" }

withdraw-token

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

参数:

  • token (string):令牌符号或地址
  • amount (string):提取金额

退货: JSON字符串 { "txHash": "0x...", "status": "pending" }

(注: check-bridge-status 实施于 PolygonBridge 但尚未作为MCP工具公开)

高级用法

结合多种操作

// Example: Swap tokens and then bridge to Ethereum (Conceptual using MCP tools)
async function swapAndBridge() {
  // Assume server is running and wallet connected via env/config

  // Swap MATIC to USDC (using a hypothetical swap tool - needs implementation)
  // const swapResult = await server.mcpServer.callTool('swap-tokens', { fromToken: 'MATIC', toToken: 'USDC', amount: '10' });
  // console.log('Swap result:', swapResult);
  // await server.provider.waitForTransaction(swapResult.content[0].text.txHash); // Wait for swap tx

  // Bridge USDC to Ethereum
  const bridgeResult = await server.mcpServer.callTool('withdraw-token', { token: 'USDC', amount: '10' });
  console.log('Bridge result:', bridgeResult);
}

自定义合约部署

// Deploy a custom ERC20 token using templates (Conceptual using MCP tools)
async function deployCustomToken() {
  // Assume server is running and wallet connected via env/config

  // Get the ERC20 template info (optional step)
  // const templates = await server.mcpServer.callTool('list-contract-templates', {});
  // console.log(templates);

  // Define parameters
  const templateId = 'erc20';
  const params = { name: 'MyCustomToken' }; // Name is used in template processing
  const constructorArgs = ['MyCustomToken', 'MCT', '1000000000000000000000000']; // Name, Symbol, InitialSupply (in wei)

  // Deploy the contract
  const deployResult = await server.mcpServer.callTool('deploy-contract', {
    templateId,
    params,
    constructorArgs
  });
  const deployData = JSON.parse(deployResult.content[0].text);
  console.log('Contract deployed at:', deployData.address);

  // Verification would need the source code, which isn't directly returned by deploy-contract
  // Verification might need a separate tool or manual process.
}
  const customizedCode = erc20Template.code
    .replace('{{name}}', 'MyCustomToken')
    .replace('initialSupply * 10 ** decimals()', '1000000 * 10 ** 18');

  // Deploy the contract
  const result = await server.deployContract(
    'MyCustomToken',
    customizedCode,
    ['MyCustomToken', 'MCT', 1000000]
  );

安全交易模拟

// Simulate a transaction before executing it (Conceptual using MCP tools)
async function safeTransfer() {
  // Assume server is running and wallet connected via env/config

  const txParams = {
    to: '0x1234...',
    value: '1000000000000000000', // 1 POL in wei
    // data: '0x' // Optional data
  };

  // Simulate first
  const simResult = await server.mcpServer.callTool('simulate-transaction', { transaction: txParams });
  const simulation = JSON.parse(simResult.content[0].text);

  // Check for issues
  if (!simulation.success) {
    console.error('Transaction would fail:', simulation.errorMessage);
    return;
  }

  // Check gas costs
  console.log('Estimated gas cost:', simulation.gasCost.ether, 'MATIC');
  // Execute if simulation was successful (using transfer-funds tool)
  const transferResult = await server.mcpServer.callTool('transfer-funds', {
    to: txParams.to,
    amount: '1.0' // Amount in POL for the tool
  });
  console.log('Transaction sent:', transferResult);
}

故障排除

现状和已知问题

重要提示: 由于ESM兼容性问题,当前的实现使用MaticPOSClient的模拟版本。在创建适当的ESM兼容实施之前,桥接操作(存款/取款)可能无法正常运行。

常见问题

“钱包未连接”错误

确保 PRIVATE_KEY 在中正确设置 .env 文件或MCP服务器配置,因为如果提供了密钥,钱包会在服务器启动时自动连接。手册 connectWallet 呼叫不再是主要机制。

RPC连接问题

如果您遇到RPC连接问题,请尝试:

  1. 检查您的互联网连接
  2. 在中验证RPC终结点URL .env 文件
  3. 使用不同的RPC提供程序

资金不足

对于需要加油费的操作,请确保您的钱包有足够的本地代币(POL):

const balances = await server.listBalances();
// Check native token balance (POL)
const nativeToken = 'POL';
console.log(`${nativeToken} balance:`, balances.nativeBalance);

交易失败

在发送之前,使用事务模拟器诊断问题:

const simulation = await server.simulateTransaction(tx);
if (!simulation.success) {
  console.error('Transaction would fail:', simulation.errorMessage);
}

调试

通过设置环境变量启用调试日志记录:

DEBUG=polygon-mcp:*

贡献

欢迎投稿!以下是您如何做出贡献:

  1. 分叉存储库
  2. 创建要素分支: git checkout -b feature/my-feature
  3. 提交您的更改: git commit -am 'Add my feature'
  4. 推到分支: git push origin feature/my-feature
  5. 提交拉取请求

开发设置

  1. 克隆存储库
  2. 安装依赖项: npm install
  3. 创建一个 .env.test 包含测试凭据的文件
  4. 运行测试: npm test
  5. 运行linting: npm run lint

安全考虑

该服务器处理私钥和敏感的区块链操作。用于生产用途:

  1. 切勿将私钥存储在代码或环境变量中
  2. 使用安全的密钥管理系统或硬件钱包集成
  3. 实施适当的身份验证和授权
  4. 添加速率限制以防止滥用
  5. 添加全面的日志记录和监控
  6. 验证所有输入参数
  7. 实施适当的错误处理
  8. 使用安全配置管理

MCP集成

添加到MCP设置

要将此服务器与Claude或其他MCP兼容系统一起使用,请将其添加到MCP设置配置文件中:

对于Cursor/Claude Dev:

{
  "mcpServers": {
    "polygon": {
      "command": "node",
      "args": ["path/to/polygon-mcp.js"],
      "env": {
        "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",
        "POLYGONSCAN_API_KEY": "YOUR_EXPLORER_API_KEY",
        "PRIVATE_KEY": "your_private_key_here",
        "DEFAULT_NETWORK": "amoy",
        "DEFAULT_SLIPPAGE": "0.5",
        "DEFAULT_DEADLINE_MINUTES": "20"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

项目结构

  • polygon-mcp.js -主服务器实现
  • bridge-operations.js -L2桥梁作业
  • contract-templates.js -合同部署模板
  • defi-interactions.js -DeFi协议交互
  • transaction-simulation.js -交易模拟逻辑。
  • logger.js -结构化日志工具。
  • errors.js -自定义错误类和帮助程序。
  • validation.js -输入验证助手(可能未充分利用)。
  • common/ -共享实用程序和常量:
    • config-manager.js -集中配置加载(getConfig).
    • constants.js -共享ABI、地址。
    • wallet-manager.js -Singleton钱包管理器。
    • utils.js -集中式公用设施功能(例如。, resolveTokenAddress).

许可证

此项目根据MIT许可证获得许可-有关详细信息,请参阅许可证文件。