Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat: Add prompt support by snowmead · Pull Request #351 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Add prompt support by snowmead · Pull Request #351 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Add prompt support by snowmead · Pull Request #351 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat: Add prompt support by snowmead · Pull Request #351 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Add prompt support by snowmead · Pull Request #351 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Add prompt support by snowmead · Pull Request #351 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat: Add prompt support by snowmead · Pull Request #351 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

feat: Add prompt support - #351

Merged
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support
Aug 21, 2025
Merged

feat: Add prompt support#351
4t145 merged 5 commits into
modelcontextprotocol:mainfrom
snowmead:feature/prompt-support

Conversation

@snowmead

@snowmeadsnowmead commented Aug 4, 2025

Copy link
Copy Markdown
Contributor

Add Prompt Support

This PR introduces a complete prompt system for the MCP Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification for prompts and provides a developer-friendly API through procedural macros.

Key Features

🎯 Core Functionality

  • Prompt Macros: #[prompt], #[prompt_router], and #[prompt_handler] for easy prompt definition
  • Type-Safe Parameters: Automatic JSON schema generation from Rust types with compile-time validation
  • Unified Architecture: Shared parameter extraction infrastructure between tools and prompts
  • Flexible Handlers: Support for async/sync methods, standalone functions, and closures

🔧 Technical Improvements

  • Extracted Parameters<T> wrapper to dedicated module for better organization
  • Unified trait system using FromContextPart for both tools and prompts (removed duplicate traits)
  • Enhanced Json<T> wrapper with structured output support via IntoCallToolResult
  • Improved error messages with descriptive panics for schema serialization failures
  • Clean architecture with shared extractors reducing code duplication by ~300 lines

Implementation Details

Macro Support

#[prompt(description = "Generate code based on requirements")]asyncfncode_generator(params:Parameters<CodeRequest>) -> Vec<PromptMessage>{// Type-safe parameter handling with automatic validation}

Router Integration

#[prompt_router]implMyServer{#[prompt]asyncfngreeting_prompt(&self,params:Parameters<Args>) -> Vec<PromptMessage>{// Automatically registered in router}}

File Structure

  • crates/rmcp-macros/src/prompt*.rs - Macro implementations
  • crates/rmcp/src/handler/server/prompt.rs - Core prompt handling logic
  • crates/rmcp/src/handler/server/wrapper/parameters.rs - Unified parameter extraction
  • examples/servers/src/prompt_stdio.rs - Complete working example

Testing

  • Comprehensive test coverage with 5 new test files
  • Integration tests validating prompt discovery, invocation, and parameter handling
  • Example server demonstrating real-world usage patterns

Breaking Changes

None - The refactoring maintains backward compatibility while unifying the internal architecture.

Migration Guide

For users implementing custom extractors:

  • Replace FromToolCallContextPart with FromContextPart<ToolCallContext>
  • Replace FromPromptContextPart with FromContextPart<PromptContext>
  • Update imports from handler::server::tool::Parameters to handler::server::wrapper::Parameters

Examples

See examples/servers/src/prompt_stdio.rs for a complete implementation including:

  • Weather prompts with typed parameters
  • Code generation templates
  • Data analysis prompts
  • Custom argument validation

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

@github-actionsgithub-actionsBot added T-documentation Documentation improvements T-dependencies Dependencies related changes T-test Testing related changes T-config Configuration file changes T-core Core library changes T-examples Example code changes T-handler Handler implementation changes T-macros Macro changes labels Aug 4, 2025
@4t145
4t145 requested a review from CopilotAugust 14, 2025 07:08

This comment was marked as outdated.

Comment threadcrates/rmcp/src/handler/server/tool.rs Outdated
Comment threadcrates/rmcp/src/service.rs
Comment threadcrates/rmcp/src/handler/server/common.rs Outdated
Comment threadexamples/servers/Cargo.toml
Comment threadexamples/servers/Cargo.toml Outdated
@4t145

4t145 commented Aug 14, 2025

Copy link
Copy Markdown
Contributor

And you can use just fix before commit, this will fix the format and clippy error.

