关于 MCP Solana Internet: Direct SOL Payments for Content Access
这是一个将 Solana 直接支付接入数字内容访问控制的 MCP 服务概念验证,面向构建付费资源流程的开发者。它提供访问检查、未签名 SOL 转账交易生成及链上交易验证;访问记录检查目前仍是占位实现。
主要功能
- 01通过资源检查访问权限
- 02生成未签名 SOL 转账交易
- 03验证已签名交易
- 04Flask 支付 API 集成
- 05基于 Solana 记录验证支付
适用场景
- 01为数字资源设置 SOL 付费访问
- 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 上构建更复杂的付费内容系统提供基础。
安装
-
先决条件:
- Python 3.11+
- Poetry(用于依赖管理)
- Solana CLI(版本 1.16 或更高)
solana-test-validator(用于本地测试)
-
克隆代码库:
git clone <repository_url> cd mcp-solana-internet -
安装依赖:
poetry install -
环境设置:
-
在
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 付款。再次提醒:这种做法不安全,仅用于演示。
-
使用方法
-
启动 Solana 测试验证器(用于本地测试):
solana-test-validator这会启动一个可供测试使用的本地 Solana 集群。
-
启动 MCP 服务:
poetry run python mcp_solana_internet/server.py服务将开始通过
stdin和stdout监听 MCP 请求(stdio 传输)。它还会在端口 5001 上启动 Flask 支付 API。 -
与服务交互(概念示例):
MCP 客户端可以按以下方式与服务交互:
-
检查访问权限: 客户端向
access://check发送 MCP 请求,并附上用户的公钥和资源 ID。 -
需要付款: 如果用户尚未付款,服务会返回一个 JSON 对象,其中包含:
access:falsemessage:"Payment required."payment_url:指向/process_payment_action端点的solana-action:URI,其中包含所需金额和资源 ID 作为查询参数(例如,solana-action:/process_payment_action?amount_sol=0.1&resource_id=resource_1)。
-
创建支付交易:
- 客户端从上一个响应中提取
payment_url。此 URL 包含金额和资源 ID。 - 客户端向
/process_payment_action发送POST请求,并附上用户的公钥、amount_sol和resource_id。 - 支付 API 会构建一笔从用户钱包直接向
PAYMENT_WALLET转账 SOL 的未签名 Solana 交易。API 会以十六进制字符串的形式返回序列化后的未签名交易。
- 客户端从上一个响应中提取
-
交易签名(客户端侧): 客户端(例如用户的钱包软件)必须使用用户的私钥为交易签名。此签名步骤对安全至关重要,且不由服务处理。
-
提交付款: 客户端将已签名的交易发送到 Solana 网络。可以使用
solana命令行工具,或通过solana-py或solders等库以编程方式提交。 -
然后,客户端调用 MCP 服务上的
process_payment工具,将交易签名(而非完整交易)作为payment_transaction参数传入,同时传入amount_sol、client_ip和resource_id。服务会从区块链获取完整交易,并检查金额、收款地址等信息,以验证此签名。 -
重新检查访问权限: 确认付款后,客户端可以再次向
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.pyAPI 中使用更安全的方式处理用户公钥(例如,要求用户提供签名消息)。
- 为
- 异步操作: 使用异步数据库操作来提升性能。
- 代币支付: 扩展系统,使其除 SOL 外,还支持使用 SPL 代币付款。
- 订阅模式: 实现订阅模式,让用户可以付费定期访问资源。
- 动态定价: 集成预言机或动态定价机制,以实时获取资源价格。
- 更多测试: 添加更多单元测试和集成测试,以覆盖代码的所有方面。
- 重构 process_payment: 将交易获取和验证逻辑从 MCP 工具中分离出来,该工具主要负责提供接口。
本 README 全面介绍了项目及其功能、安装说明、用法示例和潜在改进方向,旨在为有兴趣了解和扩展该项目的开发者提供有用的信息。对安全性的重视,以及对占位实现和可用于生产环境的解决方案的明确区分,也至关重要。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。