Ресурсы
В главе Основы мы научились читать ресурс. В этом разделе подробнее рассмотрим работу с ресурсами, предоставляемыми MCP-сервером.
Чтение ресурса
Для чтения ресурса используйте метод read_resource().
Он принимает имя инструмента и необязательные аргументы.
use neva::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Error> {
let mut client = Client::new()
.with_options(|opt| opt
.with_stdio(
"cargo",
["run", "--manifest-path", "./neva-mcp-server/Cargo.toml"]));
client.connect().await?;
let resource = client.read_resource("res://resource-1").await?
println!("{:?}", result.contents);
client.disconnect().await
}
Содержимое
В приведённом выше примере метод read_resource возвращает ReadResourceResult,
содержащий Vec из ResourceContents.
Доступ к отдельным полям ресурса осуществляется с помощью следующих методов:
uri()title()mime()annotations()text()— возвращает текстовое содержимоеblob()— возвращает бинарное содержимое (blob)json()— возвращает JSON-содержимое
Подписка на обновления ресурсов
Изменения ресурсов несут два уведомления:
notifications/resources/list_changed — когда меняется сам список (сервер
должен объявить listChanged), и notifications/resources/updated — когда
меняется конкретный ресурс (сервер должен объявить subscribe).
Регистрируйте обработчики после connect() — они проверяют то, что
объявляет сервер, а это неизвестно, пока не выполнен discovery:
client.on_resources_changed(|_: Notification| async {
println!("Resource list has been updated");
});
client.on_resource_changed(|n: Notification| async move {
let params = n.params::<SubscribeRequestParams>()
.expect("Expected SubscribeRequestParams");
println!("Resource '{}' has been updated", params.uri);
});
Одних обработчиков мало: в MCP 2026-07-28 клиент запрашивает уведомления
потоком subscriptions/listen, где и живёт подписка на конкретный ресурс:
let mut subscription = client
.listen(SubscriptionFilter::new()
.with_resources_changed()
.with_resource("res://some-resource"))
.await?;
// ...
subscription.cancel().await?;
О фильтре, подтверждении и жизненном цикле подписки см. Подписки.
subscribe_to_resourceclient.subscribe_to_resource(uri) / unsubscribe_from_resource(uri) — это
легаси-пара. Они остаются скомпилированными (двойной режим по-прежнему
достаёт до легаси-серверов), но на узле 2026-07-28 отвечают
MethodNotFound. Используйте SubscriptionFilter::with_resource(uri), как
выше.
Обучение на примерах
Полный пример доступен здесь.