Получение данных
В этом руководстве описывается, как клиент обрабатывает запросы на получение данных (elicitation), отправляемые MCP-сервером.
Раунды прогоняет клиент
В MCP 2026-07-28
получение данных — это не push-запрос, приходящий клиенту вне общего потока.
Сервер отвечает на вызов инструмента статусом input_required; обработчик
клиента формирует ответ и повторяет вызов, возвращая запечатанный
requestState.
Этот цикл neva выполняет за вас, внутри call_tool:
- ваш обработчик вызывается один раз на каждый раунд
input_required; Client::call_toolвозвращает только финальный результат — вызывающий код видит один вызов;- именно регистрация обработчика заставляет клиента объявить
clientCapabilities.elicitation, а сервер может запросить только тот вид, который клиент объявил; - число повторов на слот ограничивается через
McpOptions::with_max_mrtr_rounds.
Включение поддержки получения данных
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(), но объявить обработчик получения данных, это по умолчанию включит получение данных через форму.
Завершение получения данных
Уведомления notifications/elicitation/complete больше нет — сигналом
завершения является сам ответ на input-запрос, поэтому
Client::on_elicitation_completed и ElicitationCompleteParams не
существуют. URL-elicitation также лишился elicitationId: без серверного
сигнала о завершении нечего сопоставлять.
Если вы использовали это уведомление для обновления интерфейса или аудита, привязывайтесь к самому обработчику — он выполняется ровно в момент, когда клиент отвечает.
Под флагом legacy-spec эти API возвращаются.
Обучение на примерах
Полный рабочий пример доступен здесь.