投注分析MCP服务器

一个集成了Solana USDC微支付的投注分析工具服务器,提供动态定价、支付验证和缓存支持。

  • by BOBER3r
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 BOBER3r/solex-betting-mcp

使用说明

带有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"
  }
}

安全

已实施的保护措施

  1. 重放攻击防御:缓存的签名不能重复使用
  2. 交易年龄限制:超过5分钟的付款被拒绝
  3. 金额验证:需要精确匹配金额
  4. 收件人验证:只接受向正确地址付款
  5. 令牌验证:仅接受USDC转账
  6. 签名验证: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

水平缩放

  1. 部署多个MCP服务器实例
  2. 使用共享Redis缓存
  3. 客户端级别的负载平衡
  4. 监控实例间的缓存命中率

发展

构建

npm run build

观看模式

npm run dev

测试

npm test

代码检查

npm run lint
npm run format

例子

详细示例见:

故障排除

未找到交易记录

原因:交易尚未确认或网络错误

解决方案:

  1. 等待5-10秒确认
  2. 验证网络匹配(devnet与mainnet)
  3. 在Solana Explorer上检查交易
  4. 验证RPC终结点是否响应

金额不足

原因:付款金额不符合要求

解决方案:

  1. 检查动态定价工具的计算价格
  2. 确保USDC有6位小数(乘以1000000)
  3. 考虑任何基于百分比的费用

重放攻击错误

原因:尝试重用付款签名

解决方案:

  1. 创建新的支付交易
  2. 不要在不同的工具之间重复使用签名
  3. 检查缓存是否提前过期

RPC错误

原因:RPC终结点问题或速率限制

解决方案:

  1. 检查RPC终结点运行状况
  2. 在配置中添加回退端点
  3. 使用高级RPC提供程序(Helius、QuickNode)
  4. 增加重试次数和延迟

成本优化

RPC呼叫减少

  • 缓存命中率:目标60%+,将RPC调用减少60%
  • 连接池:跨请求重用连接
  • 批量操作:使用 getSignatureStatuses 用于多个签名
  • 承诺水平:安全时使用“确认”而不是“最终确定”

节约示例

场景 RPC调用 节省
无缓存 3000/天 -
缓存命中率为60% 1200/天 60%
分批处理 800/天 73%

许可证

麻省理工学院

支持

对于问题和疑问:

贡献

欢迎投稿!拜托:

  1. 分叉存储库
  2. 创建要素分支
  3. 提交您的更改
  4. 推到分支
  5. 创建拉取请求

致谢