This release includes 3 security fixes for security teams reviewing exposed deployments.
Topics
Affected surfaces
Summary
AI summaryTurboMCP v3.0.0 is a ground‑up rewrite with zero‑boilerplate proc macros and edge‑native WASM support.
Full changelog
TurboMCP v3.0.0 Release Notes
TurboMCP v3.0.0 is a ground-up architectural rewrite of the TurboMCP SDK. The result: a leaner codebase (-47,000 lines net), edge-native WASM support, modular transports, and a zero-boilerplate developer experience -- all backed by a comprehensive security audit.
Highlights
- Zero-boilerplate proc macros --
#[mcp_server],#[tool],#[resource],#[prompt]generate full MCP servers from plain Rust impl blocks - Edge-native WASM -- First-class Cloudflare Workers support with Durable Objects, streaming transport, and WASM-native OAuth 2.1
- Modular transport crates -- STDIO, HTTP/SSE, WebSocket, TCP, and Unix socket each live in their own crate behind feature flags
- Unified
McpHandlertrait -- Write once, deploy to native and WASM targets - Comprehensive security audit -- Critical-to-low fixes across 25 crates (JWT algorithm confusion, DPoP hardening, SSRF protection, TLS 1.3 default, and more)
- Integrated telemetry -- OpenTelemetry, Prometheus metrics, and structured logging via a single
telemetryfeature flag - CLI tooling --
turbomcp new,turbomcp build,turbomcp dev,turbomcp deploy,turbomcp install
Zero-Boilerplate Server Development
Define an MCP server in a handful of lines:
use turbomcp::prelude::*;
#[derive(Clone)]
struct Calculator;
#[mcp_server(name = "calculator", version = "1.0.0")]
impl Calculator {
#[tool(description = "Add two numbers")]
async fn add(&self, a: i64, b: i64) -> i64 {
a + b
}
}
#[tokio::main]
async fn main() {
Calculator.run_stdio().await.unwrap();
}
Schemas are generated at compile time. Transport methods (run_stdio(), run_tcp(), run_http(), run_unix()) are generated automatically. Tags, versioning, and context injection are all supported via attributes.
Edge-Native WASM (turbomcp-wasm)
- Durable Objects -- Rate limiter, session store, state store, token store
- Streaming transport -- Streamable HTTP with SSE for edge servers
- Composite servers -- Multi-server composition with namespace isolation
- Rich middleware -- Auth, rate limiting, logging, CORS
- WASM-native auth -- Web Crypto API integration, PKCE, multi-provider OAuth 2.1, DPoP
- Worker error integration --
WorkerErrornewtype andWorkerResultExtfor ergonomic?with Workers APIs
New Crates
| Crate | Purpose |
|---|---|
| turbomcp-core | no_std foundation types and McpHandler trait |
| turbomcp-transport-traits | Lean transport trait definitions |
| turbomcp-stdio | Extracted STDIO transport |
| turbomcp-http | Extracted HTTP/SSE client transport |
| turbomcp-websocket | Extracted WebSocket transport |
| turbomcp-tcp | Extracted TCP transport |
| turbomcp-unix | Extracted Unix domain socket transport |
| turbomcp-transport-streamable | MCP 2025-11-25 Streamable HTTP types |
| turbomcp-wasm | WASM server runtime for Cloudflare Workers |
| turbomcp-wasm-macros | Proc macros for WASM servers |
| turbomcp-openapi | OpenAPI 3.x to MCP conversion |
| turbomcp-telemetry | Integrated observability |
Security Hardening
Critical
- JWT algorithm confusion prevention -- fail-closed validation, key-type/algorithm enforcement
- Secret redaction in serialization -- auth config secrets serialize as
[REDACTED] - DPoP proof replay protection with enhanced nonce validation
- TLS certificate validation bypass now requires explicit opt-in (
TURBOMCP_ALLOW_INSECURE_TLS=1) - Unified
jsonwebtokenv10.2 withaws_lc_rsbackend
High
parking_lot::Mutexreplacesstd::sync::Mutex(no panic on poisoned lock)- Bounded STDIO messages prevent unbounded memory allocation
- Session ID length validation (max 256 bytes)
- TLS 1.3 default, native-tls completely eliminated
- JWT algorithm allowlist (asymmetric only)
- Enhanced path traversal protection (URL-encoded, null byte, Unicode lookalike detection)
Medium
- SSRF protection (private networks, localhost, cloud metadata, link-local, multicast)
- RFC 8414 OpenID Connect Discovery for async JWKS resolution
- DPoP binding validation with thumbprint verification
- API key minimum length (32 characters)
Low
- EMA overflow protection, gRPC capability validation, Unix socket graceful shutdown
- CLI path validation, configurable HTTP User-Agent, improved macro error spans
CLI Enhancements
turbomcp new-- Scaffold new projects from templates (WASM, native, hybrid)turbomcp build-- WASM-aware build pipeline with wasm-pack integrationturbomcp dev-- Development server with hot reload and file watchingturbomcp deploy-- Deploy to Cloudflare Workersturbomcp install-- Install servers to Claude Desktop and Cursor
Protocol & Transport
- MCP 2025-11-25 support (latest spec) with configurable version negotiation
- Protocol version presets --
latest(),compatible()(Claude Code),strict(version) - Streamable HTTP transport -- Session management, SSE event streams,
no_stdsupport - Child process STDIO --
StdioTransport::from_child()andStdioTransport::from_raw() - Custom struct tool returns --
IntoToolResultforJson<T> - CORS hardening -- Echoes request
Origininstead of wildcard*, addsVary: Origin
Dependency Upgrades
- reqwest 0.12 -> 0.13 (with
OAuth2HttpClientadapter) - tokio 1.47 -> 1.49
- axum 0.8.4 -> 0.8.8
- sonic-rs 0.3 -> 0.5
- opentelemetry 0.28 -> 0.31
- criterion 0.7 -> 0.8
- compact_str 0.8 -> 0.9
- native-tls completely eliminated from dependency tree
Breaking Changes
JwtValidator::new()is now async with RFC 8414 discoveryMcpError::validation()renamed toMcpError::invalid_params()TlsVersion::default()returnsTls13instead ofTls12- Legacy V2 macro modules removed (attrs, helpers, template, uri_template)
- Old handler system, elicitation module, multi-tenant config removed from
turbomcp-server Removedinjection, lifespan, registry, session, simd, sse_server modules fromturbomcp
See MIGRATION.md for a complete migration guide.
By the Numbers
- 1,787 tests passing
- Zero clippy warnings with
--all-features - All transports verified: STDIO, TCP, HTTP, WebSocket, Unix socket, gRPC
- 25 crates audited
- -47,000 lines net code reduction
- Rust 1.89.0, MCP spec 2025-11-25
Full Changelog: https://github.com/Epistates/turbomcp/compare/v2.3.6...v3.0.0
Breaking Changes
- `JwtValidator::new()` is now async with RFC 8414 discovery
- `McpError::validation()` renamed to `McpError::invalid_params()`
- `TlsVersion::default()` returns `Tls13` instead of `Tls12`
- Legacy V2 macro modules removed (attrs, helpers, template, uri_template)
- Old handler system, elicitation module, multi‑tenant config removed from `turbomcp-server`
Security Fixes
- Critical: JWT algorithm confusion prevention – fail‑closed validation with key‑type/algorithm enforcement
- High: TLS certificate validation bypass now requires explicit opt‑in (`TURBOMCP_ALLOW_INSECURE_TLS=1`)
- Medium: SSRF protection added for private networks, localhost, cloud metadata, link‑local and multicast addresses
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Beta — feedback welcome: [email protected]