feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@shorwood@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

feat(model): add json schema generation support for all model types - #176

Merged
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema
May 15, 2025
Merged

feat(model): add json schema generation support for all model types#176
4t145 merged 3 commits into
modelcontextprotocol:mainfrom
shorwood:shorwood/schemars-json-schema

Conversation

@shorwood

@shorwoodshorwood commented May 14, 2025

Copy link
Copy Markdown
Contributor

This commit adds JSON Schema support for all model types by implementing schemars::JsonSchema trait. The feature is gated behind the new schemars feature flag. This enables automatic schema generation for API documentation and validation purposes. Added tests to verify schema generation for client and server JSON-RPC messages.

Motivation and Context

This change facilitates schema-driven tooling, enabling better API validation, documentation generation, and integration with OpenAPI-based systems. It addresses the need for structured metadata across all model types.

How Has This Been Tested?

  • Unit tests were added to ensure correct schema generation.
  • Verified against example client and server JSON-RPC message structures.
  • Tests were added for two representative schema types: client and server JSON-RPC messages.
  • These types were selected because they internally reference all supported model subtypes, ensuring comprehensive schema coverage.

Breaking Changes

No breaking changes. The new feature is opt-in and does not affect default builds.

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

The schemars feature is isolated for minimal impact. Feel free to suggest improvements or additional test scenarios.

Comment threadcrates/rmcp/src/model/extension.rs Outdated
}

fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
generator.subschema_for::<serde_json::Value>()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unsure about this, feel free to suggest improvements.

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.

There's no need to implement JsonSchema for extensions.

@shorwoodshorwoodMay 15, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

You're right, I adjusted some models like so:

#[schemars(skip)]pub extensions:Extensions,

Ok with this ?

@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 3c6ebb4 to 330dfc4CompareMay 14, 2025 17:05
@4t145
4t145 requested a review from CopilotMay 15, 2025 02:06

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 implements JSON Schema support for all model types by adding the schemars::JsonSchema derive where applicable and updating tests to verify schema generation.

  • Adds JSON Schema derivations on all model structs and enums via cfg_attr.
  • Introduces new tests that compare generated schema against expected JSON files.
  • Updates Cargo.toml to include schemars with additional features and test configuration.

Reviewed Changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

FileDescription
crates/rmcp/tests/test_message_schema.rsAdds tests for JSON schema generation of client/server JSON-RPC messages.
crates/rmcp/src/model/*Updates model definitions to derive JsonSchema when the schemars feature is enabled.
crates/rmcp/Cargo.tomlAdds and configures the schemars dependency with extra features.
README.mdDocuments the newly added schemars feature.

let schema = schema_for!(ClientJsonRpcMessage);
let schema_str = serde_json::to_string_pretty(&schema).unwrap();
let expected = std::fs::read_to_string("tests/test_message_schema/client_json_rpc_message_schema.json").unwrap();
assert_eq!(schema_str, expected, "Schema generation for ClientJsonRpcMessage should match expected output");

CopilotAIMay 15, 2025

Copy link

Choose a reason for hiding this comment

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

Comparing the formatted JSON schema as a string can be brittle due to potential whitespace or key ordering differences. Instead, parse both 'schema_str' and 'expected' into JSON values and compare those for a more robust test.

Suggested change
assert_eq!(schema_str, expected,"Schema generation for ClientJsonRpcMessage should match expected output");
let schema_json: serde_json::Value = serde_json::from_str(&schema_str).unwrap();
let expected_json: serde_json::Value = serde_json::from_str(&expected).unwrap();
assert_eq!(schema_json, expected_json,"Schema generation for ClientJsonRpcMessage should match expected output");

Copilot uses AI. Check for mistakes.

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.

That's reasonable

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done :)

@4t145

Copy link
Copy Markdown
Contributor

Looks good to me. Just need to fix CI and suggestions from coplilot, please.

This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from f7c895a to 35976a6CompareMay 15, 2025 15:47
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
@shorwood
shorwoodforce-pushed the shorwood/schemars-json-schema branch from 35976a6 to e211254CompareMay 15, 2025 15:49
@4t145
4t145 merged commit e9a5ae9 into modelcontextprotocol:mainMay 15, 2025
@4t145

Copy link
Copy Markdown
Contributor

Merged, thank you for PR!

@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…odelcontextprotocol#176)
* feat(model): add json schema generation support for all model types
This commit adds JSON Schema support for all model types by implementing
`schemars::JsonSchema` trait. The feature is gated behind the new
`schemars` feature flag. This enables automatic schema generation for
API documentation and validation purposes. Added tests to verify schema
generation for client and server JSON-RPC messages.
* fix(model): add manual json schema implementation for `NumberOrString`
This commit adds a manual implementation of `JsonSchema` trait for the
`NumberOrString` enum to properly represent its union type nature in
JSON Schema. The schema now correctly specifies that the type can be
either a number or a string using the `oneOf` validation keyword.
* fix(model): skip extensions field in json schema generation
The `Extensions` type was incorrectly included in JSON schema
generation, which could lead to confusing API documentation. This commit
adds `#[schemars(skip)]` attribute to all `extensions` fields in request
and notification structs, and removes the manual `JsonSchema`
implementation for the `Extensions` type since it's an internal
implementation detail that shouldn't be exposed in the schema.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@shorwood@4t145