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

Ресурсы

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

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

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

Когда список доступных ресурсов изменяется на сервере и MCP-сервер объявил listChanged, публикуется уведомление notifications/resources/list_changed. На стороне клиента можно подписаться на него следующим образом:

client.on_resources_changed(|_: Notification| async {
println!("Resource list has been updated");
});

Кроме того, когда конкретный ресурс обновляется на сервере, отправляется уведомление notifications/resources/updated. Для подписки или отписки от этих обновлений используйте:

client.on_resource_changed(|n: Notification| async move {
let params = n.params::<SubscribeRequestParams>()
.expect("Expected SubscribeRequestParams");

println!("Resource '{}' has been updated", params.uri);
});

client.subscribe_to_resource("res://some-resource").await?;

// ...

client.unsubscribe_from_resource("res://some-resource").await?;

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

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

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