使用说明
麦普索
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
