Ресурсы MCP сервера (MCP resources) — Transcript

Видео разбирает ресурсы MCP сервера, объясняет их структуру, отличия от темплейтов и демонстрирует практическую реализацию с примерами.

Key Takeaways

  • Ресурсы MCP — это статичные данные для чтения, а темплейты содержат переменные для динамического контента.
  • Подписки и отслеживание изменений ресурсов требуют сложной реализации и не всегда нужны.
  • Правильное использование URI схем критично для совместимости с клиентами MCP.
  • Openкод и модели ИИ помогают быстро создавать и тестировать MCP ресурсы и темплейты.
  • Автодополнение в MCP улучшает взаимодействие с ресурсами и является частью протокола.

Summary

  • Обзор концепции ресурсов в MCP сервере — это данные только для чтения, доступные клиенту.
  • Ресурсы имеют статичный URL и могут быть представлены файлами, веб-страницами или базами данных.
  • Темплейты — это ресурсы с переменными в пути, позволяющие динамически подставлять параметры.
  • Подписки на ресурсы и отслеживание изменений не рассматриваются в видео из-за сложности и специфики.
  • Обсуждение стандартов URI схем и предупреждение об ошибках при неправильном использовании протоколов https, file, git.
  • Практическая часть — написание кода с помощью Openкода и модели Deeps V4 Flashфри для создания ресурсов и темплейтов.
  • Демонстрация запуска MCP сервера на Python и взаимодействия с ресурсами через браузерный инспектор.
  • Пояснение механизма автодополнения (completion) в протоколе MCP и его важности для удобства работы с ресурсами.
  • Тестирование MCP с клиентом Clode и показ корректного чтения данных из ресурсов.
  • Видео сопровождается ссылками на репозиторий и документацию, а также призывом к подписке и поддержке автора.

Full Transcript — Download SRT & Markdown

