一个模型上下文协议(MCP)服务器,提供与Polygon区块链网络无缝集成的功能。此服务器使AI助手能够通过标准化接口与Polygon进行交互,提供了全面的钱包操作工具、智能合约部署、L2桥接、DeFi互动和交易模拟。
Polygon是一个以太坊的Layer 2扩展解决方案,它提供了更快和更便宜的交易,同时保持了以太坊的安全性。这个MCP服务器允许AI助手与Polygon网络进行交互,通过简单的标准化接口实现广泛的区块链操作。
该服务器作为AI系统和Polygon区块链之间的桥梁,处理区块链交互的复杂性,并提供了一个干净、易于使用的API来执行常见操作。
┌─────────────┐ ┌───────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ AI系统 ├─────┤ Polygon MCP ├─────┤ Polygon链 │
│ │ │ 服务器 │ │ │
└─────────────┘ └───────────────┘ └─────────────────┘
cd polygonmcp
npm install
.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
检查你的钱包余额:
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);
获取测试网POL(仅限Amoy测试网):
async function getTestPol() {
// 在服务器启动时如果PRIVATE_KEY在.env中,则会自动连接钱包
// await server.connectWallet(process.env.PRIVATE_KEY);
const result = await server.getTestnetPol();
console.log('水龙头结果:', result);
}
模拟交易:
// 如果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 | 部署智能合约到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() |
支持的合约类型:
| 工具 | 描述 | 示例 |
|---|---|---|
deposit-eth | 从以太坊向Polygon存入ETH | 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 | 从以太坊向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兼容实现,桥接操作可能无法正常工作。
| 工具 | 描述 | 示例 |
|---|---|---|
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') |
| 工具 | 描述 | 示例 |
|---|---|---|
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 | 估计交易的gas费用 | const gas = await server.estimateGas(txParams) |
特性:
| 工具 | 描述 | 示例 |
|---|---|---|
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
polygon-mcp.js):主要入口点,处理MCP通信,实例化模块,注册工具,委托调用。common/):
getConfig)。resolveTokenAddress。bridge-operations.js):封装MaticPOSClient和桥接逻辑。contract-templates.js):处理合约编译,从模板部署。defi-interactions.js):与DEXs(QuickSwap,Uniswap),Polymarket互动。transaction-simulation.js):使用eth_call模拟交易。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...", ... }
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 (数组):构造函数参数返回值: 对象 - 验证结果(如果实现为工具)
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