Ресурсы
В главе Основы мы научились читать ресурс. В этом разделе подробнее рассмотрим работу с ресурсами, предоставляемыми 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-содержимое
Подписка на обновления ресурсов
Когда список доступных ресурсов изменяется на сервере и 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?;
Обучение на примерах
Полный пример доступен здесь.