mcpField
S
Solana AI Registries

Solana AI Registries

本地服务
aeamcp.comAI 与智能体1251 周前更新

关于 Solana AI Registries

Solana AI Registries 是部署在 Solana 上的链上注册系统,用于登记、查找和管理自主 AI Agent 与 MCP 服务。它将关键数据存储在链上,并通过哈希验证链下元数据。

主要功能

  1. 01登记和更新 Agent 信息
  2. 02登记和更新 MCP 服务信息
  3. 03链上数据与链下元数据结合
  4. 04通过事件支持链下索引
  5. 05所有者验证和输入校验

适用场景

  1. 01发布自主 Agent 供目录发现
  2. 02登记 MCP 服务及其端点
  3. 03监听注册事件构建链下索引

MCP 相关

MCP Server Registry 提供 MCP 服务目录,可登记、更新和注销服务,并支持发现 MCP 工具、资源与提示词。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Solana AI Registries

Solana 区块链上的综合链上注册系统,适用于自主 AI Agent 和 Model Context Protocol(MCP)服务。

Build Status Test Coverage License Solana

🚀 已在 Devnet 上线

Agent Registry:BruRLHGfNaf6C5HKUqFu6md5ePJNELafm1vZdhctPkpr | 浏览器 MCP Server Registry:BCBVehUHR3yhbDbvhV3QHS3s27k3LTbpX5CrXQ2sR2SR | 浏览器

🌟 概述

Solana AI Registries 协议为发现、验证和使用自主 AI Agent 与 Model Context Protocol(MCP)服务提供必要的基础设施。此实现由两个互联的链上注册表组成:

  1. Agent Registry:面向遵循自主经济 Agent(AEA)和 Agent-to-Agent(A2A)范式的自主 Agent 的去中心化目录
  2. 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:注册了新的 Agent
  • AgentUpdated:已修改 Agent 详细信息
  • AgentStatusChanged:已更新 Agent 状态
  • AgentDeregistered:已移除 Agent
MCP 服务注册表事件
  • McpServerRegistered:注册了新的服务
  • McpServerUpdated:已修改服务详细信息
  • McpServerStatusChanged:已更新服务状态
  • McpServerDeregistered:已移除服务

🛠️ 开发

贡献
  1. Fork 此仓库
  2. 创建功能分支:git checkout -b feature/amazing-feature
  3. 进行更改并编写全面的测试
  4. 运行测试套件:cargo test --all
  5. 提交 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 文件。

🤝 社区

🙏 致谢

  • 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 生态系统打造

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。