**Ресурсы MCP сервера (MCP resources) — Transcript & Summary | SozAI**
Source: https://sozai.app/transcript/mcp-server-resources/

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

## Key Takeaways

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

## What the video covers

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

## Chapters

1. 00:00 Введение в ресурсы MCP сервера
2. 00:44 Подписки на ресурсы и их сложность
3. 01:33 Отличия ресурсов и темплейтов
4. 02:27 Аннотации и дата модификации ресурсов
5. 03:16 URI схемы и стандарты MCP
6. 03:59 Призыв к подписке и ссылки на ресурсы
7. 04:52 Практическое создание ресурсов с Openкодом
8. 05:40 Различия ресурсов и темплейтов на примере
9. 06:23 Запуск MCP сервера и инспектор
10. 07:20 Работа с темплейтами и автодополнением

Answers

## Questions about this video

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

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

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

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

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

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

## 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 схемы автодополнение протокол MCP Clode клиент Python MCP

Учить по этому видео

- [Карточки по этому видео](https://sozai.app/ru/tools/ai-flashcard-generator/?from=transcript&id=35439)
- [Тест по этому видео](https://sozai.app/ru/tools/quiz-generator/?from=transcript&id=35439)

Бесплатно, составлено ИИ по этой расшифровке. Без регистрации.


---
This is the markdown twin of https://sozai.app/transcript/mcp-server-resources/ — the same content, without the markup.
Published by SozAI (https://sozai.app). Reuse and quotation are allowed with attribution and a link back.
Machine-readable index: https://sozai.app/llms.txt · data API: https://sozai.app/api/
