WASM MCP服务器框架

一个基于Rust构建MCP(Model Context Protocol)服务器的框架,编译为WASM,支持本地和服务器端运行。

  • by ddps-lab
  • Rust
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 ddps-lab/WasmMCP

使用说明

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 -for wasmtime run (stdio)
  • mcp_server_*_http.wasm -for wasmtime 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}
}