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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions