使用说明
多边形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端点
安装
- 克隆存储库或下载源代码
- 安装依赖项:
cd polygonmcp
npm install
- 创建一个
.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
第一步
-
检查您的钱包余额:
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); -
获取测试网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); } -
模拟交易:
// 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
关键组件
- 多边形MCP服务器(
polygon-mcp.js):主入口点,处理MCP通信,实例化模块,注册工具,委托调用。 - 公用设施(
common/):- 钱包管理器:Singleton用于集中钱包状态和访问。
- 配置管理器:Singleton用于集中配置加载(
getConfig). - 工具函数:共享助手,如
resolveTokenAddress. - 常量:共享ABI、地址。
- 记录器、错误、验证:支持组件。
- 功能模块:
- 桥梁运营(
bridge-operations.js):封装MaticPOSClient以及桥接逻辑。 - 合同模板(
contract-templates.js):处理合约编译、从模板部署。 - DeFi交互(
defi-interactions.js):与DEX(QuickSwap、Uniswap)、Polymarket的接口。 - 交易模拟器(
transaction-simulation.js):使用模拟交易eth_call.
- 桥梁运营(
数据流
- 客户端请求由MCP服务器接收
- 验证请求并检查参数
- 相应的模块处理请求
- 区块链交互是通过ethers.js执行的
- 结果被格式化并返回给客户端
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连接问题,请尝试:
- 检查您的互联网连接
- 在中验证RPC终结点URL
.env文件 - 使用不同的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:*
贡献
欢迎投稿!以下是您如何做出贡献:
- 分叉存储库
- 创建要素分支:
git checkout -b feature/my-feature - 提交您的更改:
git commit -am 'Add my feature' - 推到分支:
git push origin feature/my-feature - 提交拉取请求
开发设置
- 克隆存储库
- 安装依赖项:
npm install - 创建一个
.env.test包含测试凭据的文件 - 运行测试:
npm test - 运行linting:
npm run lint
安全考虑
该服务器处理私钥和敏感的区块链操作。用于生产用途:
- 切勿将私钥存储在代码或环境变量中
- 使用安全的密钥管理系统或硬件钱包集成
- 实施适当的身份验证和授权
- 添加速率限制以防止滥用
- 添加全面的日志记录和监控
- 验证所有输入参数
- 实施适当的错误处理
- 使用安全配置管理
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许可证获得许可-有关详细信息,请参阅许可证文件。