使用说明
带有x402 Solana微支付的投注分析MCP服务器
一种模型上下文协议(MCP)服务器,使用x402协议提供带有集成Solana USDC微支付的博彩分析工具。
概述
此MCP服务器演示了如何在基于stdio的JSON-RPC环境中实现x402微支付。与中间件可以拦截请求的HTTP服务器不同,MCP服务器要求将支付验证直接集成到工具执行流中。
主要特点
- 无缝支付集成:付款签名作为工具参数
- 链上验证:完整的Solana交易验证
- 重放攻击防御:支付签名缓存
- 动态定价:支持固定和按百分比收费
- 生产就绪:Redis缓存、RPC故障转移、监控
- 多实例支持:共享缓存的水平扩展
快速开始
1.安装
# Clone the repository
git clone https://github.com/your-org/betting-analytics-mcp-server.git
cd betting-analytics-mcp-server
# Install dependencies
npm install
# Build the project
npm run build
2.配置
复制示例环境文件:
cp .env.example .env
编辑 .env 使用您的设置:
SOLANA_NETWORK=devnet
RECIPIENT_WALLET_DEVNET=YourDevnetWalletAddress
REDIS_URL= # Leave empty for in-memory cache
3.运行服务器
npm start
或者在自动重新加载的开发模式下:
npm run dev
建筑
支付流程
┌─────────┐ ┌─────────┐ ┌─────────┐
│ AI Agent│ │ MCP │ │ Solana │
│ │ │ Server │ │ │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
│ 1. Call tool │ │
│ (no payment) │ │
├─────────────────>│ │
│ │ │
│ 2. PAYMENT_REQ │ │
│<─────────────────┤ │
│ │ │
│ 3. Create & send USDC tx │
├────────────────────────────────────>│
│ │ │
│ 4. Tx confirmed │ │
│<────────────────────────────────────┤
│ │ │
│ 5. Call with sig │ │
├─────────────────>│ │
│ │ 6. Verify tx │
│ ├─────────────────>│
│ │ 7. Tx details │
│ │<─────────────────┤
│ 8. Tool result │ │
│<─────────────────┤ │
项目结构
src/
├── config/
│ └── payment.config.ts # Network and payment configuration
├── services/
│ ├── payment.service.ts # Payment verification service
│ └── rpc-manager.ts # RPC connection management
├── cache/
│ └── payment-cache.ts # Redis + in-memory cache
├── errors/
│ └── payment-errors.ts # Error types and factories
├── monitoring/
│ └── payment-monitor.ts # Metrics and alerting
├── handlers/
│ └── betting.handler.ts # Tool handlers with payment
└── server.ts # MCP server entry point
可用工具
1.执行Bet
在市场上下注。
支付:0.10美元+投注金额的2%
示例:
{
"market": "NBA-LAL-vs-GSW",
"amount": 100,
"side": "home",
"x402_payment_signature": "5KxR7...9mJp"
}
2.分析市场
用趋势和统计数据分析博彩市场。
支付:0.05美元直流电
示例:
{
"market": "NBA-LAL-vs-GSW",
"timeframe": "24h",
"x402_payment_signature": "5KxR7...9mJp"
}
3.赔率
获取市场的当前赔率。
支付:0.02美元直流电
示例:
{
"market": "NBA-LAL-vs-GSW",
"x402_payment_signature": "5KxR7...9mJp"
}
4.健康检查
检查服务器运行状况和指标。
支付:无(免费)
支付集成
第一步:无需付款即可致电
const result = await client.callTool('analyzeMarket', {
market: 'NBA-LAL-vs-GSW',
timeframe: '24h'
});
响应:
{
"error": "PAYMENT_REQUIRED",
"message": "Payment of 0.05 USDC required for analyzeMarket",
"payment": {
"amount": 0.05,
"recipient": "8x4eB...Abc2",
"usdcMint": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
"network": "devnet"
},
"instructions": [...]
}
步骤2:创建付款
// Create USDC transfer to recipient
const signature = await createUSDCTransfer({
recipient: payment.recipient,
amount: payment.amount,
usdcMint: payment.usdcMint
});
步骤3:使用签名重试
const result = await client.callTool('analyzeMarket', {
market: 'NBA-LAL-vs-GSW',
timeframe: '24h',
x402_payment_signature: signature
});
响应:
{
"success": true,
"payment": {
"verified": true,
"amount": 0.05,
"signature": "5KxR7...9mJp"
},
"result": {
"market": "NBA-LAL-vs-GSW",
"trends": {...},
"statistics": {...}
}
}
配置
环境变量
| 变量 | 描述 | 默认值 |
|---|---|---|
SOLANA_NETWORK 网络(开发网/主网)。 devnet |
||
SOLANA_RPC_DEVNET |
Devnet RPC端点 | Solana公共RPC |
SOLANA_RPC_MAINNET |
主网RPC端点 | Solana公共RPC |
RECIPIENT_WALLET_DEVNET |
Devnet付款接收人 | - |
RECIPIENT_WALLET_MAINNET |
主网付款接收人 | - |
REDIS_URL |
Redis连接URL | -(内存中) |
PAYMENT_CACHE_TTL |
缓存TTL(秒) | 3600 |
MAX_TRANSACTION_AGE |
最大交易年龄(秒) | 300 |
VERIFICATION_RETRY_ATTEMPTS |
RPC重试尝试 | 3 |
RPC_MAX_CONCURRENT |
最大并发RPC调用数 | 10 |
RPC_RATE_LIMIT |
每秒请求数 | 50 |
USDC铸币厂地址
- 开发网:
4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU - 主网:
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
缓存
内存缓存(开发)
自动时 REDIS_URL 未设置:
- 最多可存储1000个条目
- 每分钟自动清理
- 仅限单个实例
Redis缓存(生产)
生产部署所需:
REDIS_URL=redis://localhost:6379
# Or with auth:
REDIS_URL=rediss://default:password@redis-host:6379
益处:
- 多实例支持
- 重启后的持久性
- 跨服务器共享缓存
缓存结构:
x402:payment:{signature} -> {
toolName: string,
amount: number,
timestamp: number,
verified: boolean
}
监控
指标
通过访问指标 healthCheck 工具:
{
"metrics": {
"totalVerifications": 1523,
"successfulVerifications": 1489,
"failedVerifications": 34,
"cacheHitRate": 0.586,
"successRate": 0.978,
"averageVerificationTime": 1234,
"totalAmount": 156.34
}
}
警报
自动警报触发时间:
- 故障率高(>10%)
- RPC错误过多(>10)
- 验证速度慢(>5秒)
普罗米修斯集成
以Prometheus格式导出指标:
const metrics = paymentService.monitor.exportPrometheusMetrics();
错误处理
所有错误均以MCP兼容格式返回:
需要付款
{
"error": "PAYMENT_REQUIRED",
"message": "Payment of 0.05 USDC required",
"payment": {...}
}
无效签名
{
"error": "INVALID_SIGNATURE",
"message": "Invalid transaction signature format",
"details": {...}
}
未找到交易记录
{
"error": "TRANSACTION_NOT_FOUND",
"message": "Transaction not found on Solana",
"details": {
"possibleReasons": [
"Transaction not yet confirmed",
"Invalid signature",
"Wrong network"
]
}
}
金额不足
{
"error": "INSUFFICIENT_AMOUNT",
"message": "Insufficient payment amount",
"details": {
"expected": "0.05 USDC",
"actual": "0.03 USDC",
"shortfall": "0.02 USDC"
}
}
重放攻击
{
"error": "REPLAY_ATTACK",
"message": "Payment signature already used",
"details": {
"originalTool": "analyzeMarket"
}
}
安全
已实施的保护措施
- 重放攻击防御:缓存的签名不能重复使用
- 交易年龄限制:超过5分钟的付款被拒绝
- 金额验证:需要精确匹配金额
- 收件人验证:只接受向正确地址付款
- 令牌验证:仅接受USDC转账
- 签名验证:RPC调用前的格式验证
最佳实践
- 为devnet和主网使用单独的钱包
- 在生产环境中启用Redis身份验证
- 对Redis连接使用TLS
- 监控异常支付模式
- 设置高故障率警报
- 使用高级RPC端点(Helius、QuickNode)
- 在应用程序级别实施速率限制
生产部署
清单
- []配置主网钱包地址
- []设置带有身份验证和TLS的Redis
- []配置高级RPC端点
- []启用监视和警报
- []设置日志聚合
- []配置自动备份
- []测试devnet上的付款流程
- []验证缓存持久性
- []多实例负载测试
- []设置健康检查端点
推荐的基础设施
- RPC提供程序:Helius或QuickNode(高速率限制)
- 缓存:Redis云或AWS ElastiCache
- 监控:Datadog、New Relic或普罗米修斯
- 警报:PagerDuty或Opsgenie
- 日志:CloudWatch、Stackdriver或Papertrail
水平缩放
- 部署多个MCP服务器实例
- 使用共享Redis缓存
- 客户端级别的负载平衡
- 监控实例间的缓存命中率
发展
构建
npm run build
观看模式
npm run dev
测试
npm test
代码检查
npm run lint
npm run format
例子
详细示例见:
- CLIENT_EXAMPLE.md -客户端实现示例
- 实施_ GIDE.md -完整的实施指南
- 付款_设计.md -技术设计文件
故障排除
未找到交易记录
原因:交易尚未确认或网络错误
解决方案:
- 等待5-10秒确认
- 验证网络匹配(devnet与mainnet)
- 在Solana Explorer上检查交易
- 验证RPC终结点是否响应
金额不足
原因:付款金额不符合要求
解决方案:
- 检查动态定价工具的计算价格
- 确保USDC有6位小数(乘以1000000)
- 考虑任何基于百分比的费用
重放攻击错误
原因:尝试重用付款签名
解决方案:
- 创建新的支付交易
- 不要在不同的工具之间重复使用签名
- 检查缓存是否提前过期
RPC错误
原因:RPC终结点问题或速率限制
解决方案:
- 检查RPC终结点运行状况
- 在配置中添加回退端点
- 使用高级RPC提供程序(Helius、QuickNode)
- 增加重试次数和延迟
成本优化
RPC呼叫减少
- 缓存命中率:目标60%+,将RPC调用减少60%
- 连接池:跨请求重用连接
- 批量操作:使用
getSignatureStatuses用于多个签名 - 承诺水平:安全时使用“确认”而不是“最终确定”
节约示例
| 场景 | RPC调用 | 节省 |
|---|---|---|
| 无缓存 | 3000/天 | - |
| 缓存命中率为60% | 1200/天 | 60% |
| 分批处理 | 800/天 | 73% |
许可证
麻省理工学院
支持
对于问题和疑问:
- GitHub问题: github/your-org/betting-analytics-mcp-server/oissues
- 文件:见 实施_ GIDE.md
- x402协议: github/x402-solana
贡献
欢迎投稿!拜托:
- 分叉存储库
- 创建要素分支
- 提交您的更改
- 推到分支
- 创建拉取请求