Releases: Epistates/turbomcp
v3.0.6
[3.0.6] - 2026-03-18
Security
- SSRF bypass in JWT OIDC discovery —
JwtValidator::discover_jwks_uriandJwksCache::get_client_for_issuernow accept an optionalSsrfValidatorthat validates URLs before any network I/O. Previously,reqwest::get()was called directly on user-controlled issuer claims, allowing SSRF against internal services. New constructorsJwtValidator::new_with_ssrf()andJwksClient::with_ssrf_validator()enable SSRF-protected operation. Thessrfmodule is now unconditionally available (was previously gated behindmcp-ssrffeature). - JWT audience field RFC 7519 compliance —
StandardClaims.audchanged fromOption<String>toOption<Vec<String>>usingserde_with::OneOrMany, correctly handling both"aud": "single"and"aud": ["one", "two"]formats per RFC 7519 §4.1.3. Previously, tokens from enterprise IdPs (Google, Azure AD, Okta) using the array format would fail deserialization. - JWKS response size limit —
JwksClient::fetch_and_cachenow enforces a 64KB response body limit before JSON parsing, preventing memory exhaustion from malicious JWKS endpoints. - DPoP server nonce implementation —
generate_proof_with_paramsnow embeds server-provided nonces as the"nonce"claim in DPoP proofs per RFC 9449 §8. Previously, the nonce parameter was silently discarded. - PKCE
plainmethod removed in WASM —verify_pkcein the WASM auth provider now rejects the"plain"method, enforcing"S256"per RFC 7636 §4.2. - Constant-time comparison hardened in WASM — Replaced hand-rolled branchless comparison with
subtle::ConstantTimeEqto resist LLVM optimizer constant-time assumption violations. - Internal error leakage in JSON-RPC responses — Error handler now generates an opaque UUID error ID for clients and logs the full internal error server-side, preventing reconnaissance via error messages.
- Unbounded rate limiter memory — Added
max_tracked_ips(default: 100,000) toRateLimitConfigwith automatic eviction of expired entries when capacity is reached, preventing OOM under IP spoofing attacks. lz4_flexupgraded to 0.11.6 — Fixes RUSTSEC-2026-0041 (HIGH 8.2): information leak from uninitialized memory during decompression of invalid data.quinn-protoupgraded to 0.11.14 — Fixes RUSTSEC-2026-0037 (HIGH 8.7): denial of service in Quinn endpoints via malformed QUIC packets.lrureplaced withmoka— Resolves RUSTSEC-2026-0002 (unsoundIterMut). OAuth2 token cache now usesmoka::future::Cache(thread-safe, lock-free, with TTL support).
Fixed
no_stdcompliance inturbomcp-types— Added#![cfg_attr(not(feature = "std"), no_std)]and cfg-conditionalHashMap/BTreeMapimports incontent.rs,results.rs,protocol.rs. Changedstd::fmttocore::fmtintraits.rsandprotocol.rs. Layer 1 crates now correctly supportno_std + alloc.biasedadded to shutdown-criticalselect!blocks —tokio::select!in the line transport main loop and client message dispatcher now usesbiased;to ensure shutdown signals are always checked first.- Production
unwrap()removed from HTTP transport —HeaderValue::from_str().unwrap()on session IDs replaced with graceful fallback. - Mutex poisoning risk eliminated —
std::sync::Mutexin channel transport replaced withparking_lot::Mutex(never poisons). - Unnecessary allocation in router —
request.params.clone().unwrap_or_default()replaced with borrow pattern in the initialize handler. - Dead code cleanup — Removed unused
detect_server_initiated_typefunction. Changed unusedSessionManagermethods topub(crate). - Workspace dependency consistency —
turbomcp-grpcnow uses{ workspace = true }for internal deps instead of inline path specifications. - License compliance — Added
OpenSSLandZlibtodeny.tomlallowlist. Added advisory ignores for compile-time-only crates (paste,proc-macro-error).
Changed
- Fraudulent security tests replaced — Three tests in
security_attack_scenarios.rsthat asserted on test data (not SDK behavior) were rewritten with meaningful assertions against actual crate behavior. - Vacuous tests fixed —
test_dispatcher_smoke(zero assertions) replaced withtest_bidirectional_types_compilewith real assertions.test_oauth2_expired_authorization(sleep with no assertion) marked#[ignore]with documented implementation path. - Trybuild test documentation — Disabled trybuild tests now have precise reason strings and documented TODO items for v3 compile-fail scenarios.
Full Changelog: v3.0.5...v3.0.6
v3.0.5
[3.0.5] - 2026-03-17
Fixed
- Cross-platform compilation in
turbomcp-proxy— All Unix domain socket code (BackendTransport::Unix,BackendConfig::Unix,UnixFrontend,with_unix_backend(),UnixTransportimport,std::path::PathBufimport) is now gated behind#[cfg(unix)]. This allowsturbomcp-proxyto compile cleanly on Windows, where Unix sockets are unavailable. Unix-specific CLI branches (BackendType::Unixmatch arms) and tests are similarly gated. Thepreludere-export ofUnixFrontend/UnixFrontendConfigis now also conditional.
Full Changelog: v3.0.4...v3.0.5
v3.0.4
[3.0.4] - 2026-03-15
Added
- Progress notification handler — New
ProgressHandlertrait andProgressNotificationre-export inturbomcp-client. The client now routesnotifications/progressto a registered handler instead of silently dropping them. Register viaClientBuilder::with_progress_handler()orClient::set_progress_handler(). - Cursor-based pagination for all list operations —
list_tools(),list_resources(),list_resource_templates(), andlist_prompts()now automatically follownext_cursorto collect all pages (capped at 1000 pages as a safety bound). New*_paginated(cursor)variants (list_tools_paginated,list_resources_paginated,list_resource_templates_paginated,list_prompts_paginated) expose manual pagination control with the full result type includingnext_cursor.
Full Changelog: v3.0.3...v3.0.4
v3.0.3
[3.0.3] - 2026-03-15
Breaking Changes
- Strict single-version protocol policy — TurboMCP v3 now targets MCP
2025-11-25only.SUPPORTED_VERSIONSnarrowed to a single entry;ProtocolConfig::default()setsallow_fallback: false;Version::stable()andVersionCompatibility::CompatibleWithWarningsremoved. Uri,MimeType,Base64Stringpromoted to newtypes — These weretype Alias = String; they are now#[serde(transparent)]newtype structs withDeref<Target = str>,From<String>,From<&str>,AsRef<str>,Display, andPartialEq<&str>impls. Wire format is unchanged.Contenttype alias removed — UseContentBlockdirectly. Thepub type Content = ContentBlockalias is deleted.ClientBuilderconsolidated — The separateclient/builder.rsis removed; builder logic is inlined intoturbomcp-client/src/lib.rs. Public API is unchanged.- API key auth now validates against configured value —
AuthConfig::api_key(header)withoutapi_key_valuereturns HTTP 500 (fail-closed). Usewith_api_key_auth_value(header, value)or setTURBOMCP_API_KEY_VALUEenv var.
Security
- Constant-time API key comparison — API key validation now uses
subtle::ConstantTimeEqto prevent timing side-channel attacks. - JWT scope enforcement — Auth middleware validates
required_scopesagainst tokenscope/scpclaims. - JWT audience validation — Validates
audclaim againstserver_uriper RFC 8707 to prevent cross-service token reuse. - SSRF hardening with DNS resolution — Proxy URL validation now resolves hostnames via
tokio::net::lookup_hostand validates all resolved IPs against private/loopback/metadata ranges. - JWKS URI construction fixed — Uses
Url::join()instead of string concatenation to avoid double-slash bugs with trailing-slash issuers. - Bearer token log truncation — Revocation log now emits only an 8-character token prefix instead of the full token.
Fixed
- Response waiter memory leak —
ProtocolClientnow cleans up response waiters on send failure and timeout, preventingDashMapentry leaks. - Spurious shutdown warnings —
Client::Dropno longer warns whenshutdown()was already called. - Resilience settings silently ignored —
ClientBuilder::build()now returns an error (andbuild_sync()panics) if resilience settings are configured butbuild_resilient()is not used. --all-featurescompilation — Fixed missingdpop_configfield in auth tests andUritype mismatch in WASM crate.
Changed
- Dead code removal — Deleted
axum_integration.rs, etc. - WebSocket long-running tests implemented — Three previously-stub
#[ignore]tests now use a realWebSocketTestServerharness. - Token lifecycle tests implemented — Refresh token rotation and revocation tests now use
OAuth2Clientinstead of raw HTTP.
Full Changelog: v3.0.2...v3.0.3
v3.0.2
[3.0.2] - 2026-03-08
Changed
- Eliminated unsafe code in
LockFreeStack- Replaced hand-rolled Treiber stack (usingcrossbeam::epochraw pointers,ptr::read,defer_destroy) with safecrossbeam::queue::SegQueue-backed implementation. Zero unsafe blocks remain in application-level code. - Fixed
turbomcp-wirecompilation with--all-features- Added missing#[cfg(feature = "std")]gate ontracing::warn!call inStreamingJsonDecoder::feed(). - Dependency updates - Updated all workspace dependencies to latest versions for security, performance, and correctness:
- Major bumps:
simd-json0.13→0.17,jsonschema0.17→0.44,config0.14→0.15,flume0.11→0.12 - Runtime:
tokio1.49→1.50,hyper1.0→1.8,reqwest0.13→0.13.2,serde1.0→1.0.228,serde_json1.0→1.0.149 - Observability:
tracing0.1→0.1.44,tracing-opentelemetry0.32→0.32.1,metrics0.24→0.24.3 - Security:
ring0.17→0.17.14,jsonwebtoken10.2→10.3,base640.22→0.22.1 - Diagnostics:
miette7.0→7.6,anyhow1.0→1.0.102,color-eyre0.6→0.6.5 - Testing:
criterion0.8.1→0.8.2,proptest1.9→1.10,insta1.34→1.46,testcontainers0.25→0.27,wiremock0.6→0.6.5,serial_test3.0→3.4 - Utilities:
arc-swap1.6→1.8,crossbeam0.8→0.8.4,ahash0.8→0.8.12,walkdir2.4→2.5
- Major bumps:
Full Changelog: v3.0.1...v3.0.2
v3.0.1
[3.0.1] - 2026-03-05
Added
- In-process channel transport - Zero-overhead
channeltransport usingtokio::sync::mpscchannels for same-process MCP communication. Eliminates line framing, flushing, and redundant JSON parsing. 1.4x faster than rmcp on tool call latency (14μs vs 19μs), 1.2x higher throughput (71k rps vs 59k rps). TransportType::Channelvariant - AddedChannelto bothturbomcp-coreandturbomcp-transport-traitsTransportTypeenums, withis_local()classification and properDisplay/serde support.RequestContext::channel()factory - Convenience constructor for channel transport contexts inturbomcp-server.channelfeature flag - New feature onturbomcp-serverandturbomcpcrates, included inall-transportsbundle.
Fixed
- Channel transport type identification -
ChannelTransport::transport_type()now correctly returnsTransportType::Channelinstead ofTransportType::Stdio.
Full Changelog: v3.0.0...v3.0.1
v3.0.0
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: v2.3.6...v3.0.0
TurboMCP v3.0.0-beta.5
[3.0.0-beta.5] - 2026-02-23
Security
- DPoP authentication hardening - Comprehensive DPoP (RFC 9449) implementation across turbomcp components with enhanced proof-of-possession validation, token binding, and authorization flows (
turbomcp-auth,turbomcp-dpop,turbomcp-server) - WASM authentication provider - Full OAuth 2.1 provider for WASM targets with Web Crypto API integration, secure token storage, and PKCE support (
turbomcp-wasm)
Added
WASM Server Architecture (turbomcp-wasm, turbomcp-wasm-macros)
- Durable Objects support - Rate limiter, session store, state store, and token store durable objects for Cloudflare Workers
- Streaming transport - Streamable HTTP transport for edge-native WASM servers with SSE support
- Composite server - Multi-server composition with namespace isolation for WASM targets
- Rich context system - Enhanced request context with authentication, rate limiting, and middleware state
- Middleware stack - Typed middleware system for WASM servers (auth, rate limiting, logging, CORS)
- Testing utilities - Comprehensive test harness for WASM server implementations
CLI Enhancements (turbomcp-cli)
turbomcp newcommand - Project scaffolding with templates for WASM, native, and hybrid serversturbomcp buildcommand - WASM-aware build pipeline with wasm-pack integrationturbomcp deploycommand - Deploy scaffolding for Cloudflare Workers and other edge platforms
Streamable HTTP Transport (turbomcp-transport-streamable)
- New crate providing MCP 2025-11-25 Streamable HTTP transport types
- Session management with configurable timeouts and cleanup
- SSE event stream handling with proper connection lifecycle
MCP Content Types Enhancement (turbomcp-types, turbomcp-protocol)
- Metadata fields - Added metadata support to MCP content types for extensibility
- Polymorphic serialization - Robust
SamplingContentBlockserialization supporting text, image, and audio content Roledisplay implementation -Displaytrait forRoleenum for human-readable output
Auth Tower Middleware (turbomcp-auth)
- Rate limiting middleware - Token bucket rate limiter as Tower middleware with configurable per-client limits
- Auth metrics - Observable authentication metrics (success/failure rates, latency histograms)
- Auth context - Request-scoped authentication context with claims, scopes, and DPoP binding
Changed
- Strict protocol compliance - Enhanced macro-generated code for stricter MCP protocol adherence across tool handlers and server initialization (
turbomcp-macros,turbomcp-core) - Error handling improvements - Extended
McpErrorwith additional error variants for protocol compliance - Router enhancements - Improved handler routing with better error propagation (
turbomcp-core) - Client dispatcher - Refined client-server interaction patterns (
turbomcp-client)
Fixed
- Protocol compliance - Fixed strict protocol compliance issues in server macro generation and tool handler dispatch (
turbomcp-macros,turbomcp-core) - Name alias resolution - Fixed crate name alias configuration
Internal
- Code cleanup and polish across workspace
- CI workflow improvements for WASM builds and performance testing
- Dependency version updates across all crates
Full Changelog: 3.0.0-beta.4...v3.0.0-beta.5
TurboMCP 3.0.0-beta.4
[3.0.0-beta.4] - 2026-02-17
Security
Comprehensive Security Audit Remediation
Full security audit across all 25 crates with fixes at all severity levels.
CRITICAL (turbomcp-auth, turbomcp-dpop, turbomcp-wasm)
- JWT algorithm confusion prevention - Fail-closed validation when algorithm list is empty
- Key-type/algorithm compatibility enforcement - RSA keys restricted to RS* algorithms, EC keys to ES* algorithms
- Secret redaction in serialization - Auth config secrets now serialize as
[REDACTED]instead of plaintext - DPoP proof replay protection - Enhanced nonce validation and proof binding checks
- WASM JWT hardening - Replaced
window.atob()with standardbase64crate for universal WASM target support
HIGH (turbomcp-client, turbomcp-transport, turbomcp-protocol)
- Client mutex upgrade - Replaced
std::sync::Mutexwithparking_lot::Mutex(no panic on poisoned lock) - Bounded STDIO messages -
LinesCodec::new_with_max_length()prevents unbounded memory allocation - Session ID length validation -
SessionIdrejects IDs longer than 256 bytes - TCP strict mode - Configurable
strict_modefor JSON parse error handling (disconnect vs log-and-continue)
MEDIUM (turbomcp-auth, turbomcp-protocol, turbomcp-websocket)
- SSRF protection hardening - Blocks private networks, localhost, cloud metadata, link-local, multicast
- RFC 8414 OpenID Connect Discovery - JWT validator supports async discovery of JWKS endpoints
- DPoP binding validation -
AuthContext::validate_dpop_binding()for thumbprint verification - Enhanced elicitation validation - Stricter input validation for elicitation request types
LOW (across workspace)
- EMA overflow protection - Saturating arithmetic in transport metrics prevents u64 overflow
- gRPC capability validation -
validate_capabilities()builder method withtracing::warn! - Unix socket graceful shutdown - Broadcast-based shutdown with
JoinSettask lifecycle management - CLI path validation - Absolute path verification before filesystem operations
- Macro error improvements -
syn::Errorspan-based errors for better IDE integration - Configurable HTTP User-Agent - Optional
user_agentfield to control fingerprinting
Added
New Crates
turbomcp-openapi- OpenAPI 3.x to MCP conversion- GET endpoints → MCP Resources, POST/PUT/PATCH/DELETE → MCP Tools
- Built-in SSRF protection, configurable timeouts, regex route mapping
turbomcp-transport-streamable- Streamable HTTP transport types (MCP 2025-11-25)- Pure no-I/O SSE encoding/decoding, session management,
no_stdsupport
- Pure no-I/O SSE encoding/decoding, session management,
WASM Server Architecture (turbomcp-wasm)
- Durable Objects -
DurableRateLimiter,DurableSessionStore,DurableStateStore,DurableTokenStore - Streamable Transport - Session-based HTTP streaming with Server-Sent Events
- Enhanced Auth Provider - WASM-native crypto, multi-provider OAuth 2.1, DPoP, JWKS caching
- Rich Request Context - HTTP headers, method, path, query, correlation IDs, auth principal
- Middleware System - Request/response interception, rate limiting, logging hooks
- Visibility Control - Tool/resource/prompt visibility with user/role-based access
- Composite Servers - Compose multiple servers with automatic namespacing and secure CORS
WASM Procedural Macros (turbomcp-wasm-macros)
#[server(name = "...", version = "...")]- Transform impl blocks into MCP servers#[tool("description")],#[resource("uri")],#[prompt("description")]- Handler registration- Identical attribute syntax to native
turbomcp-macros
Server Composition (turbomcp-server)
- Composite Server - Combine multiple servers with automatic prefixing
- Typed Middleware - Per-operation middleware hooks for all MCP operations
- Visibility/Access Control - Role-based resource access
CLI Enhancements (turbomcp-cli)
turbomcp build- Build for native and WASM targets (Cloudflare Workers, Deno, generic wasm32)turbomcp dev- Development server with hot reload and file watchingturbomcp install- Install servers to Claude Desktop and Cursorturbomcp deploy- Deploy to Cloudflare Workersturbomcp new- Create new MCP server projects from templates
Child Process Support (turbomcp-stdio)
StdioTransport::from_child(&mut Child)- Transport from spawned child processStdioTransport::from_raw<R, W>(reader, writer)- CustomAsyncRead/AsyncWritestreams
Custom Struct Tool Returns (turbomcp-core)
IntoToolResultforJson<T>- Tool handlers can return custom structs wrapped inJson<T>
Macro Enhancements (turbomcp-macros)
- Tags and versioning -
#[tool(tags = ["admin"], version = "2.0")]on tools, resources, prompts - Type-based
RequestContextdetection - Detects by type, not parameter name - Improved error messages -
syn::Errorspan-based errors, better deprecated attribute guidance
Authentication (turbomcp-auth)
AuthContextwithrequires_dpop()andvalidate_dpop_binding()methods- JWT validator async creation with RFC 8414 discovery
Changed
Breaking
- JWT validator -
JwtValidator::new()is now async with RFC 8414 discovery - Error types -
McpError::validation()→McpError::invalid_params()in auth validation
Improvements
- CORS hardening - Echoes request
Originheader instead of wildcard*, addsVary: Origin - Prelude - Added
Roleto prelude for ergonomicPromptResultbuilder API parking_lotworkspace dep - Standardized to 0.12.5 across workspace- WASM builder API -
.tool()replaces.with_tool()(deprecated), same for resources/prompts
Fixed
- JWT base64 decoding (
turbomcp-wasm) - Cloudflare Workers compatibility (nowindow.atob()) - Property test (
turbomcp-transport) -prop_cache_clear_worksdeduplicates IDs correctly - Prompt context detection (
turbomcp-macros) - Detects&RequestContextby type, not name - Client semaphore handling (
turbomcp-client) - Graceful degradation when handler semaphore closed - Sampling handler (
turbomcp-client) - Removed panic on poisoned lock
Documentation
- Macro syntax (
docs/api/macros.md) - Corrected resource macro syntax, parameter descriptions - McpHandler Clone bound (
turbomcp-core) - Documented Arc pattern for shared state - Wire codec (
turbomcp-wire) - Send+Sync docs, MsgPackCodec security notes - TelemetryGuard lifecycle (
turbomcp-telemetry) - Drop behavior documentation - CLI security warnings (
turbomcp-cli) - STDIO risks, token exposure, permissions
Test Results
- 1,787 tests passing
- Zero clippy warnings with
--all-features - All transports verified: STDIO, TCP, HTTP, WebSocket, Unix socket, gRPC
Full Changelog: v3.0.0-beta.3...3.0.0-beta.4
TurboMCP v3.0.0-beta.3
[3.0.0-beta.3] - 2026-01-22
Security
JWT Algorithm Confusion Attack Prevention (turbomcp-wasm)
- Fail-Closed Algorithm Validation - Empty algorithm lists now return an error instead of bypassing validation
- Key-Type/Algorithm Compatibility - RSA keys can only be used with RS* algorithms, EC keys with ES* algorithms
- Removed
DefaultforJwtConfig- Prevents accidental creation of insecure configurations - HTTPS Enforcement for JWKS - JWKS URLs must use HTTPS (localhost exempt for development)
- Added
allow_insecure_http()for development/testing only - Added comprehensive security tests for algorithm confusion and HTTPS validation
Added
Worker Error Integration (turbomcp-wasm)
WorkerErrornewtype wrapper - Enablesworker::ErrortoToolErrorconversion via.map_err(WorkerError)WorkerResultExttrait - Ergonomic.into_tool_result()method forworker::Result<T>- Both approaches enable full
?operator support with Cloudflare Workers APIs (KV, Durable Objects, R2, D1, etc.)
Documentation
OAuth and Authentication (turbomcp-wasm)
- Comprehensive OAuth Protection Guide - Three authentication patterns documented:
- Cloudflare Access (recommended for production)
- Custom JWT Validation (for self-hosted OAuth/OIDC)
- Bearer Token (development only, with security warnings)
- Worker Error Integration Examples - Usage examples for
WorkerErrorandWorkerResultExt - Security Checklist - Production deployment checklist for authentication
Full Changelog: v3.0.0-beta.1...v3.0.0-beta.3