mcpField
M
MCP Solana Internet: Direct SOL Payments for Content Access

MCP Solana Internet: Direct SOL Payments for Content Access

本地服务
github.com/waifuai金融数据17 周前更新

关于 MCP Solana Internet: Direct SOL Payments for Content Access

这是一个将 Solana 直接支付接入数字内容访问控制的 MCP 服务概念验证,面向构建付费资源流程的开发者。它提供访问检查、未签名 SOL 转账交易生成及链上交易验证;访问记录检查目前仍是占位实现。

主要功能

  1. 01通过资源检查访问权限
  2. 02生成未签名 SOL 转账交易
  3. 03验证已签名交易
  4. 04Flask 支付 API 集成
  5. 05基于 Solana 记录验证支付

适用场景

  1. 01为数字资源设置 SOL 付费访问
  2. 02在支付确认前后检查资源权限

MCP 相关

向 MCP 客户端公开 `access://check` 资源和 `process_payment` 工具。客户端可检查访问状态、提交交易签名并在支付后重新检查权限。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

MCP Solana Internet:通过直接 SOL 付款获取内容

本项目演示了一个概念验证实现:MCP 服务与 Solana 区块链集成,通过直接 SOL 付款,为数字内容和资源提供付费访问。它展示了如何将 MCP 与区块链结合,构建去中心化、无需许可的访问控制系统。

概述

本项目包含两个主要组件:

  • MCP 服务(server.py): 这是核心 MCP 服务,使用 fastmcp 库构建。它处理 MCP 请求、管理资源访问,并与 Solana 区块链交互。
  • 支付 API(payments.py): 基于 Flask 的 API,用于创建支付交易。该 API 通过 Flask 蓝图集成在 MCP 服务内部,从而简化部署和交互。这种方式便于创建 MCP 规范中所述的“solana-action:” URI。

