关于 Solana AI Registries
Solana AI Registries 是部署在 Solana 上的链上注册系统,用于登记、查找和管理自主 AI Agent 与 MCP 服务。它将关键数据存储在链上,并通过哈希验证链下元数据。
主要功能
- 01登记和更新 Agent 信息
- 02登记和更新 MCP 服务信息
- 03链上数据与链下元数据结合
- 04通过事件支持链下索引
- 05所有者验证和输入校验
适用场景
- 01发布自主 Agent 供目录发现
- 02登记 MCP 服务及其端点
- 03监听注册事件构建链下索引
MCP 相关
MCP Server Registry 提供 MCP 服务目录,可登记、更新和注销服务,并支持发现 MCP 工具、资源与提示词。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Solana AI Registries
Solana 区块链上的综合链上注册系统,适用于自主 AI Agent 和 Model Context Protocol(MCP)服务。
🚀 已在 Devnet 上线
Agent Registry:BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr | 浏览器
MCP Server Registry:BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR | 浏览器
🌟 概述
Solana AI Registries 协议为发现、验证和使用自主 AI Agent 与 Model Context Protocol(MCP)服务提供必要的基础设施。此实现由两个互联的链上注册表组成:
- Agent Registry:面向遵循自主经济 Agent(AEA)和 Agent-to-Agent(A2A)范式的自主 Agent 的去中心化目录
- MCP Server Registry:面向符合 Model Context Protocol 规范的服务的目录,用于发现 AI 工具、资源和提示词
🏗️ 架构
核心设计原则
- 混合存储模型:关键数据存储在链上,详细元数据存储在链下,并通过哈希进行验证
- 事件驱动架构:提供全面的事件,支持链下索引和查询
- 协议合规性:遵循 A2A、AEA 和 MCP 规范
- 安全优先:验证所有权并全面校验输入
- 可扩展性:针对高吞吐量的发现和交互场景设计
主要功能
- ✅ 100% 符合协议规范,符合 A2A、AEA 和 MCP 规范
- ✅ 混合数据模型,实现经济高效的存储并支持丰富的元数据
- ✅ 全面验证,采用以安全为重点的输入清理机制
- ✅ 事件发出,支持强大的链下索引能力
- ✅ 基于所有者的访问控制,并通过加密方式验证
- ✅ 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
🔧 使用示例
Agent Registry
注册 Agent
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()],
};
更新 Agent 状态
let update_instruction = AgentRegistryInstruction::UpdateAgentStatus {
new_status: AgentStatus::Active as u8,
};
MCP Server Registry
注册 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 和其他字段的格式是否正确
- 边界检查:检查数组长度和数值是否超出限制
数据完整性
- 哈希验证:使用链上哈希验证链下内容
- 不可变历史记录:保留注册时间戳和所有权记录
- 租金保护:保护账户免受租金扣除
📊 性能特征
账户大小
- Agent Registry 条目:约 2.5KB(针对免租金优化)
- MCP Server Registry 条目:约 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 注册表:
BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr - MCP 服务注册表:
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 注册表指令
RegisterAgent:创建新的 Agent 条目UpdateAgentDetails:修改 Agent 信息UpdateAgentStatus:更改 Agent 运行状态DeregisterAgent:将 Agent 标记为已注销
MCP 服务注册表指令
RegisterMcpServer:创建新的 MCP 服务条目UpdateMcpServerDetails:修改服务信息UpdateMcpServerStatus:更改服务运行状态DeregisterMcpServer:将服务标记为已注销
事件
Agent 注册表事件
AgentRegistered:注册了新的 AgentAgentUpdated:已修改 Agent 详细信息AgentStatusChanged:已更新 Agent 状态AgentDeregistered:已移除 Agent
MCP 服务注册表事件
McpServerRegistered:注册了新的服务McpServerUpdated:已修改服务详细信息McpServerStatusChanged:已更新服务状态McpServerDeregistered:已移除服务
🛠️ 开发
贡献
- Fork 此仓库
- 创建功能分支:
git checkout -b feature/amazing-feature - 进行更改并编写全面的测试
- 运行测试套件:
cargo test --all - 提交 pull request,并附上详细说明
代码规范
- 格式化:使用
cargo fmt统一代码格式 - Lint 检查:处理所有
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 年第二季度)
- TypeScript/JavaScript SDK
- Python SDK
- 用于与注册表交互的 CLI 工具
- 用于浏览注册表的 Web 仪表板
阶段 2:高级功能(2024 年第三季度)
- 链下索引器参考实现
- 用于复杂查询的 GraphQL API
- 声誉和证明系统
- 跨链发现机制
阶段 3:企业功能(2024 年第四季度)
- 高级分析和指标
- 企业管理工具
- SLA 监控和告警
- 专业支持服务
📄 许可证
本项目采用 MIT License 许可,详情请参阅 LICENSE 文件。
🤝 社区
- GitHub:openSVM/aeamcp
- 文档:协议规范
- 问题反馈:GitHub Issues
- 讨论:GitHub Discussions
🙏 致谢
- Solana Foundation:感谢其提供稳健的区块链基础设施
- Google A2A Team:感谢其制定 Agent-to-Agent 协议规范
- Fetch.ai:感谢其提供自主经济 Agent 框架
- Anthropic:感谢其制定 Model Context Protocol 规范
- Open Source Community:感谢其提供工具、库和灵感
📈 状态
当前状态:🎉 核心实现已完成
Solana AI Registries 的实现已达到生产就绪状态,具备:
- ✅ 完全符合协议规范(A2A、AEA、MCP)
- ✅ 100% 测试覆盖率
- ✅ 全面的安全验证
- ✅ 面向生态系统开发的事件驱动架构
- ✅ 优化的性能和可扩展性
已准备好开展生态系统开发、创建客户端 SDK 并进行生产部署!
倾注 ❤️,为 Solana AI 生态系统打造
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。