MCP Solana Internet: Direct SOL Payments for Content Access について
Solana決済をデジタルコンテンツのアクセス制御に組み込む、概念実証のMCPサーバーです。有料リソースの仕組みを構築する開発者向けで、アクセス確認、未署名SOL送金トランザクションの作成、オンチェーン検証を行います。アクセス記録の照会は現状プレースホルダーです。
主な機能
- 01リソースへのアクセス確認
- 02未署名SOL送金トランザクションの作成
- 03署名済みトランザクションの検証
- 04Flask決済APIの統合
- 05Solana記録による決済確認
活用シーン
- 01デジタルリソースにSOL決済を要求
- 02決済前後のリソースアクセス確認
MCP 対応
MCPクライアントに `access://check` リソースと `process_payment` ツールを公開します。クライアントはアクセス確認、トランザクション署名の送信、決済後の再確認を行えます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP Solana Internet:コンテンツアクセスのためのSOL直接決済
このプロジェクトでは、Solana ブロックチェーンと連携して、SOL の直接決済によるデジタルコンテンツやリソースへの有料アクセスを可能にする MCP サーバーの概念実証実装を紹介します。MCP とブロックチェーンを組み合わせて、分散型でパーミッションレスなアクセス制御システムを構築する方法を示します。
概要
このプロジェクトは、主に次の2つのコンポーネントで構成されています。
- MCP サーバー(
server.py):fastmcpライブラリを使用して構築された中核となる MCP サーバーです。MCP リクエストを処理し、リソースへのアクセスを管理して、Solana ブロックチェーンと連携します。 - 決済 API(
payments.py): 決済トランザクションの作成を処理する Flask ベースの API です。デプロイと連携を簡素化するため、Flask ブループリントを使用して MCP サーバー自体に統合されています。このアプローチにより、MCP 仕様で説明されている「solana-action:」URI を簡単に作成できます。
サーバーは、ユーザーが指定されたリソースへのアクセス料金を支払ったかどうかを確認する MCP リソース(access://check)を公開します。支払いが必要な場合は、MCP クライアントが決済トランザクションを開始するために使用できる solana-action: URL を返します。process_payment ツールを使用すると、MCP クライアントは署名済みの Solana トランザクションを送信して、支払いを完了できます。
特長
- SOL による直接決済: ユーザーはリソースにアクセスするために SOL で直接支払うため、仲介者が不要です。
- 分散型アクセス制御: Solana ブロックチェーンが、支払いの検証に使用する透明で改ざん不可能な台帳として機能します。
- MCP との統合: MCP を活用して、標準化されたリソースアクセスリクエストと決済開始を実現します。
- Flask ベースの決済 API: 署名前の Solana 決済トランザクションを生成するための、シンプルで明確に定義された API を提供します。
- 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 Test Validator を起動します(ローカルテスト用):
solana-test-validatorこれにより、テストに使用できるローカル Solana クラスターが起動します。
-
MCP サーバーを起動します:
poetry run python mcp_solana_internet/server.pyサーバーは
stdinとstdout(stdio トランスポート)で MCP リクエストを待ち受けます。また、ポート 5001 で Flask 決済 API も起動します。 -
サーバーとのやり取り(概念例):
MCP クライアントは、次のようにサーバーとやり取りします。
-
アクセスを確認: クライアントは、ユーザーの公開鍵とリソース ID を指定して、
access://checkに MCP リクエストを送信します。 -
決済が必要な場合: ユーザーがまだ支払いを済ませていない場合、サーバーは次の内容を含む JSON オブジェクトを返します。
access:falsemessage: "支払いが必要です。"payment_url: 必要な金額とリソース ID をクエリパラメーターとして含み、/process_payment_actionエンドポイントを指すsolana-action:URI(例:solana-action:/process_payment_action?amount_sol=0.1&resource_id=resource_1)。
-
決済トランザクションの作成:
- クライアントは、前のレスポンスから
payment_urlを取得します。この URL には金額と resource_id が含まれています。 - クライアントは、ユーザーの公開鍵、
amount_sol、resource_idを含めて、/process_payment_actionにPOSTリクエストを送信します。 - 決済 API は、ユーザーのウォレットから
PAYMENT_WALLETへの SOL の直接送金を行う未署名の Solana トランザクションを構築します。API は、シリアライズされた未署名トランザクションを 16 進数文字列として返します。
- クライアントは、前のレスポンスから
-
トランザクションへの署名(クライアント側): クライアント(例:ユーザーのウォレットソフトウェア)は、ユーザーの秘密鍵を使ってトランザクションに署名する必要があります。この署名手順はセキュリティ上重要であり、サーバーでは処理されません。
-
支払いを送信: クライアントは、署名済みトランザクションを Solana ネットワークに送信します。これは
solanacli ツール、または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 ブループリントの統合:
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 を送金するためのシリアライズ済みの未署名トランザクションを返すエンドポイントです。- 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.pyAPI でユーザーの公開鍵を扱う際に、より安全な方法(ユーザーからの署名済みメッセージを必須にするなど)を検討します。
- 非同期処理: パフォーマンスを向上させるため、非同期のデータベース操作を使用します。
- トークンによる支払い: SOL に加えて、SPL トークンによる支払いにも対応できるようシステムを拡張します。
- サブスクリプションモデル: ユーザーがリソースへの継続的なアクセスに対して定期的に支払うサブスクリプションモデルを実装します。
- 動的価格設定: オラクルまたは動的価格設定の仕組みと連携し、リソースの価格をリアルタイムで取得します。
- テストの追加: コードのあらゆる側面を網羅する単体テストと統合テストを追加します。
process_paymentのリファクタリング: 主にインターフェースとして機能する MCP ツールから、トランザクションの取得と検証を分離します。
この README では、プロジェクトの概要、機能、インストール手順、使用例、改善の可能性を包括的に説明しています。プロジェクトの理解と拡張に関心のある開発者に、有益で役立つ情報を提供することを目指しています。セキュリティを重視している点と、プレースホルダーの実装と本番環境で使用可能なソリューションを明確に区別している点も重要です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。