服务公开了一个 MCP 资源(access://check),用于检查用户是否已支付访问指定资源的费用。如果需要付款,它会返回一个 solana-action: URL,供 MCP 客户端发起支付交易。process_payment 工具允许 MCP 客户端提交已签名的 Solana 交易,从而完成付款。

功能

  • 直接 SOL 付款: 用户直接使用 SOL 付款以访问资源,无需中间方。
  • 去中心化访问控制: Solana 区块链充当透明且不可篡改的账本,用于验证付款。
  • MCP 集成: 利用 MCP 标准化资源访问请求和付款发起流程。
  • 基于 Flask 的支付 API: 提供简单且定义明确的 API,用于生成未签名的 Solana 支付交易。
  • Solana 交互: 使用 solders 库,以高效且符合惯用方式的形式与 Solana 区块链交互。
  • 测试覆盖: 包含使用 pytest 和 pytest-asyncio 编写的集成测试,用于验证基本功能。
  • 可扩展设计: 为在 Solana 和 MCP 上构建更复杂的付费内容系统提供基础。

安装

  1. 先决条件:

    • Python 3.11+
    • Poetry(用于依赖管理)
    • Solana CLI(版本 1.16 或更高)
    • solana-test-validator(用于本地测试)
  2. 克隆代码库:

    git clone <repository_url>
    cd mcp-solana-internet
    
  3. 安装依赖:

    poetry install
    
  4. 环境设置:

    • 在 mcp_solana_internet 目录中创建一个 .env 文件:

      touch mcp_solana_internet/.env
      
    • 编辑 .env 文件并设置以下变量:

      RPC_ENDPOINT="http://localhost:8899"  # 或你的 Solana 集群端点
      PAYMENT_WALLET_SEED="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"
      # ^^^ **重要:** 这只是用于演示的占位符。
      # 在生产环境中,你必须使用安全的密钥管理解决方案
      #(例如 AWS KMS、HashiCorp Vault 或硬件钱包)。切勿将私钥
      #或种子直接存储在代码或配置文件中。此种子用于生成钱包地址。
      
      • RPC_ENDPOINT:你的 Solana RPC 端点的 URL。本地开发时,如果正在运行 solana-test-validator,可以使用 http://localhost:8899。针对 devnet 测试时,请使用 https://api.devnet.solana.com。
      • PAYMENT_WALLET_SEED:由 32 个整数构成的逗号分隔列表,表示支付钱包的种子。此钱包将接收 SOL 付款。再次提醒:这种做法不安全,仅用于演示。

使用方法

  1. 启动 Solana 测试验证器(用于本地测试):

    solana-test-validator
    

    这会启动一个可供测试使用的本地 Solana 集群。

  2. 启动 MCP 服务:

    poetry run python mcp_solana_internet/server.py
    

    服务将开始通过 stdin 和 stdout 监听 MCP 请求(stdio 传输)。它还会在端口 5001 上启动 Flask 支付 API。

  3. 与服务交互(概念示例):

    MCP 客户端可以按以下方式与服务交互:

    1. 检查访问权限: 客户端向 access://check 发送 MCP 请求,并附上用户的公钥和资源 ID。

    2. 需要付款: 如果用户尚未付款,服务会返回一个 JSON 对象,其中包含:

      • access:false
      • message:"Payment required."
      • payment_url:指向 /process_payment_action 端点的 solana-action: URI,其中包含所需金额和资源 ID 作为查询参数(例如,solana-action:/process_payment_action?amount_sol=0.1&resource_id=resource_1)。
    3. 创建支付交易:

      • 客户端从上一个响应中提取 payment_url。此 URL 包含金额和资源 ID。
      • 客户端向 /process_payment_action 发送 POST 请求,并附上用户的公钥、amount_sol 和 resource_id。
      • 支付 API 会构建一笔从用户钱包直接向 PAYMENT_WALLET 转账 SOL 的未签名 Solana 交易。API 会以十六进制字符串的形式返回序列化后的未签名交易。
    4. 交易签名(客户端侧): 客户端(例如用户的钱包软件)必须使用用户的私钥为交易签名。此签名步骤对安全至关重要,且不由服务处理。

    5. 提交付款: 客户端将已签名的交易发送到 Solana 网络。可以使用 solana 命令行工具,或通过 solana-py 或 solders 等库以编程方式提交。

    6. 然后,客户端调用 MCP 服务上的 process_payment 工具,将交易签名(而非完整交易)作为 payment_transaction 参数传入,同时传入 amount_sol、client_ip 和 resource_id。服务会从区块链获取完整交易,并检查金额、收款地址等信息,以验证此签名。

    7. 重新检查访问权限: 确认付款后,客户端可以再次向 access://check 发送 MCP 请求。此时,如果付款已处理,服务应返回 {"access": true}。

代码结构

  • mcp_solana_internet/:
    • server.py: MCP 服务的主要实现。
    • payments.py: 用于处理支付交易创建的 Flask API。
    • utils.py:(当前为空)实用函数的占位文件。
    • tests/:
      • integration/: 服务的集成测试。
    • pyproject.toml: 项目元数据和依赖项(由 Poetry 管理)。
    • pytest.ini: pytest 的配置文件。
  • .gitignore: 指定要让 Git 忽略的文件和目录。
  • README.md: 此文件。

关键文件和函数说明

server.py
  • RPC_ENDPOINT: Solana RPC 端点 URL。
  • PAYMENT_WALLET: 表示接收付款的钱包的 Keypair 对象。
  • LAMPORTS_PER_SOL: SOL 与 Lamports(SOL 的最小单位)之间的换算系数。
  • get_resource_price(resource_id): 一个辅助函数,用于返回给定资源 ID 的价格(以 SOL 为单位)。这是一个占位符,应替换为更完善的定价机制(例如,从数据库或预言机获取价格)。
  • has_paid_for_access(user_pubkey, resource_id): 一个占位符函数,用于检查用户是否已支付资源访问费用。在实际应用中,这需要查询付款记录数据库。
  • @mcp.resource("access://check"): 用于检查访问权限的 MCP 资源处理程序。它接收用户的公钥和资源 ID 作为输入。
  • @mcp.tool(): 定义 process_payment 工具,用于验证用户付款交易的签名。
  • Flask Blueprint 集成: mcp.flask_app.register_blueprint(payments_blueprint) 将 Flask 付款 API 直接集成到 MCP 服务中。
payments.py
  • payment_app: 用于付款 API 的 Flask 应用(蓝图)。
  • /process_payment_action (GET): 一个返回描述付款操作的元数据的端点,符合 MCP 操作格式。
  • /process_payment_action (POST): 一个接收金额、资源 ID 和用户的公钥 作为输入的端点,并返回用于直接 SOL 转账的序列化、未签名 Solana 交易。
  • CORS 处理: 包含 CORS 标头,以允许来自不同源的请求(例如,基于 Web 的钱包)。
tests/integration/test_server.py
  • test_access_check_no_payment: 测试用户尚未付款时的 access://check 资源。
  • test_access_check_invalid_pubkey: 使用无效公钥测试 access://check 资源。
  • test_access_check_paid: 模拟已付款的用户(目前,has_paid_for_access 始终返回 False,因此此测试预期访问被拒绝)。

改进与后续工作

  • 数据库集成: 将占位函数 has_paid_for_access 替换为数据库查询,以存储和检索付款记录。具体包括:
    • 选择一个数据库(例如 PostgreSQL、MySQL 或 NoSQL 数据库)。
    • 创建一个表来存储付款信息(用户公钥、资源 ID、金额、时间戳、交易签名)。
    • 实现用于插入和查询付款记录的函数。
  • 稳健的交易验证: 增强 process_payment 工具,对付款交易进行更全面的验证,包括:
    • 检查是否存在双重支付。
    • 验证交易的近期区块哈希。
    • 检查其他可能存在的问题。
  • 错误处理: 改进整个代码中的错误处理,向客户端提供更具信息量的错误消息。
  • 安全性:
    • 为 PAYMENT_WALLET 实现安全的密钥管理方案。
    • 考虑在 payments.py API 中使用更安全的方式处理用户公钥(例如,要求用户提供签名消息)。
  • 异步操作: 使用异步数据库操作来提升性能。
  • 代币支付: 扩展系统,使其除 SOL 外,还支持使用 SPL 代币付款。
  • 订阅模式: 实现订阅模式,让用户可以付费定期访问资源。
  • 动态定价: 集成预言机或动态定价机制,以实时获取资源价格。
  • 更多测试: 添加更多单元测试和集成测试,以覆盖代码的所有方面。
  • 重构 process_payment: 将交易获取和验证逻辑从 MCP 工具中分离出来,该工具主要负责提供接口。

本 README 全面介绍了项目及其功能、安装说明、用法示例和潜在改进方向,旨在为有兴趣了解和扩展该项目的开发者提供有用的信息。对安全性的重视,以及对占位实现和可用于生产环境的解决方案的明确区分,也至关重要。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。