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

Ресурсы

В главе Основы мы научились читать ресурс. В этом разделе подробнее рассмотрим работу с ресурсами, предоставляемыми MCP-сервером.

Чтение ресурса​

Для чтения ресурса используйте client.resources().read(). Он принимает URI ресурса.

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.resources().read("res://resource-1").await?;

println!("{:?}", resource.contents);

client.disconnect().await
}

Содержимое​

В приведённом выше примере read возвращает ReadResourceResult, содержащий Vec из ResourceContents.

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

Билдеры — with_mime, with_title, … — серверные: клиент читает.

Ресурс, отданный как text/html;profile=mcp-app, — это документ MCP App; его блок безопасности читается через ui().

Список ресурсов​

ВызовОтправляет
client.resources().list(cursor)Одну страницу resources/list
client.resources().list_all()Все страницы resources/list вместе
client.resources().templates(cursor)Одну страницу resources/templates/list

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

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

О фильтре, подтверждении и жизненном цикле подписки см. Подписки.

Легаси-resources/subscribe

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

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

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

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