Skip to content

feat: Add ElicitationSchema builder #91

@avrabe

Description

@avrabe

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 ElicitationRequestParam

Builder 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions