Skip to content

Conversation

@4t145
Copy link
Collaborator

@4t145 4t145 commented Aug 14, 2025

  1. remove unnecessary schema validation
  2. add a method directly convert the structured output into typed data.

Motivation and Context

We don't really need to do the validation in rust, because deserilization already is a validation. And if user want to do the validation, they can use the jsonschame crate.

And also, the original validation method is a wrong implementation, as I mentioned in #374

How Has This Been Tested?

Breaking Changes

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

Additional context

@github-actions github-actions bot added T-test Testing related changes T-core Core library changes T-handler Handler implementation changes labels Aug 14, 2025
@4t145
Copy link
Collaborator Author

4t145 commented Aug 14, 2025

@ccamel55 please review this. I didn't notice the problem when I merge the pr.

Copy link
Contributor

Copilot AI left a comment

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 removes unnecessary JSON schema validation from the tool system and introduces a type-safe conversion method for structured outputs. The changes eliminate redundant validation since Rust's deserialization already provides type safety, and replace it with a more idiomatic approach.

Key changes:

  • Removes schema validation functions and related validation logic
  • Adds into_typed() method to CallToolResult for type-safe conversion of structured content
  • Updates tests to use the new type-safe approach instead of validation

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
crates/rmcp/src/model.rs Replaces validation method with into_typed() for type-safe conversion and simplifies deserialization validation
crates/rmcp/src/handler/server/tool.rs Removes schema validation functions (validate_against_schema and get_json_value_type)
crates/rmcp/src/handler/server/router/tool.rs Removes schema validation logic from tool call execution
crates/rmcp/tests/test_structured_output.rs Updates test to use new into_typed() method instead of validation

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

if let Some(text) = raw_text {
return serde_json::from_str(text);
}
serde_json::from_value(serde_json::Value::Null)
Copy link

Copilot AI Aug 14, 2025

Choose a reason for hiding this comment

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

This line will always attempt to deserialize null into type T, which will likely fail for most types. Consider returning an error indicating that no structured content or valid text content was found instead of trying to deserialize null.

Suggested change
serde_json::from_value(serde_json::Value::Null)
Err(serde_json::Error::custom("No structured content or valid text content found"))

Copilot uses AI. Check for mistakes.
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
let text = &text.text;
Some(text)
Copy link

Copilot AI Aug 14, 2025

Choose a reason for hiding this comment

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

[nitpick] The logic for extracting content could be simplified. The current implementation checks for text content only in the first element of the content array. Consider making this behavior more explicit or handling multiple content items if that's the intended behavior.

Suggested change
Some(text)
// Collect all text content from the vector
let texts: Vec<&str> = contents.iter()
.filter_map(|c| c.as_text().map(|t| t.text.as_str()))
.collect();
if !texts.is_empty() {
// Concatenate all text content with a space separator
Some(texts.join(" "))

Copilot uses AI. Check for mistakes.
let raw_text = match (self.structured_content, &self.content) {
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
Copy link

Copilot AI Aug 14, 2025

Choose a reason for hiding this comment

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

The method only considers the first content item when extracting text. This behavior should be documented in the method's docstring to clarify that only the first text content will be used for deserialization.

Copilot uses AI. Check for mistakes.
Copy link
Contributor

@ccamel55 ccamel55 left a comment

Choose a reason for hiding this comment

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

LGTM but wouldn't this technically be a breaking change since it removes public facing API? I'll leave it to the maintainers to to decide though 😄

@4t145
Copy link
Collaborator Author

4t145 commented Aug 14, 2025

@ccamel55 It's ok to introduce breaking changes, we haven't release the deleted api.

Copy link
Collaborator

@jokemanfire jokemanfire left a comment

Choose a reason for hiding this comment

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

It can be Deserialized , so it is structed json data, If I understand it ?

@4t145 4t145 merged commit 1555c0f into modelcontextprotocol:main Aug 15, 2025
11 checks passed
@github-actions github-actions bot mentioned this pull request Aug 13, 2025
@snowmead snowmead mentioned this pull request Aug 19, 2025
9 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-core Core library changes T-handler Handler implementation changes T-test Testing related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants