Releases: pulseengine/mcp
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_content
field 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.rs
with 8 comprehensive tests- Structured types (nested structs, vectors)
Result<T, E>
return types- Simple types (string, number, bool, vector)
- Verification of
structured_content
field 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_content
field 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
NumberOrString
type 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_test
to 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-transport
Full 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.1
pulseengine-mcp-logging v0.10.1
pulseengine-mcp-auth v0.10.1
pulseengine-mcp-security v0.10.1
pulseengine-mcp-security-middleware v0.10.1
pulseengine-mcp-monitoring v0.10.1
pulseengine-mcp-transport v0.10.1
pulseengine-mcp-server v0.10.1
pulseengine-mcp-macros v0.10.1
pulseengine-mcp-cli-derive v0.10.1
pulseengine-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
OnceLock
for 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_server
macro 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_server
macro to properly delegate resource operations to theMcpResourcesProvider
trait - 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_server
macro was not delegatinglist_resources
andread_resource
calls to the trait implementation - This resulted in empty resource lists and "unknown resource" errors for all resource requests
Technical Details
- Modified
McpResourcesProvider
trait 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 crates
Resources 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/list
and 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
Release v0.8.1
Release v0.8.1
🚀 New Features & Improvements
CI/CD Optimizations
- Optimized CI workflow - Reduced external validation CI time from 45+ minutes to ~20-25 minutes
- Fast validation for PRs - Ubuntu-only validation for faster feedback
- Parallel compilation - Added
--jobs
flag for faster builds - Conditional CI jobs - Python SDK and security validation only run on main branch/schedule
Framework Enhancements
- Complete auth parameter support in macros - Enhanced
#[mcp_tools]
macro with full authentication parameter handling - Improved error handling - Fixed unused variable warnings in auth storage module
- Better dependency management - Added missing
anyhow
dependency
Developer Experience
- Enhanced formatting - Fixed code formatting and extended pre-commit hooks
- Better CI feedback - Improved error messages and validation reporting
🛠️ Technical Changes
- Add
--workspace
flag required for--exclude
in cargo test commands - Implement complete auth parameter support in procedural macros
- Optimize CI matrix strategy for better resource utilization
- Enhanced caching strategy with Rust version-specific cache keys
📦 Published Packages
All framework packages have been updated to v0.8.1:
pulseengine-mcp-protocol
v0.8.1pulseengine-mcp-auth
v0.8.1pulseengine-mcp-security
v0.8.1pulseengine-mcp-monitoring
v0.8.1pulseengine-mcp-transport
v0.8.1pulseengine-mcp-server
v0.8.1pulseengine-mcp-macros
v0.8.1pulseengine-mcp-cli
v0.8.1pulseengine-mcp-cli-derive
v0.8.1
🔄 Migration Notes
This is a patch release with no breaking changes. Simply update your dependencies to v0.8.1.
[dependencies]
pulseengine-mcp-server = "0.8.1"
Release v0.8.0 - Framework Simplification and Major API Improvements
🚀 Release v0.8.0 - Framework Simplification and Major API Improvements
This major release brings significant framework simplifications, improved CI/CD infrastructure, and enhanced developer experience through streamlined APIs and comprehensive testing improvements.
🎯 Major Features & Improvements
Framework Simplification
- 93% Code Reduction: Massive simplification of the framework architecture
- Streamlined APIs: Simplified server creation with intuitive builder patterns
- Enhanced Macros: Improved procedural macros for server and tool definitions
- Better Developer Experience: Reduced boilerplate and clearer API surface
Infrastructure & CI/CD
- Robust CI Pipeline: Comprehensive testing across multiple platforms
- Docker Support: Full containerization support with optimized builds
- Code Coverage: Integrated coverage reporting and quality gates
- Security Scanning: Enhanced security validation and dependency auditing
Testing & Quality
- Comprehensive Test Suite: Extensive test coverage across all components
- UI Testing: Complete UI test infrastructure for macro validation
- Integration Tests: End-to-end testing scenarios
- Performance Tests: Benchmarking and performance validation
📦 Published Crates
All crates have been published to crates.io in dependency order:
pulseengine-mcp-logging
v0.8.0pulseengine-mcp-protocol
v0.8.0pulseengine-mcp-auth
v0.8.0pulseengine-mcp-security
v0.8.0pulseengine-mcp-monitoring
v0.8.0pulseengine-mcp-transport
v0.8.0pulseengine-mcp-server
v0.8.0pulseengine-mcp-macros
v0.8.0pulseengine-mcp-cli-derive
v0.8.0pulseengine-mcp-cli
v0.8.0
🛠️ Technical Improvements
API Changes
- Simplified server builder patterns
- Enhanced macro-based server definitions
- Streamlined configuration management
- Improved error handling and reporting
Build System
- Optimized dependency management
- Enhanced build performance
- Better crate separation and modularity
- Improved documentation generation
Development Tools
- Enhanced CLI tooling
- Better debugging support
- Improved logging and monitoring
- Streamlined development workflow
📋 Migration Guide
For users upgrading from previous versions, key changes include:
- Server Creation: Use the new simplified builder patterns
- Macro Usage: Updated macro syntax for server and tool definitions
- Configuration: Streamlined configuration management
- Dependencies: Updated crate dependencies and feature flags
🙏 Acknowledgments
This release represents a significant milestone in the PulseEngine MCP Framework evolution, made possible through extensive refactoring, testing, and community feedback.
For detailed migration guides and documentation, visit our documentation site.