Получение данных
В этом руководстве описывается, как клиент обрабатывает запросы на получение данных (elicitation), отправляемые MCP-сервером.
Включение поддержки получения данных
let mut client = Client::new()
.with_options(|opt| opt
.with_elicitation(|e| e
.with_form()
.with_url()));
Это включает:
- Получение данных через формы
- Получение данных через URL
Обработка запросов на получение данных
Определите обработчик получения данных с помощью атрибутного макроса #[elicitation].
#[json_schema(ser)]
struct Contact {
name: String,
email: String,
age: u32,
}
#[elicitation]
async fn elicitation_handler(params: ElicitRequestParams) -> ElicitResult {
match params {
ElicitRequestParams::Url(url) => {
// Переходим по URL для выполнения внешнего действия.
ElicitResult::accept()
}
ElicitRequestParams::Form(form) => {
// Показываем форму пользователю для заполнения данных
let contact = Contact {
name: "John".to_string(),
email: "john@email.com".to_string(),
age: 30,
};
elicitation::Validator::new(form)
.validate(contact)
.into()
}
}
}
Что здесь происходит?
- Получение данных через URL
- Клиент принимает и выполняет действие внешним образом
- Получение данных через форму
- Клиент формирует данные
- Данные проходят валидацию по серверной схеме
- Валидированные данные возвращаются как ElicitResult
к сведению
Если пропустить with_elicitation(), with_form() или with_url(), но объявить обработчик получения данных, это по умолчанию включит получение данных через форму.
Отслеживание завершения получения данных
client.on_elicitation_completed(async |n| {
let Some(params) = n.params::<ElicitationCompleteParams>() else {
println!("Unable to read params");
return;
};
println!("Elicitation {} has been completed.", params.id);
});
Это полезно для:
- Обновления пользовательского интерфейса
- Логирования
- Отслеживания внешних процессов (платежи, аутентификация)
Обучение на примерах
Полный рабочий пример доступен здесь.