-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Summary
Add a type-safe builder for constructing elicitation request schemas, making it easier to request structured user input.
Motivation
While we have full elicitation protocol support (form + URL modes per MCP 2025-11-25), constructing the JSON Schema for form-mode requests requires manual JSON building. A builder pattern would improve ergonomics.
Proposed Implementation
// Current approach (manual JSON)
let schema = json!({
"type": "object",
"properties": {
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 },
"newsletter": { "type": "boolean", "default": false }
},
"required": ["email", "age"]
});
let request = ElicitationRequestParam::form("Please register", schema);
// Proposed builder approach
let request = ElicitationSchema::builder()
.description("Please register")
.required_email("email")
.required_integer("age", 0..=150)
.optional_bool("newsletter", false)
.build_request(); // Returns ElicitationRequestParamBuilder API
impl ElicitationSchemaBuilder {
// String fields
pub fn required_string(self, name: &str) -> Self;
pub fn optional_string(self, name: &str, default: &str) -> Self;
pub fn required_email(self, name: &str) -> Self;
pub fn required_uri(self, name: &str) -> Self;
pub fn required_date(self, name: &str) -> Self;
// Numeric fields
pub fn required_integer(self, name: &str, range: RangeInclusive<i64>) -> Self;
pub fn required_number(self, name: &str, range: RangeInclusive<f64>) -> Self;
// Boolean
pub fn required_bool(self, name: &str) -> Self;
pub fn optional_bool(self, name: &str, default: bool) -> Self;
// Enum (string with allowed values)
pub fn required_enum(self, name: &str, options: &[&str]) -> Self;
pub fn required_enum_with_labels(self, name: &str, options: &[(&str, &str)]) -> Self;
// Build
pub fn build(self) -> serde_json::Value; // Raw schema
pub fn build_request(self, message: &str) -> ElicitationRequestParam;
}Code Location
Add to mcp-protocol/src/model.rs alongside existing ElicitationRequestParam.
Priority
Low - nice ergonomic improvement, not blocking any functionality.
References
- rmcp elicitation schema: https://github.com/modelcontextprotocol/rust-sdk/blob/main/crates/rmcp/src/model/elicitation_schema.rs
- MCP 2025-06-18 elicitation spec
Metadata
Metadata
Assignees
Labels
No labels