Releases: pulseengine/mcp
v0.15.0
test(oauth): add comprehensive OAuth flow integration tests Added 10 new integration tests for full OAuth 2.1 authorization flow: Authorization endpoint tests: - GET /oauth/authorize consent form display - Invalid response_type validation - Invalid code_challenge_method validation (S256 required) - POST user approval with redirect - POST user denial with access_denied error Token endpoint tests: - Full authorization code grant flow with PKCE - Refresh token flow with token rotation - Wrong PKCE code_verifier rejection - Expired authorization code handling - Wrong redirect_uri validation These tests exercise both authorize.rs and token.rs OAuth modules through complete HTTP request/response cycles, improving coverage of critical OAuth security flows.
v0.14.0: OAuth 2.1 Implementation with Resource Subscriptions
What's New in v0.14.0
This release introduces comprehensive OAuth 2.1 authentication support for MCP servers along with resource subscription capabilities.
OAuth 2.1 Implementation
Complete OAuth 2.1 authorization server implementation with:
- Dynamic Client Registration (RFC 7591) - Automatic client credential provisioning
- Authorization Code Flow with PKCE (RFC 7636) - Mandatory S256 code challenge for enhanced security
- Token Management - Access token and refresh token lifecycle with rotation
- Resource Indicators (RFC 8707) - Multi-resource OAuth support
- Authorization Server Metadata (RFC 8414) - Discovery via
.well-known/oauth-authorization-server - Protected Resource Metadata (RFC 9728) - Resource server discovery
Key features:
- In-memory storage backend (production-ready persistent storage coming soon)
- Axum-based HTTP endpoints for OAuth flows
- Full PKCE validation (no plain method support)
- Refresh token rotation for improved security
- Comprehensive test coverage with 26 integration tests
Resource Subscriptions
Phase 1 & 2 implementation:
- Subscribe/unsubscribe to resource updates
- Notification delivery for subscribed resources
- Full integration with existing resource framework
Test Coverage Improvements
- 26 new OAuth integration tests (basic, endpoints, full flows)
- PKCE validation test coverage
- Storage lifecycle tests
- Authorization and token endpoint integration tests
- Improved overall patch coverage
Bug Fixes
- Fixed
_metafield in Tool struct doctest example - Fixed OAuth doctests compilation errors
- Added inotify dependency for Linux filesystem monitoring
- Fixed Docker validation build to include conformance-tests
Breaking Changes
None - all changes are additive.
Migration Guide
To use OAuth 2.1 authentication in your MCP server:
```rust
use pulseengine_mcp_auth::oauth::{OAuthState, oauth_router};
let oauth_state = OAuthState::new_in_memory();
let router = oauth_router().with_state(oauth_state);
```
See the documentation for complete integration examples.
Full Changelog: v0.13.0...v0.14.0
Validation Results
✅ All validation tests passed
✅ Python SDK compatibility verified
✅ JSON-RPC 2.0 compliant
✅ MCP protocol compliant
v0.13.0 - JSON Serialization Fix
🔧 Breaking Changes
Fixed: mcp_tools macro now uses JSON serialization (#62)
The #[mcp_tools] macro previously used Rust's Debug format ({:?}) instead of JSON serialization, causing tool responses to contain Rust debug format instead of proper JSON. This has been fixed.
Before:
{
"content": [{
"type": "text",
"text": "SearchResult { items: [...] }"
}]
}After:
{
"content": [{
"type": "text",
"text": "{\"items\":[...]}"
}],
"structured_content": {"items": [...]}
}📦 Migration Required
Tool return types should implement Serialize trait for optimal JSON output:
#[derive(Debug, Serialize)] // Add Serialize
struct MyResult {
data: Vec<String>,
}
#[mcp_tools]
impl MyServer {
pub fn my_tool(&self) -> MyResult {
MyResult { data: vec!["item1".to_string()] }
}
}Types without Serialize will gracefully fall back to Debug format.
✨ What's Changed
mcp-macros
- ✅ Modified
generate_error_handling()to useserde_json::to_string()instead offormat!("{:?}") - ✅ Now populates
structured_contentfield per MCP 2025-06-18 specification - ✅ Graceful fallback to Debug format for types without Serialize trait
- ✅ Added comprehensive test suite (8 tests) covering all scenarios
Testing
- New:
json_serialization_test.rswith 8 comprehensive tests- Structured types (nested structs, vectors)
Result<T, E>return types- Simple types (string, number, bool, vector)
- Verification of
structured_contentfield population - Verification that Debug format markers are absent
📋 MCP Specification Compliance
This release ensures full compliance with MCP 2025-06-18 specification:
- ✅ Tool responses use proper JSON serialization
- ✅
structured_contentfield is populated for structured types - ✅ Both text content and structured_content contain equivalent data
📦 Published Crates (v0.13.0)
All workspace crates updated to v0.13.0:
pulseengine-mcp-protocol- Core MCP protocol typespulseengine-mcp-logging- Logging infrastructurepulseengine-mcp-auth- Authentication/authorizationpulseengine-mcp-security- Security middlewarepulseengine-mcp-security-middleware- Security middleware layerpulseengine-mcp-monitoring- Metrics collectionpulseengine-mcp-transport- Transport layers (stdio/HTTP/WebSocket)pulseengine-mcp-cli- CLI frameworkpulseengine-mcp-cli-derive- CLI derive macrospulseengine-mcp-server- Server orchestrationpulseengine-mcp-macros- Procedural macrospulseengine-mcp-external-validation- External validation tools
🔗 Links
- Issue Fixed: #62
- Pull Request: #63
- Full Changelog: CHANGELOG.md
📚 Documentation
See CHANGELOG.md for detailed migration guide and full release notes.
Validation Results
✅ All validation tests passed
✅ Python SDK compatibility verified
✅ JSON-RPC 2.0 compliant
✅ MCP protocol compliant
v0.12.0 - MCP 2025-06-18 Specification Update
What's Changed
MCP 2025-06-18 Protocol Updates
- ✅ Update to MCP 2025-06-18 specification
- ✅ Add
NumberOrStringtype for request IDs - ✅ Add optional metadata fields (
_meta) to Content and CallToolResult - ✅ Add optional fields (title, annotations, icons) to Tools, Prompts, Resources
- ✅ Update all test assertions to match new protocol types
CI/CD Improvements
- ✅ Fix CI validation (formatting and clippy warnings)
- ✅ Update pre-commit hooks to match CI requirements exactly
- ✅ Add
serial_testto prevent flaky env variable test failures - ✅ All tests pass with new protocol compliance
Breaking Changes
NumberOrString type instead of Value
Installation
cargo add [email protected]
cargo add [email protected]
cargo add [email protected]Full Changelog: v0.11.0...v0.12.0
Validation Results
✅ All validation tests passed
✅ Python SDK compatibility verified
✅ JSON-RPC 2.0 compliant
✅ MCP protocol compliant
v0.11.0 - MCP 2025-06-18 Specification Update
What's Changed
MCP 2025-06-18 Protocol Updates
- ✅ Update to MCP 2025-06-18 specification
- ✅ Add NumberOrString type for request IDs
- ✅ Add optional metadata fields () to Content and CallToolResult
- ✅ Add optional fields (title, annotations, icons) to Tools, Prompts, Resources
- ✅ Update all test assertions to match new protocol types
CI/CD Improvements
- ✅ Fix CI validation (formatting and clippy warnings)
- ✅ Update pre-commit hooks to match CI requirements exactly
- ✅ All tests pass with new protocol compliance
Breaking Changes
Installation
cargo add pulseengine-mcp-server
cargo add pulseengine-mcp-protocol
cargo add pulseengine-mcp-transportFull Changelog: v0.10.0...v0.11.0
Validation Results
✅ All validation tests passed
✅ Python SDK compatibility verified
✅ JSON-RPC 2.0 compliant
✅ MCP protocol compliant
PulseEngine MCP v0.10.1 - Fixed Schema Generation
PulseEngine MCP v0.10.1 - Fixed Schema Generation
🔧 Bug Fixes
- Fixed parameter schema generation regression in v0.10.0 - Resolved issue where parameter schemas were showing empty objects instead of proper JsonSchema-derived schemas
- Dual-pattern parameter support - Now supports both multi-parameter (auto-generated schemas) and JsonSchema struct patterns (rich schemas) seamlessly
- Improved schema validation - Enhanced parameter validation for MCP clients
📦 Published Crates
All framework crates have been published to crates.io:
pulseengine-mcp-protocol v0.10.1pulseengine-mcp-logging v0.10.1pulseengine-mcp-auth v0.10.1pulseengine-mcp-security v0.10.1pulseengine-mcp-security-middleware v0.10.1pulseengine-mcp-monitoring v0.10.1pulseengine-mcp-transport v0.10.1pulseengine-mcp-server v0.10.1pulseengine-mcp-macros v0.10.1pulseengine-mcp-cli-derive v0.10.1pulseengine-mcp-cli v0.10.1
🚀 Pattern Examples
Multi-parameter (Auto-generated schema)
pub fn multi_param_tool(&self, name: String, age: u32, active: bool) -> String {
format!("Name: {name}, Age: {age}, Active: {active}")
}JsonSchema struct (Rich schema)
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct RichParams {
/// Required message with description
pub message: String,
/// Optional count with validation
pub count: Option<u32>,
}
pub fn rich_struct_tool(&self, params: RichParams) -> String {
format!("Message: {}, Count: {:?}", params.message, params.count)
}🔄 Migration
This is a non-breaking release. Existing code using either pattern will continue to work without changes.
📝 Full Changelog
- Fix schema generation regression from v0.10.0 (#55)
- Implement dual-pattern parameter support
- Add comprehensive test coverage for both patterns
- Update all examples and documentation
- Maintain backward compatibility
🤖 Generated with Claude Code
Co-Authored-By: Claude [email protected]
v0.10.0: Parameterized Resources Support
🚀 New Features
Parameterized Resource Support
- 🎯 URI Template Processing: Added support for parameterized resources using URI templates (RFC 6570)
- ⚡ High-Performance Routing: Implemented matchit-based URI routing with radix trie for efficient resource resolution
- 🔧 Automatic Parameter Extraction: Resources can now extract parameters from URIs like
timedate://current-time/{timezone} - 📝 Enhanced Macro Support: Updated
#[mcp_resource]attribute to handle parameterized URIs seamlessly
Technical Improvements
- 🛠️ Router Generation: Static router generation with
OnceLockfor optimal performance - 🔀 Pattern Matching: Convert URI templates to matchit patterns for precise routing
- ⚙️ Parameter Mapping: Automatic extraction and mapping of URI parameters to method arguments
🐛 Bug Fixes
- ✅ Resource Delegation: Fixed critical bug in
mcp_servermacro where resources weren't properly delegated - 🎨 Code Quality: Resolved clippy warnings and formatting issues
- 🔧 Dependency Updates: Added matchit dependency for URI routing
📖 Examples
Resources can now handle dynamic URIs:
#[mcp_resource("timedate://current-time/{timezone}")]
pub async fn get_current_time(&self, timezone: String) -> Result<TimeResponse> {
// timezone parameter is automatically extracted from the URI
}🎉 What's Next
- Type-safe parameter conversion (planned for future release)
- Enhanced parameter validation
- Support for complex URI patterns
Full Changelog: v0.9.1...v0.10.0
v0.9.1 - Critical Resource Delegation Fix
v0.9.1 - Emergency Patch Release
This is a critical bug fix release that addresses a fundamental issue with MCP resources in v0.9.0.
Critical Fix
- Resource delegation bug: Fixed the
mcp_servermacro to properly delegate resource operations to theMcpResourcesProvidertrait - Resources are now fully functional and visible in MCP Inspector
What was broken in v0.9.0
The v0.9.0 release introduced a major regression where:
- Resources were advertised in server capabilities but completely non-functional
- The
mcp_servermacro was not delegatinglist_resourcesandread_resourcecalls to the trait implementation - This resulted in empty resource lists and "unknown resource" errors for all resource requests
Technical Details
- Modified
McpResourcesProvidertrait to always be implemented (similar toMcpToolsProvider) - Updated helper methods to properly delegate to trait implementations
- Ensured compilation works for servers without resources defined
Breaking Changes
None - this is a pure bug fix that restores intended functionality.
Upgrade Instructions
Update your Cargo.toml dependencies from 0.9.0 to 0.9.1:
pulseengine-mcp-server = "0.9.1"
pulseengine-mcp-macros = "0.9.1"
# ... other framework cratesResources that were defined but not working in v0.9.0 will now function correctly.
Note: Parameterized resources still use hardcoded values - this will be addressed in a future release.
v0.9.0: Complete MCP Resource Integration with Modern Macro Patterns
🎯 PulseEngine MCP Framework v0.9.0
This release introduces comprehensive MCP resource support alongside significant improvements to the macro system and framework capabilities.
✨ Major Features
🔗 MCP Resource Integration
- Complete MCP resource implementation with
#[mcp_resource]macro - URI template support for parameterized resources (e.g.,
timedate://current-time/{timezone}) - Automatic resource discovery and registration
- Read-only data access pattern differentiated from tools
- Resource listing via
resources/listand reading viaresources/read
🛠 Enhanced Macro System
- Modern macro patterns with improved error handling
- Generic type support for MCP servers (
GenericServer<T>) - Comprehensive trait delegation with runtime detection
- Improved clippy compliance and formatting standards
- Fixed helper method generation for test compatibility
🏗 Framework Improvements
- Panic-catching resource trait delegation
- Enhanced error handling and validation
- Improved CI/CD pipeline with comprehensive testing
- Updated template MCP server with resource examples
- Complete documentation for tools vs resources distinction
📦 Published Crates
All framework crates published to crates.io:
| Crate | Version | Purpose |
|---|---|---|
pulseengine-mcp-protocol |
v0.9.0 | Core MCP protocol types & validation |
pulseengine-mcp-logging |
v0.9.0 | Structured logging & tracing |
pulseengine-mcp-security |
v0.9.0 | Security validation & monitoring |
pulseengine-mcp-monitoring |
v0.9.0 | Performance & health monitoring |
pulseengine-mcp-auth |
v0.9.0 | Authentication & authorization |
pulseengine-mcp-transport |
v0.9.0 | Transport layer implementations |
pulseengine-mcp-server |
v0.9.0 | Core MCP server framework |
pulseengine-mcp-macros |
v0.9.0 | Procedural macros & code generation |
pulseengine-mcp-cli-derive |
v0.9.0 | CLI derive macros |
pulseengine-mcp-cli |
v0.9.0 | CLI utilities & tooling |
🔧 Technical Improvements
- ✅ Fixed clippy warnings and formatting issues
- ✅ Enhanced generic support in macros
- ✅ Improved trait bound handling
- ✅ Better error propagation and handling
- ✅ Comprehensive test coverage
📚 Documentation & Templates
- 📖 Updated template MCP server with resource examples
- 📖 Complete tools vs resources distinction guide
- 📖 URI template documentation and examples
- 📖 Integration examples with MCP Inspector
🚀 Getting Started
Add the framework to your Cargo.toml:
[dependencies]
pulseengine-mcp-server = "0.9.0"
pulseengine-mcp-macros = "0.9.0"Example with resources:
use pulseengine_mcp_macros::{mcp_server, mcp_tools, mcp_resource};
#[mcp_server(name = "My Server")]
#[derive(Clone)]
pub struct MyServer;
#[mcp_tools]
impl MyServer {
/// A tool that performs an action
pub async fn my_tool(&self, input: String) -> anyhow::Result<String> {
Ok(format\!("Processed: {}", input))
}
/// A resource that provides read-only data
#[mcp_resource(
uri_template = "my-server://data/{id}",
name = "server_data",
description = "Server data by ID"
)]
pub async fn get_data(&self, id: String) -> anyhow::Result<MyData> {
// Return data for the given ID
}
}🎉 What's Next
This release represents a major milestone in MCP framework development, providing complete resource support while maintaining full backward compatibility.
View the full changelog and migration guide →
Install: cargo install pulseengine-mcp-cli
Template: Use our template repository to get started
Docs: Framework Documentation
MCP Spec: Model Context Protocol
Release v0.8.2 - Working #[mcp_tools] Macro
Summary
This release includes a fully working #[mcp_tools] macro with comprehensive test coverage and CI validation.
Key Changes
- ✅ Fixed #[mcp_tools] macro implementation and all test compilation errors
- ✅ Updated pre-commit hooks to align with CI expectations
- ✅ Resolved all clippy warnings and formatting issues
- ✅ All CI checks now passing (Code Coverage, External Validation, PR Validation, Docker Validation)
Test Improvements
- Fixed over 50 test servers missing #[mcp_tools] implementations
- Updated method calls from deprecated to current API
- Fixed return types for Display trait compatibility
- Updated tool discovery tests to match current macro behavior
Published Packages
All core packages have been published to crates.io:
- pulseengine-mcp-protocol v0.8.2
- pulseengine-mcp-logging v0.8.2
- pulseengine-mcp-auth v0.8.2
- pulseengine-mcp-security v0.8.2
- pulseengine-mcp-monitoring v0.8.2
- pulseengine-mcp-transport v0.8.2
- pulseengine-mcp-server v0.8.2
- pulseengine-mcp-macros v0.8.2
- pulseengine-mcp-cli-derive v0.8.2
- pulseengine-mcp-cli v0.8.2