Solana AI Registries について
Solana AI Registries は、Solana 上で自律型 AI エージェントと MCP サーバーを登録、発見、管理するオンチェーンレジストリです。重要なデータをオンチェーンに保持し、ハッシュでオフチェーンメタデータを検証します。
主な機能
- 01エージェント情報の登録と更新
- 02MCP サーバー情報の登録と更新
- 03オンチェーンデータとオフチェーンメタデータの併用
- 04イベントによるオフチェーンインデックス作成
- 05所有者確認と入力検証
活用シーン
- 01自律型エージェントを登録してディレクトリで発見
- 02MCP サーバーとエンドポイントの登録
- 03レジストリイベントからオフチェーンインデックスを作成
MCP 対応
MCP Server Registry は MCP サーバーのディレクトリとして機能し、登録、更新、登録解除に対応します。MCP のツール、リソース、プロンプトの発見を支援します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Solana AI レジストリ
Solana ブロックチェーン上の自律型 AI エージェントおよび Model Context Protocol(MCP)サーバー向けの、包括的なオンチェーンレジストリシステムです。
🚀 Devnet で稼働中
エージェントレジストリ:BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr | エクスプローラー
MCP サーバーレジストリ:BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR | エクスプローラー
🌟 概要
Solana AI レジストリプロトコルは、自律型 AI エージェントおよび Model Context Protocol(MCP)サーバーの発見、検証、利用に不可欠なインフラストラクチャを提供します。この実装は、相互に連携する2つのオンチェーンレジストリで構成されています。
- エージェントレジストリ:Autonomous Economic Agent(AEA)および Agent-to-Agent(A2A)パラダイムに準拠する自律型エージェント向けの分散型ディレクトリです
- MCP サーバーレジストリ:Model Context Protocol に準拠したサーバー向けのディレクトリで、AI ツール、リソース、プロンプトの発見を可能にします
🏗️ アーキテクチャ
中核となる設計原則
- ハイブリッドストレージモデル:重要なデータはオンチェーンに保存し、詳細なメタデータは検証用ハッシュとともにオフチェーンに保存します
- イベント駆動型アーキテクチャ:オフチェーンでのインデックス作成とクエリに対応する包括的なイベントを提供します
- プロトコル準拠:A2A、AEA、MCP の仕様に準拠しています
- セキュリティ優先:所有権の検証と包括的な入力検証を行います
- スケーラビリティ:高スループットの発見とやり取りを想定して設計されています
主な機能
- ✅ A2A、AEA、MCP の仕様に100%準拠
- ✅ コスト効率の高いストレージと豊富なメタデータを実現するハイブリッドデータモデル
- ✅ セキュリティを重視した入力サニタイズによる包括的な検証
- ✅ 強力なオフチェーンインデックス機能を実現するイベントの発行
- ✅ 暗号学的検証を用いた所有者ベースのアクセス制御
- ✅ エッジケースを網羅した包括的なテストによる100%のテストカバレッジ
🚀 クイックスタート
前提条件
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install Solana CLI
curl --proto '=https' --tlsv1.2 -sSfL https://solana-install.solana.workers.dev | bash
# Set up Solana for local development
solana config set --url localhost
solana-test-validator
ビルド
# Clone the repository
git clone https://github.com/openSVM/aeamcp.git
cd aeamcp
# Build all programs
./scripts/build.sh
# Or build manually
cargo build --all
cargo test --all
テスト
# Run comprehensive test suite
cargo test --all
# Run specific registry tests
cargo test agent_registry_tests
cargo test mcp_server_registry_tests
# Run with verbose output
cargo test -- --nocapture
📋 プロジェクト構成
aeamcp/
├── programs/
│ ├── common/ # Shared utilities and types
│ ├── agent-registry/ # Agent Registry program
│ └── mcp-server-registry/ # MCP Server Registry program
├── tests/ # Integration tests
├── scripts/ # Build and deployment scripts
├── docs/ # Protocol documentation
└── README.md # This file
🔧 使用例
エージェントレジストリ
エージェントの登録
use solana_ai_registries_common::*;
use agent_registry::instruction::AgentRegistryInstruction;
// Create registration instruction
let instruction = AgentRegistryInstruction::RegisterAgent {
agent_id: "my-trading-agent".to_string(),
name: "Advanced Trading Agent".to_string(),
description: "AI agent for automated trading strategies".to_string(),
agent_version: "1.0.0".to_string(),
provider_name: Some("TradingCorp".to_string()),
provider_url: Some("https://tradingcorp.com".to_string()),
documentation_url: Some("https://docs.tradingcorp.com/agent".to_string()),
service_endpoints: vec![
ServiceEndpointInput {
protocol: "a2a_http_jsonrpc".to_string(),
url: "https://api.tradingcorp.com/agent".to_string(),
is_default: true,
}
],
capabilities_flags: 0x01, // Streaming support
supported_input_modes: vec!["application/json".to_string()],
supported_output_modes: vec!["application/json".to_string()],
skills: vec![
AgentSkillInput {
id: "market-analysis".to_string(),
name: "Market Analysis".to_string(),
description_hash: Some([0u8; 32]), // Hash of detailed description
tags: vec!["trading".to_string(), "analysis".to_string()],
}
],
security_info_uri: Some("https://tradingcorp.com/security".to_string()),
aea_address: None,
economic_intent_summary: Some("Maximize trading profits".to_string()),
supported_aea_protocols_hash: None,
extended_metadata_uri: Some("https://ipfs.io/ipfs/QmAgent...".to_string()),
tags: vec!["trading".to_string(), "defi".to_string()],
};
エージェントのステータス更新
let update_instruction = AgentRegistryInstruction::UpdateAgentStatus {
new_status: AgentStatus::Active as u8,
};
MCP サーバーレジストリ
MCP サーバーの登録
use mcp_server_registry::instruction::McpServerRegistryInstruction;
let instruction = McpServerRegistryInstruction::RegisterMcpServer {
server_id: "financial-data-server".to_string(),
name: "Financial Data MCP Server".to_string(),
server_version: "2.1.0".to_string(),
service_endpoint: "https://api.findata.com/mcp".to_string(),
documentation_url: Some("https://docs.findata.com".to_string()),
server_capabilities_summary: Some("Real-time financial data and analysis tools".to_string()),
supports_resources: true,
supports_tools: true,
supports_prompts: false,
onchain_tool_definitions: vec![
McpToolDefinitionOnChainInput {
name: "get-stock-price".to_string(),
description_hash: [1u8; 32],
input_schema_hash: [2u8; 32],
output_schema_hash: [3u8; 32],
tags: vec!["stocks".to_string(), "price".to_string()],
}
],
onchain_resource_definitions: vec![
McpResourceDefinitionOnChainInput {
uri_pattern: "stock://symbol/*".to_string(),
description_hash: [4u8; 32],
tags: vec!["stocks".to_string()],
}
],
onchain_prompt_definitions: vec![],
full_capabilities_uri: Some("https://ipfs.io/ipfs/QmServer...".to_string()),
tags: vec!["finance".to_string(), "data".to_string()],
};
🔍 発見とクエリ
直接検索
// Derive PDA for direct agent lookup
let (agent_pda, _) = Pubkey::find_program_address(
&[AGENT_REGISTRY_PDA_SEED, "my-agent-id".as_bytes()],
&agent_registry::id(),
);
// Fetch agent data
let agent_data = client.get_account_data(&agent_pda)?;
let agent_entry = AgentRegistryEntryV1::try_from_slice(&agent_data)?;
イベントベースのインデックス作成
// Listen for agent registration events
client.on_logs_subscribe(
RpcTransactionLogsFilter::Mentions(vec![agent_registry::id().to_string()]),
RpcTransactionLogsConfig {
commitment: Some(CommitmentConfig::confirmed()),
},
)?;
// Process events for off-chain indexing
for log in logs {
if log.contains("AgentRegistered") {
// Parse and index agent data
let event: AgentRegistered = parse_event(&log)?;
index_agent(event).await?;
}
}
🛡️ セキュリティ機能
アクセス制御
- 所有者の権限:レジストリエントリを変更できるのは所有者のみです
- 署名の検証:すべての変更に有効な署名が必要です
- PDA ベースのセキュリティ:プログラム制御アカウントにより、不正アクセスを防止します
入力検証
- 長さの制約:すべての文字列について、最大長に照らして検証します
- 形式の検証:URL、ID、その他のフィールドについて、適切な形式であることを検証します
- 境界チェック:配列の長さと数値が制限内であることを確認します
データの整合性
- ハッシュの検証:オンチェーンハッシュを使用してオフチェーンのコンテンツを検証します
- 変更不可能な履歴:登録タイムスタンプと所有権の記録を保持します
- レンタル保護:アカウントをレンタル回収から保護します
📊 パフォーマンス特性
アカウントサイズ
- エージェントレジストリエントリ:約2.5KB(レンタル免除に最適化)
- MCP サーバーレジストリエントリ:約2.2KB(レンタル免除に最適化)
操作コスト
- 登録:約0.02 SOL(レンタル免除+トランザクション手数料)
- 更新:約0.001 SOL(トランザクション手数料のみ)
- クエリ:無料(読み取り専用操作)
スケーラビリティ
- スループット:Solana ネットワークの処理能力(約 65,000 TPS)のみが上限です
- ストレージ:エントリー数に上限はありません(グローバル状態による制限なし)
- インデックス作成:イベント駆動型のオフチェーンスケーリング
🧪 テスト
テストカバレッジ
- ✅ 命令カバレッジ 100%:すべてのプログラム命令をテスト済みです
- ✅ エッジケーステスト:境界条件とエラーシナリオをテストします
- ✅ セキュリティテスト:認可と検証をテストします
- ✅ 統合テスト:ワークフロー全体をエンドツーエンドでテストします
テストの実行
# Run all tests
cargo test --all
# Run with coverage
cargo test --all -- --test-threads=1
# Run specific test categories
cargo test validation_tests
cargo test authorization_tests
cargo test integration_tests
🚀 デプロイ
ローカル開発
# Start local validator
solana-test-validator
# Deploy programs
./scripts/deploy-devnet.sh
Devnet へのデプロイ
# Configure for devnet
solana config set --url devnet
# Deploy with verification
./scripts/deploy-devnet.sh
./scripts/verify.sh
🌐 Devnet へのライブデプロイ
Solana AI Registries は現在、Solana Devnet にデプロイされ、稼働中です。
プログラムアドレス
- Agent Registry:
BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr - MCP Server Registry:
BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR
エクスプローラーのリンク
クエリの例
Solana CLI を使用する場合
# Configure for devnet
solana config set --url devnet
# Query Agent Registry program info
solana program show BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr
# Query MCP Server Registry program info
solana program show BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR
# List all agent accounts (requires custom RPC call)
solana account BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr --output json
# List all MCP server accounts (requires custom RPC call)
solana account BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR --output json
JavaScript/TypeScript を使用する場合
import { Connection, PublicKey } from '@solana/web3.js';
const connection = new Connection('https://api.devnet.solana.com');
// Program addresses
const AGENT_REGISTRY_PROGRAM_ID = new PublicKey('BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr');
const MCP_REGISTRY_PROGRAM_ID = new PublicKey('BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR');
// Query all agent accounts
async function getAllAgents() {
const accounts = await connection.getProgramAccounts(AGENT_REGISTRY_PROGRAM_ID);
return accounts.map(account => ({
pubkey: account.pubkey.toString(),
data: account.account.data,
owner: account.account.owner.toString()
}));
}
// Query all MCP server accounts
async function getAllMcpServers() {
const accounts = await connection.getProgramAccounts(MCP_REGISTRY_PROGRAM_ID);
return accounts.map(account => ({
pubkey: account.pubkey.toString(),
data: account.account.data,
owner: account.account.owner.toString()
}));
}
// Query specific agent by PDA
async function getAgentByOwner(ownerPubkey: PublicKey) {
const [agentPda] = PublicKey.findProgramAddressSync(
[Buffer.from("agent"), ownerPubkey.toBuffer()],
AGENT_REGISTRY_PROGRAM_ID
);
const accountInfo = await connection.getAccountInfo(agentPda);
return accountInfo;
}
// Query specific MCP server by PDA
async function getMcpServerByOwner(ownerPubkey: PublicKey) {
const [serverPda] = PublicKey.findProgramAddressSync(
[Buffer.from("mcp_server"), ownerPubkey.toBuffer()],
MCP_REGISTRY_PROGRAM_ID
);
const accountInfo = await connection.getAccountInfo(serverPda);
return accountInfo;
}
Python を使用する場合
from solana.rpc.api import Client
from solana.publickey import PublicKey
# Connect to devnet
client = Client("https://api.devnet.solana.com")
# Program addresses
AGENT_REGISTRY_PROGRAM_ID = PublicKey("BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr")
MCP_REGISTRY_PROGRAM_ID = PublicKey("BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR")
# Query all agent accounts
def get_all_agents():
response = client.get_program_accounts(AGENT_REGISTRY_PROGRAM_ID)
return response
# Query all MCP server accounts
def get_all_mcp_servers():
response = client.get_program_accounts(MCP_REGISTRY_PROGRAM_ID)
return response
# Query specific account
def get_account_info(pubkey_str):
pubkey = PublicKey(pubkey_str)
response = client.get_account_info(pubkey)
return response
Rust を使用する場合
use solana_client::rpc_client::RpcClient;
use solana_sdk::pubkey::Pubkey;
use std::str::FromStr;
// Connect to devnet
let rpc_client = RpcClient::new("https://api.devnet.solana.com");
// Program addresses
let agent_registry_program_id = Pubkey::from_str("BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr").unwrap();
let mcp_registry_program_id = Pubkey::from_str("BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR").unwrap();
// Query all agent accounts
let agent_accounts = rpc_client.get_program_accounts(&agent_registry_program_id)?;
// Query all MCP server accounts
let mcp_accounts = rpc_client.get_program_accounts(&mcp_registry_program_id)?;
// Query specific account
let account_info = rpc_client.get_account(&some_pubkey)?;
Mainnet へのデプロイ
# Configure for mainnet
solana config set --url mainnet-beta
# Deploy (requires security audit)
./scripts/deploy-mainnet.sh
📚 API リファレンス
Agent Registry の命令
RegisterAgent:新しいエージェントエントリーを作成しますUpdateAgentDetails:エージェント情報を変更しますUpdateAgentStatus:エージェントの稼働状態を変更しますDeregisterAgent:エージェントを登録解除済みとしてマークします
MCP Server Registry の命令
RegisterMcpServer:新しい MCP サーバーエントリーを作成しますUpdateMcpServerDetails:サーバー情報を変更しますUpdateMcpServerStatus:サーバーの稼働状態を変更しますDeregisterMcpServer:サーバーを登録解除済みとしてマークします
イベント
Agent Registry のイベント
AgentRegistered:新しいエージェントの登録AgentUpdated:エージェントの詳細を変更AgentStatusChanged:エージェントの状態を更新AgentDeregistered:エージェントを削除
MCP Server Registry のイベント
McpServerRegistered:新しいサーバーの登録McpServerUpdated:サーバーの詳細を変更McpServerStatusChanged:サーバーの状態を更新McpServerDeregistered:サーバーを削除
🛠️ 開発
コントリビューション
- リポジトリをフォークします
- 機能ブランチを作成します:
git checkout -b feature/amazing-feature - 包括的なテストを追加して変更を加えます
- テストスイートを実行します:
cargo test --all - 詳細な説明を添えてプルリクエストを送信します
コード規約
- フォーマット:一貫したコードフォーマットを適用するため、
cargo fmtを使用します - リンティング:
cargo clippyの警告をすべて解消します - ドキュメント:包括的なインラインドキュメントを含めます
- テスト:新機能のテストカバレッジを 100% に維持します
開発ツール
# Format code
cargo fmt --all
# Run linter
cargo clippy --all -- -D warnings
# Generate documentation
cargo doc --all --no-deps --open
# Security audit (requires cargo-audit)
cargo audit
🔮 ロードマップ
フェーズ 1:エコシステムツール(2024年第2四半期)
- TypeScript/JavaScript SDK
- Python SDK
- レジストリ操作用の CLI ツール
- レジストリを閲覧するためのウェブダッシュボード
フェーズ 2:高度な機能(2024年第3四半期)
- オフチェーンインデクサーのリファレンス実装
- 複雑なクエリに対応する GraphQL API
- 評判および証明システム
- クロスチェーンの検出メカニズム
フェーズ 3:エンタープライズ機能(2024年第4四半期)
- 高度な分析とメトリクス
- エンタープライズ管理ツール
- SLA の監視とアラート
- プロフェッショナルサポートサービス
📄 ライセンス
このプロジェクトは MIT License の下でライセンスされています。詳細については、LICENSE ファイルを参照してください。
🤝 コミュニティ
- GitHub:openSVM/aeamcp
- ドキュメント:プロトコル仕様
- 課題:GitHub Issues
- ディスカッション:GitHub Discussions
🙏 謝辞
- Solana Foundation 堅牢なブロックチェーンインフラストラクチャを提供してくださったことに感謝します
- Google A2A Team エージェント間プロトコルの仕様を提供してくださったことに感謝します
- Fetch.ai 自律型経済エージェントのフレームワークを提供してくださったことに感謝します
- Anthropic Model Context Protocol の仕様を提供してくださったことに感謝します
- オープンソースコミュニティ ツール、ライブラリ、そしてインスピレーションを提供してくださったことに感謝します
📈 ステータス
現在のステータス:🎉 コア実装完了
Solana AI Registries の実装は本番環境に対応しており、以下を備えています:
- ✅ プロトコルへの完全準拠(A2A、AEA、MCP)
- ✅ テストカバレッジ100%
- ✅ 包括的なセキュリティ検証
- ✅ エコシステム開発に向けたイベント駆動型アーキテクチャ
- ✅ 最適化されたパフォーマンスとスケーラビリティ
エコシステム開発、クライアント SDK の作成、本番環境へのデプロイにすぐに取り組めます!
Solana AI エコシステムのために ❤️ を込めて開発
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。