Перейти к основному содержимому

Ресурсы

В главе Основы мы научились читать ресурс. В этом разделе подробнее рассмотрим работу с ресурсами, предоставляемыми 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.

Доступ к отдельным полям ресурса осуществляется с помощью следующих методов:

Подписка на обновления ресурсов

Изменения ресурсов несут два уведомления: 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_resource

client.subscribe_to_resource(uri) / unsubscribe_from_resource(uri) — это легаси-пара. Они остаются скомпилированными (двойной режим по-прежнему достаёт до легаси-серверов), но на узле 2026-07-28 отвечают MethodNotFound. Используйте SubscriptionFilter::with_resource(uri), как выше.

Обучение на примерах

Полный пример доступен здесь.

Дополнительные примеры