MCP Solana互联网:内容访问的直接SOL支付
该项目展示了MCP服务器的概念验证实现,该服务器与Solana区块链集成,使用直接SOL支付实现对数字内容和资源的付费访问。它展示了MCP如何与区块链相结合,以创建去中心化、无需许可的访问控制系统。
概述
该项目由两个主要部分组成:
- MCP服务器(
server.py): 这是核心MCP服务器,使用fastmcp图书馆。它处理MCP请求,管理资源访问,并与Solana区块链交互。 - 支付API(
payments.py): 一个基于Flask的API,用于处理支付交易的创建。这是集成的 *在...之内* MCP服务器本身(使用Flask蓝图),简化了部署和交互。这种方法使得创建“solana action:”URI变得容易,如MCP规范中所述。
服务器公开MCP资源(access://check)它检查用户是否已为访问给定资源付费。如果需要付款,它将返回 solana-action: MCP客户端可用于发起支付交易的URL。这 process_payment 该工具允许MCP客户端提交签名的Solana交易,完成支付。
特性
- 直接SOL付款: 用户直接在SOL中付费以访问资源,消除了中介。
- 去中心化访问控制: Solana区块链作为一个透明且不可变的账本,用于支付验证。
- MCP集成: 利用MCP进行标准化的资源访问请求和支付启动。
- 基于薄片的支付API: 提供一个简单且定义良好的API,用于生成未签名的索拉纳支付交易。
- 索拉纳互动: 使用
solders库,用于与Solana区块链进行高效和习惯性的交互。 - 测试覆盖范围: 包括使用以下工具的集成测试
pytest和pytest-asyncio以验证基本功能。 - 可扩展设计: 为在Solana和MCP上构建更复杂的付费内容系统奠定了基础。
安装
- 先决条件:
- Python 3.11+ - 诗歌 (用于依赖关系管理) - Solana命令行界面 (1.16或更高版本) - solana-test-validator (用于本地测试)
- 克隆存储库:
git clone
cd mcp-solana-internet- 安装依赖关系:
poetry install- 环境设置:
- 创建一个 .env 文件在 mcp_solana_internet 目录:
touch mcp_solana_internet/.env- 编辑 .env 文件并设置以下变量:
RPC_ENDPOINT="http://localhost:8899" # Or your Solana cluster endpoint
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"
# ^^^ **IMPORTANT:** This is a placeholder for demonstration purposes ONLY.
# In a production environment, you MUST use a secure key management solution
# (e.g., AWS KMS, HashiCorp Vault, or a hardware wallet). Never store private
# keys or seeds directly in code or configuration files. This seed generates
# the wallet address.- RPC_ENDPOINT:Solana RPC终结点的URL。对于本地开发,您可以使用 http://localhost:8899 如果你在跑步 solana-test-validator。要针对devnet进行测试,请使用 https://api.devnet.solana.com. - PAYMENT_WALLET_SEED:一个逗号分隔的32个整数列表,表示支付钱包的种子。这个钱包会 *接收* SOL付款。 同样,这是不安全的,仅供演示。
用法
- 启动Solana测试验证器(用于本地测试):
solana-test-validator这将启动一个可用于测试的本地Solana集群。
- 启动MCP服务器:
poetry run python mcp_solana_internet/server.py服务器将开始监听MCP请求 stdin 和 stdout (stdio传输)。它还在端口5001上启动Flask支付API。
- 与服务器交互(概念示例):
MCP客户端将按如下方式与服务器交互:
1. 检查访问权限: 客户端向发送MCP请求 access://check 使用用户的公钥和资源ID。
1. 所需付款: 如果用户没有付款,服务器会返回一个JSON对象,其中包含:
- access: false - message:“需要付款。” - payment_urlA. solana-action: 指向的URI /process_payment_action 端点,包括所需金额和资源ID作为查询参数(例如。, solana-action:/process_payment_action?amount_sol=0.1&resource_id=resource_1).
1. 付款交易创建:
- 客户端提取 payment_url 根据之前的回复。此url包括金额和resource_id。 - 客户做了一个 POST ……的请求 /process_payment_action 包括用户的公钥, amount_sol 和 resource_id. - 支付API构建 *无符号* Solana交易,用于从用户钱包直接将SOL转账到 PAYMENT_WALLET.API以十六进制字符串的形式返回序列化的未签名事务。
1. 交易签署(客户端): 客户端(例如,用户的钱包软件) *必须* 使用用户的私钥对交易进行签名。 *此签名步骤对于安全性至关重要,不由服务器处理。*
1. 提交付款: 客户端发送 *已签署* 交易到Solana网络。这可以通过以下方式实现 solana cli工具,或通过库编程,如 solana-py 或 solders.
1. 然后客户端调用 process_payment *工具* 在MCP服务器上传递事务 *签名* (不是全部交易)作为 payment_transaction 参数,以及 amount_sol, client_ip 和 resource_id服务器通过从区块链检索完整交易、检查金额、目的地等来验证此签名。
1. 重新检查访问权限: 确认付款后,客户可以再次向发送MCP请求 access://check。这一次,如果支付已处理,服务器应响应 {"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为单位)。这是一个 *占位符* 并且应该被更稳健的定价机制(例如从数据库或oracle获取价格)所取代。has_paid_for_access(user_pubkey, resource_id): A. *占位符* 检查用户是否已为访问资源付费的函数。在实际应用中,这将涉及查询支付记录数据库。@mcp.resource("access://check"): 用于检查访问的MCP资源处理程序。它将用户的公钥和资源ID作为输入。@mcp.tool(): 定义process_payment验证用户支付交易签名的工具。- Flask蓝图集成:
mcp.flask_app.register_blueprint(payments_blueprint)将Flask支付API直接集成到MCP服务器中。
payments.py
payment_app: 支付API的Flask应用程序(蓝图)。/process_payment_action(获取): 一个端点,返回描述支付操作的元数据,符合MCP操作格式。/process_payment_action(职位): 获取金额、资源ID和资源ID的端点, *以及用户的公钥* 并返回序列化的, *无符号* Solana交易用于直接SOL转账。- CORS处理: 包括CORS标头,以允许来自不同来源的请求(例如,基于网络的钱包)。
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代币支付。
- 订阅模式: 实施订阅模式,用户可以为资源的定期访问付费。
- 动态定价: 与oracle或动态定价机制集成,实时获取资源价格。
- 更多测试: 添加更多的单元和集成测试,以涵盖代码的各个方面。
- 重构流程_付款: 将事务获取和验证与MCP工具分开,MCP工具主要是一个接口。
此README提供了该项目、其功能、安装说明、使用示例和潜在改进的全面概述。它旨在为有兴趣理解和扩展项目的开发人员提供信息和帮助。对安全性的强调以及占位符实现和生产就绪解决方案之间的明确区别也至关重要。

