feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock
, '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(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock
, '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(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock
, '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(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock
, '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(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock
, '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(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock
, '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(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock
, '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(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements - #539

Merged
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema
Dec 24, 2025
Merged

feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvements#539
alexhancock merged 1 commit into
modelcontextprotocol:mainfrom
pbezglasny:feat/sep-1330-elicitation-enum-schema

Conversation

@pbezglasny

@pbezglasnypbezglasny commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Implemented #524 Elicitation Enum Schema Improvements and Standards Compliance.

Motivation and Context

SEP-1330: Elicitation Enum Schema Improvements introduce new schema for enum type for elicitation. This PR implements its specifications: single/multi select options with/without titles.

Details:

  • Introduced new model struct to match required schema
  • Old response move to Legacy struct
  • Added builder to configure enum schema
  • New elicitation enum structs support default values required by Implement SEP-1034: Default Values for Elicitation Schemas #521
  • Now it's possible to use next structs for elicitation request with some hacks:
#[derive(Debug,Serialize,Deserialize,JsonSchema,Default)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]// schemars does not provide required type field for enums, so we extend it here#[schemars(extend("type" = "string"))]enumTitledEnum{#[schemars(title = "Title for the first value")]#[default]FirstValue,#[schemars(title = "Title for the second value")]SecondValue,}#[derive(Debug,Serialize,Deserialize,JsonSchema)]// inline attribute required to work for schema inference in elicitation forms#[schemars(inline)]enumUntitledEnum{First,Second,Third,}fndefault_untitled_multi_select() -> Vec<UntitledEnum>{vec![UntitledEnum::Second,UntitledEnum::Third]}#[derive(Debug,Serialize,Deserialize,JsonSchema)]#[schemars(description = "User information")]structSelectEnumForm{pubsingle_select_untitled:UntitledEnum,#[schemars( title = "Single Select Titled", description = "Description for single select enum",default)]pubsingle_select_titled:TitledEnum,#[serde(default = "default_untitled_multi_select")]pubmulti_select_untitled:Vec<UntitledEnum>,#[schemars( title = "Multi Select Titled", description = "Multi Select Description")]pubmulti_select_titled:Vec<TitledEnum>,}

This code will serialized to specification format.

  • Added new example of using enums with elicitations in elicitation_enum_inference.rs

There was another PR #537 that closed. In this PR is used standard way to parse json schema without modification using attributes of schemars

How Has This Been Tested?

Tested with mcpinspector. It correctly understands single select option for enum. But does not work with multi-select options.

Breaking Changes

  • Fields in PrimitiveSchema were reordered: Enum put on the top. This due to overcome deserialization issue of serde. In details: untitled enums and string use both "type":"string" field(with additional fields for enums). Due to library uses untagged representation, for serde first match type will win. In our case if json will contain additional "enum" or "oneOf" fields it will be enum and string otherwise.

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

Closes#524

CopilotAI review requested due to automatic review settings November 14, 2025 00:30
@github-actionsgithub-actionsBot added 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-model Model/data structure changes labels Nov 14, 2025

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 SEP-1330 Elicitation Enum Schema Improvements to support enhanced enum selection capabilities for the MCP (Model Context Protocol) Rust SDK. The implementation adds support for single/multi-select enums with optional human-readable titles.

Key changes:

  • Introduced new enum schema structures (SingleSelectEnumSchema, MultiSelectEnumSchema) with titled and untitled variants to comply with the updated specification
  • Added EnumSchemaBuilder with a fluent API for configuring enum schemas including multi-select options, min/max items, and default values
  • Maintained backward compatibility by preserving the legacy enum schema structure
  • Enhanced JSON schema inference to automatically detect and convert enum types in structs to the appropriate elicitation schema format

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
examples/servers/src/elicitation_enum_inference.rsNew example demonstrating enum selection in elicitation forms with both titled and untitled single/multi-select options
examples/servers/Cargo.tomlAdded example configuration for the new enum elicitation example
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema definitions to include new enum schema structures
crates/rmcp/tests/test_elicitation.rsUpdated test to use new EnumSchema::builder() API instead of direct vector construction
crates/rmcp/src/model/elicitation_schema.rsCore implementation of new enum schema types, builder pattern, and schema inference logic
Comments suppressed due to low confidence (1)

crates/rmcp/src/model/elicitation_schema.rs:953

  • Debug print statement left in production code. This println! should be removed or replaced with proper logging (e.g., tracing::debug!).
 serde_json::from_value(serde_json::Value::Object(schema))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadexamples/servers/src/elicitation_enum_inference.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
Comment threadcrates/rmcp/src/model/elicitation_schema.rs Outdated
@bug-ops

bug-ops commented Nov 15, 2025

Copy link
Copy Markdown
Contributor

Hi, @pbezglasny ! As I see, you've combined the implementation of #521 in this PR. I think it's worth mentioning this explicitly here.

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@bug-ops good point, thanks. I'll update PR description

@alexhancock

Copy link
Copy Markdown
Contributor

@pbezglasny Sorry for the hang time on this. Would love to get it in if you can rebase/update

@pbezglasny

Copy link
Copy Markdown
ContributorAuthor

@alexhancock sure, I can update the PR. I'll do it tomorrow.

@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label Dec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from efdeb1d to ccf12c3CompareDecember 24, 2025 17:21
@pbezglasnypbezglasny changed the title feat(elicitation) implement SEP-1330 Elicitation Enum Schema Improvemventfeat(elicitation) implement SEP-1330 Elicitation Enum Schema ImprovementsDec 24, 2025
@pbezglasny
pbezglasnyforce-pushed the feat/sep-1330-elicitation-enum-schema branch from ccf12c3 to ac36845CompareDecember 24, 2025 17:48
@alexhancock
alexhancock merged commit e9029cc into modelcontextprotocol:mainDec 24, 2025
11 checks passed
@alexhancockalexhancock mentioned this pull request Jan 14, 2026
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
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-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement SEP-1330: Elicitation Enum Schema Improvements

4 participants

@pbezglasny@bug-ops@alexhancock