aether-mcp-utils 0.7.3

MCP client and server utilities for the Aether AI agent framework
Documentation
use crate::client::McpClient;
use rmcp::model::{ElicitRequestParams, ElicitResult, InputRequest, InputRequests, InputResponses, RequestMetaObject};

pub(crate) enum ElicitInputsError {
    UnsupportedInput,
    Serialize(serde_json::Error),
}

pub(crate) async fn elicit_inputs(
    client: &McpClient,
    requests: InputRequests,
) -> Result<(InputResponses, Vec<ElicitResult>), ElicitInputsError> {
    let mut responses = InputResponses::new();
    let mut results = Vec::new();
    for (key, request) in requests {
        let InputRequest::Elicitation(elicitation_request) = request else {
            return Err(ElicitInputsError::UnsupportedInput);
        };
        let extension_meta = elicitation_request.extensions.get::<RequestMetaObject>().cloned();
        let params = with_meta(elicitation_request.params, extension_meta);
        let result = client.dispatch_elicitation(params).await;
        let response = serde_json::to_value(&result).map_err(ElicitInputsError::Serialize)?;
        responses.insert(key, response);
        results.push(result);
    }
    Ok((responses, results))
}

pub(crate) fn with_meta(mut request: ElicitRequestParams, meta: Option<RequestMetaObject>) -> ElicitRequestParams {
    if let Some(meta) = meta {
        match &mut request {
            ElicitRequestParams::FormElicitationParams { meta: request_meta, .. }
            | ElicitRequestParams::UrlElicitationParams { meta: request_meta, .. } => {
                *request_meta = Some(meta);
            }
            _ => {}
        }
    }
    request
}