00:00
Speaker A
Продолжаем разбирать MCP, и у нас на очереди ресурсы. Самая странная, наверное, и самая неочевидная штука.
00:07
Speaker A
Особенно это хорошо заметно странность и неочевидность на фоне того, что здесь есть ещё такая часть, которая называется темплейты. Первый раз, когда я её увидел, я вообще подумал, что типа ух, ни хрена, шаблоны можно что ли хранить, но оказалось всё гораздо прозаичнее.
00:21
Speaker A
Идём по порядку. Ресурсы на самом деле — это что-то доступное только на чтение для вашего клиента, кто будет подключаться к вашему MCP. И по факту это переносится на какие-нибудь сущности, например, файлы на жёстком диске, странички в интернете, таблица в базе данных. Сами можете определить свои доменно области, чем это может быть.
00:34
Speaker A
Одна из прелестей ресурсов заключается в том, что у нас на них можно подписаться и отслеживать, когда они были изменены.
00:44
Speaker A
Я в этом видосе делать не буду. Вам, если понадобится, вы и будете это делать. У меня просто это сервер в зависимости от третьих данных. И это будет какой-то слишком сложный код, который я не хотел бы в этом видео сейчас разбирать.
00:53
Speaker A
Тем более в любом случае это будет высасывание из пальца, потому что свой MCP я собираюсь подключать только какому-то клиенту, вроде, и ассистента. А подписки — это всё-таки для какого-то более живого агента, который работает постоянно и может получить запрос откуда-то снаружи, как-то среагировать.
01:07
Speaker A
Ну, в общем, явно не про ассистента. Первое, что мы можем делать в рамках протокола — это посмотреть, какие у нас ресурсы вообще доступны. У нас это будет доступно практически из коробки. Делать ничего для этого не придётся. Мы просто опишем, какие у нас есть ресурсы.
01:19
Speaker A
Чтение ресурса — основная часть логики, которую мы будем реализовывать, те самые загадочные темплейты. По факту это те же самые ресурсы, но в пути к которым мы будем вставлять какие-то переменные. То есть, по большому счёту, это параметр из веба, хорошо нам знакомый.
01:33
Speaker A
Каких-то радикальных отличий от обычного ресурса нет. В терминах MCP ресурс — это что-то со статичным URL, который не меняется, который мы не резолвим на клиенте, а отображаем как есть. В нашем случае это будет просто список всех ресурсов внутри одной категории.
01:48
Speaker A
А темплейтом будет информация о канале, когда мы на него, допустим, подписались, либо если мы на него не подписаны, то информация о том, что не подписаны мы на него, и список всех постов с канала. Так как подписки мы не будем рассматривать, мы скипаем этот раздел.
01:58
Speaker A
Можно почитать вам самостоятельно, если очень интересно, если очень нужно. Описание реализации протокола в виде типов. Нам это не очень интересно. Здесь самая интересная часть — это аннотации. Но так как мы клиента не будем реализовывать, она тоже как бы не очень релевантна.
02:11
Speaker A
Я рассматриваю только подключение к обычному клиенту, а эта информация помогает разделить, например, ресурсы, доступные только пользователю либо ассистенту по умолчанию, доступны им обоим, какие-то приоритеты и дата последней модификации.
02:27
Speaker A
Но так как мы только собираем ресурсы и транслируем их далее в ассистента, нам это тоже не очень имеет смысл какой-то реализовывать L modified дату.
02:40
Speaker A
И самая интересная часть — доступ ко всем ресурсам осуществляется в виде URI.
02:55
Speaker A
Итак, QI схема у нас уже, в принципе, понятная, давно существующая, все мы с ней знакомы, поэтому решили ещё и залочить пару-тройку протоколов уже существующих. Это https. Если сервер поддерживает доступ к вебу, то вы сами реализуете, как он должен это реализовывать.
03:02
Speaker A
Если не реализуете, то занимать данный протокол нельзя. То же самое касается протоколов Файл и Git.
03:16
Speaker A
Просто обратил ваше внимание, чтобы, не дай бог, вы случайно не задействовали эти схемы каким-нибудь неправильным способом, потому что с большой долей вероятности какой-нибудь клиент вроде клода или кодекса или опенкода может обидеться на вас и начать выдавать какую-нибудь ахинею, которой вы не ожидали.
03:30
Speaker A
Ну и в целом спецификация подразумевает, что мы будем строго следовать стандарту при создании своих кастомных URI схем.
03:41
Speaker A
Последующий раздел нас вообще не интересует — Handling Security Consideration, но нам, конечно же, уже хочется скорее начать писать код.
03:46
Speaker A
Продолжаем мы всё в том же репозитории, который я показывал в прошлом видео. Ссылочка на него будет в описании к видео. Также как и ссылочка на документацию, которую вы только что смотрели, кстати говоря.
03:59
Speaker A
Там ставим лайк, подписываемся, пишем комментарии.
04:11
Speaker A
Это очень поддерживает канал. Ну а тем, кто подпишется на sponsor.ru, я вообще буду признателен практически вечно.
04:25
Speaker A
Навсегда останетесь в моём сердечке. Итак, начинаем писать код. Конечно же, писать мы его тоже будем не руками, а с помощью Openкода.
04:39
Speaker A
И ставшей уже привычной модели Deeps V4 Flashфри на состоянии на начало июня двадцать шестого года. Моделька всё ещё бесплатно доступна, что не может не радовать.
04:52
Speaker A
Задачу ставим самым простым и максимально естественным способом. Мы что-то обходим всё-таки с вами. Какие тулы у нас уже сейчас можно переделать на ресурсы и вообще, надо ли нам это совершать?
05:08
Speaker A
Да хватит копировать в буфер и какие ресурсы стоило бы добавить, опираясь на то, что у нас есть. Отправляем железку работать.
05:17
Speaker A
Моделька закончила. Самое главное, что она здесь очень хорошо отметила — это отличие в корне. Ресурсы они всегда должны быть только ридли, если вы хотите получить какие-то данные и дальше с ними работать.
05:27
Speaker A
Если у вас есть хоть какие-то мутации на стороне сервера, то, по-хорошему, это не подойдёт, и вам надо делать ту. Текущее разделение, которое моделька здесь обозначила, оно действительно очень на тоненького проходит под эти требования.
05:40
Speaker A
Давайте здесь не согласимся, чтобы она добавила один ресурс и один темплейт. Это вот как раз разница наглядно по поводу того, чем отличаются ресурсы и темплейты. Ресурс — это статичная строка, а темплейт — это у нас наличие в этой строке какого-то переменного кусочка, того самого puff variable.
05:50
Speaker A
Отправляем модель работать. Давай, делай. Она предложила одно, а по факту сделает ровно то, чего я от неё ожидал. Разделила задачу на три разных ресурса. То есть один ресурс, два темплейта, просто список каналов, информация по каналу, подписаны, не подписаны и посты из кэша данного канала.
06:01
Speaker A
По мне, идеальный сценарий для того, чтобы показать разницу между всеми этими сущностями. Моделька закончила.
06:09
Speaker A
Моделька сделала всё, что обещала. Три новые сущности с новым URI TG, что в нашем случае означает Telegram. Давайте попробуем теперь это всё запустить.
06:23
Speaker A
Напоминаю, если вы так же, как и я, работаете в инфраструктуре питона, здесь мы просто запускаем MCP def main pi и идём в браузер ждать, пока откроется инспектор. Вот инспектор открылся.
06:37
Speaker A
Делаем коннект. Смотрим список ресурса, смотрим список темплейтов. Если сверимся тем, что я говорил раньше, то мы видим, да, действительно, один ресурс и два темплейта. Ровно они здесь и появились.
06:52
Speaker A
Запускаем первого и видим, что у нас очень некрасиво и неудобно отображается код, на который мы подписались в прошлой серии. Переходим на resource channels resource. И здесь нужно ввести имя.
07:07
Speaker A
Давайте введём Let's и проверим, подписаны мы на него или нет. Добавлены, да? И дата, когда я добавил этот ресурс.
07:20
Speaker A
Смотрим второй темплейт. И опять здесь нужно указать имя LEDs code. Drew. Вводим, читаем ресурс и видим список последних постов, которые у нас тут сохранены в базе данных.
07:36
Speaker A
И который мы можем прочитать. Крайне, конечно, неудобно это всё читать на таком маленьком экранчике, но самые внимательные, конечно, заметили, что когда я здесь открываю, здесь появляется поле ввода с поиском, но никакого поиска не происходит.
07:49
Speaker A
Что это за поле и нахрена оно здесь нужно? Это поле — это одна из фишек протокола MCP. Как вы помните, если в каком-нибудь агенте начать вводить имя файла, допустим, вот в опенкоде я добавляю собачку и начинаю писать, допустим, Redmi.
07:54
Speaker A
И мы видим, что автодополнение появляется здесь и показывает, какие филды есть. Это тоже часть протокола, и поэтому нужно это реализовывать отдельно.
08:09
Speaker A
И это расширение называется неожиданно comptition, наш любимый compition. И он входит в протокол, и он чётко описан, как его настраивать, как ег
08:25
Speaker A
Собираем список постов, компонуем всё это в одну большую строчечку и возвращаем. В принципе, всё терпимо. И вот он completion- это отдельный декоратор, который определяет хендлер для комплишена. То есть, по большому счёту, это тот же самый endpint, как если бы мы делали это на нашем сайте на
08:40
Speaker A
каком-нибудь. Первым делом принимает реф ими ресурса, с которым мы работаем, для которого нам нужен автокомплитe.
08:46
Speaker A
Аргумент - это тот аргумент, который мы обрабатываем. В данном случае это у нас name. И ещё здесь может быть третий параметр, который содержит ссылки на контекст для других аргументов. Если ваш темплейт содержит несколько паф варийблов и вам нужно их как-то между
08:59
Speaker A
собой состыковывать, допустим, компания и подразделение компании или, допустим, страна, город, ну, в общем, в таком духе, когда у вас есть связь между этими самыми параметрами. Completition у нас один на весь MCP-сервер, и, соответственно, он может принимать рефы совершенно разные. То есть здесь у нас
09:15
Speaker A
только один протокол ТГ, но протоколов может быть несколько и, соответственно, путей внутри и по фриблу должны быть разные. Поэтому здесь, по-хорошему, если мы начинаем что-то модифицировать, разные пафойблы, разные протоколы, то здесь нужно добавлять какой-то роутер, который будет перекидывать в зависимости
09:30
Speaker A
от исполнения на хендлеры, которые будут, собственно, всё это обрабатывать в подходящем виде. Так как у нас ничего здесь сложного нету, мы получаем здесь список каналов, а дальше просто фильтруем весь список, отбирая те, которые начинаются с тех же букв,
09:43
Speaker A
которые мы передаём на вход. Здесь, по-хорошему, конечно, можно добавить перевод к нижнему регистру. И здесь, кстати, тоже неплохо было бы привести к нижнему регистру. После того, как мы провалидировали, что у нас код тут работает, после того, как мы код
09:55
Speaker A
провалидировали, нам остаётся только перезапустить наш MCP. Хотя, наверное, хватило бы и просто переконнектиться, но я уже это сделал. Делаем конект, убираем всё лишнее, чтобы оно нам не мешало, и смотрим темплейты. Начинаем вводить имя LEDS и получаем ошибочку. А, ну вот то,
10:10
Speaker A
что я и говорил, принимает два позиционных параметра, но на вход прилетело три. Нероночка совершенно забыла про третий аргумент. Нтекст.
10:19
Speaker A
Блин, я тип не помню, но давайте, кстати, сейчас сразу и проверим, будет ли restart работать или нет. Let's. И опять ошибочка. Completion object can be inwaited. Ну вот сам говорил, что нужно отслеживать все ошибки, но нихера сам не
10:31
Speaker A
отслеживаю. Данная функция должна быть асинхронной. Забавно, что остальные не асинхронные, это должно быть асинхронное. Ну что ж, здесь, видимо, так принято. Вновь проверяем, что у нас работает. Completition и видим, да, вот он работает. Let's do добавляется.
10:44
Speaker A
читаем и получаем ответ. Таким образом, вы можете добавлять неограниченное количество аргументов и использовать для них autпт. Но, повторюсь, работает это далеко не для всех клиентов. Давайте попробуем заиспользовать этот MCP в клоде. Тормозим его здесь. И просто, насколько я помню, у нас здесь же просто
11:00
Speaker A
веб-сервер, да? Запускаем Python main P. Видим, что он у нас стартанул. Входим из Open кода, запускаем clad и проверяем, что ресурсы у нас доступны. ТГ. И вот видим, все наши ресурсы здесь присутствуют. Давайте посмотрим. Клод ни хрена не понимает, что я от него хочу.
11:18
Speaker A
Ну, это нормально, он и не должен. Давайте посмотрим. Последние посты из канала. Let's code. Нажимаю Tab.
11:24
Speaker A
Автоматический. Автопete сработал. То есть оно всё-таки есть, да? Вот processing request. Complete request. Он почему-то просто не показывает выпадающий список, либо я его просто не заметил. Ну-ка LED. А, топ. Серьёзно? То есть автокомплит есть. Просто он Ну это
11:38
Speaker A
я, я могу, я умею. Так, запускаем. Смотрим. Я вижу каналдрю. Нужно уточнить, что вы хотите сделать.
11:43
Speaker A
Добавить канал, изучить посты. Давайте попробуем эту же команду пост. Что там было последнюю неделю? Проверим. Так, я по ходу дела использовал ресурс, которого не определил. Да, nameйм, да?
11:55
Speaker A
Нет, посты. Channel name пост. Ну, что-то он, короче, читать не хочет. Надо разбираться. Итак, я не знаю, что произошло после того, как я всё закоммитил, запушил, ничего не менял.
12:05
Speaker A
Просто решил разобраться с тем, какие тут могут быть проблемы. Перезапустил сервер. Вот он у меня работает. Во всё.
12:12
Speaker A
Запускаю клод. Тот же самый MCP connected. Те же самые тулы, те же самые ресурсы. Ничего не изменилось. Но при этом, если я добавляю ТГ channels, let's go, делаю посты, что свежего было, клод почему-то раздуплился и начал нормально читать данные из ресурсов. И вот он
12:31
Speaker A
распарсил все посты, которые прилетели. Соответственно, автокомплет работает, ресурсы читаются, и наш MCP-сервер может шарить контекст, точно так же, как это происходит с внутреними MCP, которые зашиты в клодко-коде каких-либо отличий.
12:44
Speaker A
Спасибо, что посмотрели это видео. Всем спасибо. Всем пока.
Topics:MCP серверресурсы MCPтемплейтыOpenкодDeeps V4 FlashфриURI схемыавтодополнениепротокол MCPClode клиентPython MCP

Frequently Asked Questions

Что такое ресурсы в MCP сервере?

Ресурсы — это данные только для чтения, доступные клиенту MCP, обычно представленные статичными URL, файлами или базами данных.

Чем ресурсы отличаются от темплейтов в MCP?

Ресурсы содержат статичные строки, а темплейты имеют переменные части, которые подставляются динамически в пути ресурса.

Почему в видео не рассматриваются подписки на ресурсы?

Подписки требуют сложной реализации и подходят для живых агентов, постоянно работающих с внешними запросами, что выходит за рамки данного видео.

Get More with the Söz AI App

Transcribe recordings, audio files, and YouTube videos — with AI summaries, speaker detection, and unlimited transcriptions.

Or transcribe another YouTube video here →