使用说明
WasmMCP-WASM中的Rust MCP服务器
纸张:“跨边缘云连续体为AI代理编排基于WASM的MCP工具运行时” 宋武铉、金海英、李京云、孙载吉、李庆永 第26届IEEE/ACM集群、云和互联网计算国际研讨会(CCGrid 2026)
在Rust中构建MCP(模型上下文协议)服务器的框架,编译为WASM。 从单个机箱支持Stdio(本地)和HTTP(无服务器)传输。 此存储库是 EdgeAgent,提供用于边缘云工具编排的基于WASM的MCP服务器实现。
概述
在Rust中编写一次MCP服务器,编译为WASM,并在任何地方运行——通过本地 wasmtime run
或通过远程 wasmtime serve /Knative/无服务器平台。
主要特点
- 纯WASM:没有Python/Node.js依赖关系-只有WASM二进制文件
- 统一代码库:带有CLI/HTTP构建功能标志的单个机箱
- 轻量级:~300KB-1.3MB二进制文件(取决于服务器的复杂性)
- 类似DX的FastMCP:声明性工具注册
McpServer::builder() - Docker支持:WASM和Python服务器的Dockerfiles
- 部署就绪:ECR、私有注册表和容器部署的脚本
快速开始
先决条件
# Install Rust WASI target
rustup target add wasm32-wasip2
# Install Wasmtime
curl https://wasmtime.dev/install.sh -sSf | bash
构建所有服务器
./scripts/build_all.sh
这将在CLI和HTTP变体中构建所有9台服务器:
mcp_server_*_cli.wasm-forwasmtime run(stdio)mcp_server_*_http.wasm-forwasmtime serve(HTTP)
运行示例
# Stdio mode (local development)
wasmtime run ./target/wasm32-wasip2/release/mcp_server_time_cli.wasm
# HTTP mode (serverless)
wasmtime serve --addr 127.0.0.1:8000 -S cli=y \
--dir=/tmp/test \
./target/wasm32-wasip2/release/mcp_server_filesystem_http.wasm
项目结构
WasmMCP/
├── wasmmcp/ # Core framework
│ ├── src/
│ │ ├── lib.rs # Public API
│ │ ├── server.rs # McpServer builder
│ │ ├── builder.rs # Server builder implementation
│ │ ├── registry.rs # Tool registry
│ │ ├── timing.rs # Timing utilities
│ │ ├── transport/ # Stdio/HTTP transports
│ │ └── protocol/ # JSON-RPC handling
│
├── wasmmcp-macros/ # export_cli!, export_http! macros
│
├── shared/ # Shared code across servers
│ └── src/
│ └── lib.rs # Common utilities
│
├── servers/ # MCP server implementations
│ ├── wasm_server/ # Rust WASM servers
│ │ ├── time/ # Time tools (timezone conversion)
│ │ ├── filesystem/ # 14 file system tools
│ │ ├── git/ # Git repository tools
│ │ ├── fetch/ # URL fetching (wasi:http)
│ │ ├── summarize/ # LLM-based summarization
│ │ ├── log-parser/ # Log parsing with regex
│ │ ├── data-aggregate/ # Data aggregation tools
│ │ ├── sequential-thinking/ # Structured thinking tool
│ │ └── image-resize/ # Image processing tools
│ │
│ └── python_server/ # Python server implementations
│ ├── data_aggregate_server.py
│ ├── fetch_server.py
│ ├── image_resize_server.py
│ ├── log_parser_server.py
│ └── summarize_server.py
│
├── docker/ # Docker configurations
│ ├── wasm-server/ # WASM server Dockerfiles
│ ├── native-server/ # Python server Dockerfiles
│ └── registry/ # Container registry setup
│
├── scripts/
│ ├── build_all.sh # Build all servers
│ ├── build_server.sh # Build single server
│ └── run_server.sh # Run server
│ ├── push-to-ecr.sh # AWS ECR deployment
│ ├── push-to-registry.sh # Private registry deployment
│ ├── push-wasm-images.sh # WASM image deployment
│ └── cleanup-ecr.sh # ECR cleanup
│
└── tests/
├── compare_*.py # Comparison tests vs Python implementations
├── mcp_comparator.py # Test framework
├── test_http_langchain.py # HTTP transport tests
└── test_langchain_integration.py # LangChain integration tests
写入MCP服务器
最小示例
use wasmmcp::schemars::JsonSchema;
use wasmmcp::serde::Deserialize;
use wasmmcp::prelude::*;
#[derive(Debug, Deserialize, JsonSchema)]
pub struct GreetParams {
/// Name to greet
pub name: String,
}
pub fn create_server() -> McpServer {
McpServer::builder("my-server")
.version("1.0.0")
.tool::<GreetParams, _>(
"greet",
"Say hello to someone",
|params| Ok(format!("Hello, {}!", params.name))
)
.build()
}
// Export for wasmtime run
#[cfg(feature = "cli-export")]
wasmmcp::export_cli!(create_server);
// Export for wasmtime serve
#[cfg(feature = "http-export")]
wasmmcp::export_http!(create_server);
Cargo.toml
[package]
name = "mcp-server-myserver"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "rlib"]
[dependencies]
wasmmcp = { path = "../../../wasmmcp" }
wasi = "0.14"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
schemars = "1"
[features]
default = ["cli-export"]
cli-export = []
http-export = []
建筑
# CLI version
cargo build --target wasm32-wasip2 --release \
-p mcp-server-myserver --features cli-export --no-default-features
# HTTP version
cargo build --target wasm32-wasip2 --release \
-p mcp-server-myserver --features http-export --no-default-features
可用服务器
| 服务器 | 工具 | 说明 |
|---|---|---|
| time | 2 | 时区转换(get_current_time,convert_time) |
| 文件系统 | 14 | 文件操作(读/写/编辑/搜索/树) |
| git | 12 | git存储库读取操作 |
| fetch | 1 | 通过HTML到markdown转换获取URL |
| summare | 3 | LLM支持的文本摘要(OpenAI/Upstage) |
| 日志解析器 | 5 | 日志解析、过滤、统计 |
| 数据聚合 | 5 | 数据聚合和重复数据删除 |
| 顺序思维 | 1 | 结构化问题解决 |
| 图像大小调整 | 6 | 图像信息、大小调整、哈希、批处理操作 |
建筑
统一CLI/HTTP构建
┌─────────────────────────────────────────────────────────────┐
│ MCP Server Logic (tools) │
├─────────────────────────────────────────────────────────────┤
│ wasmmcp framework │
│ (McpServer, ToolDef, Protocol) │
├──────────────────────────┬──────────────────────────────────┤
│ export_cli! │ export_http! │
│ (wasi:cli/run) │ (wasi:http/incoming-handler) │
├──────────────────────────┼──────────────────────────────────┤
│ wasmtime run │ wasmtime serve / Knative │
└──────────────────────────┴──────────────────────────────────┘
功能开关
cli-export:出口wasi:cli/run用于stdio通信http-export:出口wasi:http/incoming-handler对于HTTP请求
这两个功能共享相同的功能 create_server() 功能,消除代码重复。
LangChain集成
标准连接
from langchain_mcp_adapters.client import MultiServerMCPClient
mcp_config = {
"wasmmcp": {
"transport": "stdio",
"command": "wasmtime",
"args": ["run", "--dir=/tmp", "./target/wasm32-wasip2/release/mcp_server_filesystem_cli.wasm"],
}
}
client = MultiServerMCPClient(mcp_config)
async with client.session("wasmmcp") as session:
tools = await load_mcp_tools(session)
HTTP连接
mcp_config = {
"wasmmcp_http": {
"transport": "streamable_http",
"url": "http://localhost:8000",
}
}
容器部署
Docker构建
每台服务器在 docker/wasm-server/ 和 docker/native-server/:
# Build WASM server image
docker build -f docker/wasm-server/Dockerfile.time -t wasmmcp-time:latest .
# Build Python server image
docker build -f docker/native-server/Dockerfile.time -t python-mcp-time:latest .
部署脚本
# Deploy to AWS ECR
./scripts/push-to-ecr.sh <registry-domain>
# Deploy to private registry
./scripts/push-to-registry.sh <registry-domain>
# Deploy WASM images
./scripts/push-wasm-images.sh <registry-domain>
# Cleanup ECR
./scripts/cleanup-ecr.sh <registry-domain>
私有容器注册
设置本地或基于云的私有注册表:
# Local registry with Docker Compose
cd docker/registry
docker-compose -f docker-compose.registry-local.yml up -d
# HTTPS registry with Let's Encrypt
./setup-https-registry.sh <your-domain>
# HTTPS registry with DNS validation
./setup-https-dns.sh <your-domain>
Knative部署
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: wasmmcp-time
spec:
template:
spec:
runtimeClassName: wasmtime-spin
containers:
- image: your-registry/wasmmcp-time:latest
支持的平台
- Knative+containerd(runwasi)
- Docker/Kubernetes
- 私有集装箱登记处
二进制大小
| 服务器 | CLI | HTTP | 区别 |
|---|---|---|---|
| 顺序思维 | 264KB | 276KB | +12KB |
| 总结 | 292KB | 300KB | +8KB |
| 数据聚合 | 376KB | 388KB | +12KB |
| git | 388 KB | 404 KB | +16 KB |
| 文件系统 | 436KB | 448KB | +12KB |
| 获取 | 528KB | 540KB | +12KB |
| 时间 | 1.2MB | 1.2MB | ~0 |
| 日志解析器 | 1.3MB | 1.3MB | ~0 |
| 图像大小调整 | 1.2MB | 1.2MB | ~0 |
依赖项
[workspace.dependencies]
tokio = { version = "1", default-features = false }
rmcp = { version = "0.10", default-features = false, features = ["server", "macros"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
schemars = "1"
wasi = "0.14"
许可证
Apache 2.0。看 许可证 了解详情。
引用
如果您在研究中使用WasmMCP,请引用我们的论文:
@inproceedings{song2026orchestrating,
title={Orchestrating WASM-based MCP Tool Runtimes for AI Agents across Edge-Cloud Continuum},
author={Song, Moohyun and Kim, Hayoung and Lee, Kyoohyun and Son, Jae Gi and Lee, Kyungyong},
booktitle={The 26th IEEE/ACM International Symposium on Cluster, Cloud and Internet Computing (CCGrid)},
year={2026}
}