@snowmead
snowmeadforce-pushed the feature/prompt-support branch from c88a7c1 to 45ae1b9CompareAugust 19, 2025 14:23
@snowmead
snowmead requested a review from 4t145August 19, 2025 20:43
@4t145
4t145 requested a review from CopilotAugust 20, 2025 03:49

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces comprehensive prompt support to the Rust SDK, enabling servers to provide reusable prompt templates that LLMs can discover and use. The implementation follows the MCP specification and provides a developer-friendly API through procedural macros.

  • Adds complete prompt system with #[prompt], #[prompt_router], and #[prompt_handler] macros for type-safe parameter handling
  • Refactors parameter extraction infrastructure to be shared between tools and prompts, reducing code duplication
  • Enhances JSON wrapper with structured output support and improved error handling

Reviewed Changes

Copilot reviewed 43 out of 43 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
examples/servers/src/prompt_stdio.rsNew comprehensive example server demonstrating prompt functionality
crates/rmcp-macros/src/prompt*.rsNew macro implementations for prompt support
crates/rmcp/src/handler/server/prompt.rsCore prompt handling logic and trait implementations
crates/rmcp/src/handler/server/wrapper/parameters.rsUnified parameter extraction infrastructure
examples/*/calculator.rsUpdated imports to use new unified parameter location
crates/rmcp/tests/test_prompt_*.rsComprehensive test coverage for prompt functionality
Comments suppressed due to low confidence (2)

crates/rmcp/src/service.rs:165

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<R::Resp, McpError>>;

crates/rmcp/src/service.rs:170

  • The lifetime parameter should be explicit to avoid potential lifetime issues. Using BoxFuture<'_, ...> instead of BoxFuture<...> could lead to compilation issues in certain contexts.
 ) -> BoxFuture<'_, Result<(), McpError>>;

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment threadexamples/servers/src/prompt_stdio.rs Outdated
Comment threadexamples/servers/src/prompt_stdio.rs
Comment threadcrates/rmcp/tests/test_with_python/test_with_python.egg-info/PKG-INFO Outdated
@4t145

Copy link
Copy Markdown
Contributor

And please fix the document ci

@snowmeadsnowmead changed the title feat: Add prompt support with typed argument handlingfeat: Add prompt supportAug 20, 2025
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
@snowmead
snowmeadforce-pushed the feature/prompt-support branch from 86e812b to ad7b2d9CompareAugust 20, 2025 15:11
@snowmead

Copy link
Copy Markdown
ContributorAuthor

Note: Had to force push to change the commit messages to pass commitlint

@4t1454t145 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@4t145
4t145 merged commit 9349f5c into modelcontextprotocol:mainAug 21, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 21, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
* feat: add prompt support with typed argument handling
- Implement #[prompt], #[prompt_router], and #[prompt_handler] macros
- Add automatic JSON schema generation from Rust types for arguments
- Support flexible async handler signatures with automatic adaptation
- Create PromptRouter for efficient prompt dispatch
- Include comprehensive tests and example implementation
This enables MCP servers to provide reusable prompt templates that
LLMs can discover and invoke with strongly-typed parameters, similar
to the existing tool system but optimized for prompt use cases.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: unify parameter handling between tools and prompts
- Replace Arguments<T> with Parameters<T> for consistent API
- Create shared common module for tool/prompt utilities
- Modernize async handling with futures::future::BoxFuture
- Move cached_schema_for_type to common module for reuse
- Update error types from rmcp::Error to rmcp::ErrorData
- Add comprehensive trait implementations for parameter extraction
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: extract Parameters wrapper to shared module and unify trait usage
- Move Parameters type from common.rs to dedicated wrapper/parameters.rs module
- Unify extractor traits by using FromContextPart for both tools and prompts
- Remove duplicate FromToolCallContextPart and FromPromptContextPart traits
- Add structured output support to Json wrapper with IntoCallToolResult impl
- Improve error messages with more descriptive panic for schema serialization
- Update all imports across codebase to use new module path
- Clean up trailing whitespace and formatting inconsistencies
This consolidates parameter extraction logic and reduces code duplication
between tool and prompt handlers while maintaining backward compatibility.
* chore: remove committed .egg-info directory and update gitignore
* docs: fix documentation formatting
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-dependenciesDependencies related changesT-documentationDocumentation improvementsT-examplesExample code changesT-handlerHandler implementation changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@snowmead@4t145