Solana程序链上接口发现工具

mcpsol为Solana程序实现了模型上下文协议(MCP),作为原生通信层,支持运行时接口发现和标准化JSON格式输出。

  • by slonana-labs
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 slonana-labs/mcpsol

使用说明

麦普索

Solana程序的链上接口发现。

概述

mcpsol实现了模型上下文协议(MCP)作为SVM程序的本地通信层。程序通过标准化的 list_tools 通过Solana返回紧凑JSON模式的指令 set_return_data 系统调用。

这使得运行时接口发现无需外部依赖:

  • 模式被编译成程序二进制文件(无版本漂移)
  • 通过模拟交易发现(无需文件托管)
  • 跨所有框架的标准化JSON格式
  • 亚千字节架构大小(符合1024字节return_data限制)

安装

[dependencies]
mcpsol = "0.1"
bytemuck = { version = "1.14", features = ["derive"] }

对于锚点程序:

[dependencies]
mcpsol-anchor = "0.1"

对于本地人 solana-program:

[dependencies]
mcpsol-native = "0.1"

用法

宏观整合

use mcpsol::prelude::*;

#[derive(Clone, Copy, bytemuck::Pod, bytemuck::Zeroable, McpAccount)]
#[repr(C)]
#[mcp_account(name = "counter", description = "Stores count and authority")]
pub struct Counter {
    pub count: i64,
    pub authority: [u8; 32],
}

#[mcp_program(name = "counter", description = "A minimal counter program")]
pub mod counter {
    use super::*;

    #[mcp_instruction(
        name = "increment",
        description = "Add amount to counter value",
        accounts = "counter:mut, authority:signer"
    )]
    pub fn increment(ctx: Context<Modify>, amount: u64) -> Result<()> {
        // implementation
    }
}

宏生成:

  • 程序入口点
  • 带鉴别器匹配的指令调度器
  • list_tools 指令返回嵌入式模式
  • 编译时模式常数

客户端发现

use mcpsol_client::McpClient;

let client = McpClient::new("https://api.devnet.solana.com");
let schema = client.list_tools(&program_id)?;

for tool in &schema.tools {
    println!("{} - {}", tool.name, tool.description.unwrap_or_default());
}

IDL迁移

将现有锚点IDL转换为MCP模式:

idl2mcp --input target/idl/program.json --output schema.json

架构格式

{
  "v": "2024-11-05",
  "name": "counter",
  "tools": [
    {
      "n": "increment",
      "d": "0b12680968ae3b21",
      "p": {
        "counter_w": "pubkey",
        "authority_s": "pubkey",
        "amount": "int"
      },
      "r": ["counter_w", "authority_s", "amount"]
    }
  ]
}

帐户后缀

后缀 含义
_s 需要签名人
_w 可书写
_sw 签名者和可写者
(无) 只读

类型

架构 Rust 大小
int u64 8字节
u8-u128 unsigned int 变化
i8-i128 带符号的int 变化
bool bool 1字节
pubkey Pubkey 32字节
str String 前缀长度
bytes Vec<u8> 前缀长度

板条箱结构

板条箱 用途
mcpsol-core 模式类型、JSON生成、鉴别器实用程序
mcpsol 带有proc宏的匹诺曹SDK
mcpsol-macros 程序宏
mcpsol-anchor 锚点集成
mcpsol-native 本地solana程序集成
mcpsol-client 用于发现的客户端库
idl2mcp 锚IDL转换器

例子

示例 说明
examples/minimal-counter 基于宏观的实施
examples/counter 手动模式构建
examples/vault PDA衍生
examples/native-counter 本地茄果程序
examples/anchor-counter 锚点集成

演出

模式 CU开销 使用时
带上下文 ~50-70 CU 默认,需要 remaining_accounts
无上下文 ~20-30CU 简单指令,性能关键

跳过上下文以获得最佳性能:

#[mcp_instruction(name = "increment", accounts = "counter:mut, authority:signer")]
pub fn increment(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    amount: u64,
) -> Result<()> {
    let counter = &accounts[0];
    let authority = &accounts[1];
    // ...
}

看 docs/overside.md 了解详情。

局限性

  • 架构大小:复杂程序可能超过1024字节的限制
  • 静态模式:已在编译时修复
  • 类型简洁:紧凑格式省略了详细的类型信息

贡献

cargo test --workspace
cargo clippy --workspace
cargo fmt --all
cargo build-sbf

许可证

麻省理工学院或阿帕奇-2.0