Инструменты для MCP сервера (MCP tools) — Transcript

Обзор и практическое руководство по созданию MCP-сервера на Python с использованием MCP tools и SDK.

Key Takeaways

  • MCP протокол предлагает расширенные возможности для интеграции AI с внешними сервисами.
  • Использование MCP позволяет объединять несколько API вызовов в одно действие для упрощения работы.
  • SDK MCP хорошо проработан и облегчает создание серверов на разных языках программирования.
  • Клиентские функции MCP расширяют возможности взаимодействия с пользователем и управлением ресурсами.
  • Практическая реализация MCP-сервера требует понимания работы с ресурсами, инструментами и промтами.

Summary

  • Видео посвящено модели протокола MCP и её текущему состоянию в сообществе.
  • Обсуждаются ключевые особенности MCP, включая ресурсы, инструменты (tools) и промты.
  • Поясняется, как MCP позволяет объединять несколько действий в одно для упрощения работы с API.
  • Рассматриваются клиентские функции MCP, такие как сэмплинг, roots и stitstation.
  • Автор показывает процесс создания MCP-сервера на Python с использованием SDK и UV.
  • Демонстрируется запуск MCP-сервера в режиме разработки с поддержкой командной строки.
  • Проводится обзор кода сервера, включая описание инструментов и их параметров.
  • Обсуждается интеграция MCP с внешними сервисами и управление состоянием через SQLite.
  • Автор приглашает зрителей к взаимодействию через комментарии и поддержку на sponsor.ru.
  • Видео содержит практические советы по реализации MCP и планы на будущие видео.

Full Transcript — Download SRT & Markdown

00:00
Speaker A
И вот мы снова здесь, model протокол. Самое забавное, что в момент, когда этот протокол только опубликовали, про него говорили очень много, он был прямо на хайпе, а потом так дружно про него забыли. Сейчас как будто бы даже и не
00:11
Speaker A
говорят про него вовсе. А что самое обидное, спецификация model протокол, ссылочка на которую, кстати говоря, будет в описании к видео, там же, где все остальные ссылочки из видео.
00:19
Speaker A
Спецификация подразумевает очень много всяких прикольных плюшек, но реализуют их далеко не все. Если посмотреть, как сейчас народ реализует MCP, то это чаще всего просто пачкат улов и, типа, кинули вас и, типа, дальше крутите, как хотите.
00:31
Speaker A
А что самое стрёмное, что эти тулы, по большому счёту, чаще всего это просто адаптация какого-нибудь АИ. Ну, типа создай заказ, положи в него товары, оформи заказ. И все эти MCP-сервера в итоге выглядят как простые ручки, прикрученные к сторонним продуктам и
00:46
Speaker A
вовсе никак не управляют контекстом. То есть от скилов отличаются только в худшую сторону. Но если внимательно посмотреть спецификацию, то там очень много всего интересного расписано.
00:55
Speaker A
Например, если перейти в раздел features, мы увидим, что здесь присутствует целых шесть разных плюшек, доступных со стороны сервера и клиента.
01:03
Speaker A
Если кому-то интересно мнение рандомного чувака из интернета, то вот в этих штуках и скрывается вся самая мякотка этой технологии MCP. В этом и в следующих видео я попытаюсь рассказать, что это, как это сделать и как это использовать. Если совсем коротко, из
01:17
Speaker A
того, что мы знаем — это тулы, функции, которые AI может дёргать и отправлять запросы к какому-то вашему внешнему сервису. Большинство тулов, народ, как я сказал, уже делает типа, ну вот есть у нас там создать, вот создать и будет. Но
01:29
Speaker A
по большому счёту нейронке не нужно знать все эти подробности вашего API. Она должна выполнять какие-то работы, которые вы хотите ей делегировать.
01:37
Speaker A
Например, не просто две отдельные ручки, одна добавь товар в корзину, а вторая купи, а сразу купи этот товар. И MCP за собой скрывает как раз найти этот товар, добавить его в корзину и оформить покупку. То есть одно действие вместо
01:49
Speaker A
трёх. Ресурсы — это как раз сущности, с которыми должен работать MCP. Чаще всего вы с ресурсами сталкивались, когда работали с агентами, и вы через собачку вводите имя какого-нибудь файла — это ресурс. Концепция MCP: ресурсом может быть всё, что угодно: табличка в
02:02
Speaker A
базе данных, товар в магазине или, может быть, даже категория товаров в магазине, отдельный сайт, странички сайтов.
02:08
Speaker A
Объективные ресурсы — это просто URL к любой сущности, которая где-то у вас там хранится. Промты — это эта история максимально близкая к скилам, с той лишь разницей, что этот скилл не завязывается на какие-то скрипты или ещё что-то, находящееся на вашем жёстком диске, а этот
02:23
Speaker A
промт завязывается на те инструменты, которые представляют ваш MCP, то есть ресурсы и тулы. Вы как бы поставляете человеку свой скилл, завязанный на ваше API, со своими сущностями, со своими инструментами, действиями над этими сущностями и промтами, которые помогают корректно пользователю работать с этими
02:40
Speaker A
ресурсами, с этими инструментами. На стороне клиента есть ещё несколько удобняшек. Это сэмплинг, инструмент, позволяющий вашему MCP-серверу делегировать какую-то работу LLM. То есть таким образом ваш MCP-сервер может делать вызовы в LLM для обработки данных, используя ту модель, которая подключена сейчас у пользователя. Roots
02:59
Speaker A
— это условно разрешение, где вы показываете, к каким URI либо каким разделам вашей файловой системы имеет доступ данный MCP. И самая, я считаю, недооценённая фича клиента — это stitstation. Это возможность получения у пользователя какой-то дополнительной информации для работы MCP-сервера.
03:15
Speaker A
Например, авторизация либо какие-то параметры. По ходу реализации всех этих штук я вам буду показывать, как это работает, если, конечно, найду подходящих клиентов, которые это красиво поддерживают. Ну и начнём мы, конечно, с того, что создадим свой MCP-сервер.
03:27
Speaker A
Работать я буду с Питоном. Если кому-то не хватает примеров на каком-то другом языке, напишите в комментах под этим видео. Кстати говоря, там же можно лайк поставить, подписаться на канал, и я сделаю какой-нибудь другой, может быть, такой же сервер на языке, который вы
03:40
Speaker A
больше всего упомянете. Ну и опубликую это видео на канале. Либо можете подписаться на мой спонсор канал и запросить там видос, какой хотите, на любую тему, связанную с моими видео. Это будет быстрее и эффективнее. Спасибо всем тем, кто уже поддерживает меня на
03:53
Speaker A
sponsor.ru. Здесь, на самом деле, очень много SDK. И то, что у них разные тиры, это, на самом деле, не сильно влияет на их качество. Просто часть функций может быть не сильно реализована. У Java, допустим, очень хорошо реализованный MCPSDK, но Python просто лаконичнее.
04:07
Speaker A
Больше кода влазит на экран с меньшим количеством буковок, легче показывать. Я же не руками буду писать. Поэтому я открываю SDK питона, перехожу в раздел installation и начинаю новый проект с помощью UV. Сначала запинить надо, забыл версию Питона. Делаем U init и добавляем
04:24
Speaker A
зависимость. Самое замечательное, что все из SDK достаточно хорошо проработаны, очень много покрывают всей рутины, типа авторизации, возможности запуска как локальное приложение, как серверное приложение. Так как код я не буду писать руками, прежде чем начинать работать, естественно, нужно добавить
04:40
Speaker A
Agence MD. Вы просили посмотреть, как я вайп кожу. Вы будете смотреть, как я VIPй кожу. Скопирую своего предыдущего проекта Agm. Проект я, скорее всего, закину на GitHub, так что можете искать его там. Открываем main.py и копируем пример квикстарта, чтобы посмотреть, как
04:55
Speaker A
всё это работает из коробки. Запускать я всё буду в виде HTTP сервера, потому что мой MCP будет иметь стейт.
05:02
Speaker A
Соответственно, как встраиваемое приложение, это будет работать как попало. Непонятно, где этот стейт хранить. Я хочу использовать SQLite. Ну, в общем, вы понимаете, самый оптимальный вариант, если у вас используется какой-то стейт, делать ваш MCP в виде standalone сервера и к нему подключаться
05:15
Speaker A
своими клиентами снаружи. После того, как мы всё подготовили, можно запустить наш MCP-сервер в режиме разработки. Так как MCP я уже подключил с поддержкой командной строки, и я нахожусь в рабочем окружении, я могу запустить MCP в режиме девелопера и указать файл, в котором
05:31
Speaker A
находится мой сервер. Это main.py. Сервер стартует и открывается сразу в браузере. И это замечательная штука, что нам не нужно для дебага какой-то создавать обвес. Нам не нужно подключать это всё к какому-то реальному агенту. Мы просто берём, открываем браузер, он то же самое
05:45
Speaker A
открылся. Делаем коннект и видим, что наш сервер отлично запустился. Можно посмотреть ресурсы, которые у нас описаны. Да, у нас здесь нет ресурсов, зато есть темплейт. Вот, пожалуйста, Гринь. Введём имя Drew и выполним его.
05:56
Speaker A
Видим, что MCP отработал. Hello Drew написал тут. Да, на таком маленьком экране, конечно, плохо видно. Видим, что у нас есть промты. Его я запускать не буду. Он также принимает тиль, имя. С промтами и ресурсами мы потом дальше будем разбираться. Вот лист тулов мы
06:10
Speaker A
посмотрим сейчас. У нас здесь он предлагает один тул сложить, два и что угодно. Запускаем, смотрим результат.
06:16
Speaker A
Да, всё посчиталось. А теперь посмотрим на код. Видим, что здесь у нас все месседжи обрабатываются. Если коротко посмотреть на код, который я скопировал, мы видим, что у нас здесь определён сервер с каким-то именем. Давайте его переименуем в Telegram Watcher. И он
06:29
Speaker A
отвечает JSONом. И далее пошла самая мякотка. Вот у нас определяется один tool с одной аннотацией. Фреймворк берёт на себя максимальные пляски по адаптации нашей логики во что-то более полезное. Два параметра. Докстринга, которая транслируется серверу. То есть она используется для того, чтобы
06:46
Speaker A
составить описание данного тула. То есть тул будет называться. У него автоматически подтянутся параметры, которые ожидаются с типами. Будет написано, что он возвращает, и вот этот description будет передаваться серверу в контекст LLM, чтобы она понимала, что этот tool делает, когда его вызывают.
06:59
Speaker A
Сама логика. То же самое у нас делается для ресурса. У ресурсов, как я говорил, у них используется что-то типа URI, похожее на адресную строку в браузере, но только мы здесь сами определяем протокол. То есть здесь он называется Greetings. Мы можем его назвать как
07:12
Speaker A
угодно, блаветики и всё что угодно. темплейты, которые передаются параметрам в этот ресурс. Ну и здесь возвращаются какие-то данные. Ну, здесь в тупня сделано, что типа мы возвращаем какую-то херню, но по факту здесь мы должны что-то читать. Об этом мы поговорим в
07:26
Speaker A
следующих видео. Если, конечно, вам зайдёт. Поставьте лайк, чтобы я знал, что вам всё это заходит. И промты. Здесь опять какая-то конечно, показывается, но по факту здесь мы подготавливаем какой-то шаблон, который будет передан Лмке, чтобы она знала, как обработать какой-то конкретный запрос
07:40
Speaker A
пользователя. Нас это не сильно всё интересует. Открываем Open CД и начинаем творить магию. Да, первым делом, наверное, я заполню Redmi, чтобы ускорить видос. У меня уже всё подготовлено, и я вам только коротко расскажу, что это будет. Это будет
07:53
Speaker A
Telegram Шпион Smaraer. И всё, что он делает, он ходит по адресу публичного канала вебе, крапит информацию, которая есть в этом канале, складывает в локальный кэш. Мы можем через MCP задать на какие каналы мы подписываемся. Он будет их скрапить, сохранить в базе
08:07
Speaker A
данных, типа как кэш. И по запросу либо строить дайджет за последние пару дней, период мы сможем выбрать, либо показать какой-то конкретный пост с канала, либо целиком по каналу там за определённый период. В общем, очень простой такой MCP, помогающий не залипать в Telegram
08:20
Speaker A
на всякие каналы, а получать только важную информацию. Штука опять полезная. И штука опять достаточно простая, но мощная, чтобы покрыть весь наш топик.
08:28
Speaker A
Всё, что нам теперь нужно сделать, я всё ещё использую бесплатный псик и даю указание коду. Прочитай Redmit и выдели тулы, которые нам необходимо реализовать для достижения целей. Переводим Open CД в режим плана, чтобы он не начал генерировать бред раньше времени, а
08:47
Speaker A
сначала рассказал, что он хочет сделать. Да, ещё нужно ему сразу сказать, что учти, что я бы хотел шировать данные вла. Ну, этого хватит для начала. Так, смотрим, что он тут напланирован. проез простой профолт, да, управляет списком Telegram-каналов, да, ходят каналы
09:04
Speaker A
парсит, кэширует их, отдаёт данные клиенту через MCP Tools resource. Ресурсы мы сейчас вам скажем, чтобы не трогал пока. Какие тулы может сделать?
09:11
Speaker A
Добавить канал отслеживания, удалить канал и его посты, список отслеживаемых каналов, сходить на ТМИ, спасить новые посты, убрать посты из кэша. Ну вот как раз здесь получается проблема, то, про которую я говорил. Неронка повторяет за людьми плохие вещи. Она предлагает нам
09:25
Speaker A
отдельно делать апдейт канала, а отдельно получать посты. У пользователя нет потребности обновлять канал. Пользователь хочет получить посты.
09:33
Speaker A
Поэтому данная операция должна выполняться под капотом без знания со стороны человека, уж тем более без знания со стороны, чтобы не перегружать контекст. Этим самым мы сэкономим контекст и сохраним здравый смысл.
09:44
Speaker A
Ресурсы пока что запретим делать. Это у нас следующий видос. Парсер сделать, да? SQL, да, это я пока что даже смотреть не буду. План по шагам установить Beautyful sub - это welcome. Даты нам не нужны, кстати говоря. Да, надо ему это
09:56
Speaker A
обозначить. что мы хотим работать без дат. Пишем свой ответ. Ресурсы пока не делай. Это следующий шаг. Сейчас только тулы. С датами мы не работаем.
10:08
Speaker A
Пользователь указывает, сколько дней в прошлые сегодняшнего дня. Он хотел бы посмотреть вроде как за вчера, за прошлую неделю, за месяц. И ещё у меня была претензия, до update channel не разделяй update channel и get posts. Обновляем данные, когда пользователь попросит
10:37
Speaker A
найти посты. Всё в одном инструменте. Так, дополнительно парсинг установить. Всё остальное меня устраивает. Так, пусть он ещё разок подумается с моими замечаниями. Смотрим, что он надумал во второй заход. Понял, упрощаем. Да, оставил один канал. Количество дней используют они дату. сходит на Telegram
10:54
Speaker A
за новыми постами. СКшир скла возвращает посты за дней от сегодня. Единственное, что нужно отметить, что если чаннел не заполнен, то берём все посты, которые есть в сохранёнке. Добавляем в зависимости, создаём DB, таблички parser и main. Убрать заглушки. Давайте напишем
11:11
Speaker A
ему ещё раз. Если в query post не передан параметр, берём каналы из списка сохранённых. Также пользователь может передать несколько каналов, которые он хочет посмотреть, а не только один.
11:30
Speaker A
Третья итерация доработки плана. Поправил сигнатуру. Если channelsnels не передан, берём все каналы СБD. Если передати для каждого канала ферсинг, сохранение, SKite. Возвращать посты за дней. Это сегодня план тот же. Начинаем.
11:42
Speaker A
Переключаемся в режим build и начинаем. Поехали. Итак, он что-то тут наколхозил. Давайте посмотрим. Было сделано, добавлены файлы, добавлены четыре тула.
11:50
Speaker A
Логика, если канал не переданный, берём всё сбд для каждого канала феч с телеграмма, парсинг, сохранение в базе данных, погинация, вплоть до котов, пропуск уже закшированных страниц.
12:00
Speaker A
Возвращаем в группированные посты за дней от сегодня. Так, прежде чем я пойду в ревью, надо сразу ему сказать, чтобы он не пытался скачать сразу весь канал.
12:08
Speaker A
Не нужно сразу качать весь канал до упора. Загружаем по дефолту первую страницу. Дальше идём. Только если видим, что не хватает данные для отображения пользователю, чтобы нас не забанили с самого начала на некорректное загрузке.
12:33
Speaker A
Не забываем, что лэмка всегда пытается сделать максимально тупо. Так, он закончил, спрашивает, какой следующий шаг. Следующий шаг у нас пойти посмотреть, что он там написал. Верить в то, что он там всё с самого начала сразу сделал корректно, я не буду. И выявил
12:46
Speaker A
один непростительный грех. Почему-то вместо channel name используется usernр по всему коду. И об этом я и скажу.
12:53
Speaker A
Нейронки. Ты везде используешь username для имени канала. Стоит пользовать. Отправляем его работать, а сами пойдём посмотрим, что он там написал. Я вам коротко расскажу. Как я и просил, были добавлены тулы. Тул, добавляющий новый канал в список отслеживания. Принимаем имя канала,
13:13
Speaker A
очищаем его и добавляем в базу данных. Возвращаем сообщение нейронке. о том, что всё выполнено. Я, пожалуй, буду убирать лишние эмодзи. Далее удаляем канал. Немножечко адаптирую читабельность, потому что нейронка всегда старается сэкономить на вертикальных пробелах, а я такого не
13:29
Speaker A
люблю. Пытаемся удалить канал. Вот это нам не нужно. Это нам тоже не нужно. Так, это у нас показывает список добавленных каналов и возвращает его лмки и запрашивает посты за последние дней. Проверяем, что у нас такой канал есть. Ну, допустим, мне это не
13:47
Speaker A
принципиально, но, в принципе, можно было бы и убрать, конечно, такую проверку. Можно было бы загружать всё подряд. Далее он проверяет дату отреза, проверяет таргеты, какое-то количество логики здесь у нас присутствует даже в действиях, и возвращает результат в виде
14:03
Speaker A
связанного текста. Так, проверим, что у нас всё ещё запущен. Да, деф-сервер запущен, значит, мы можем просто перезагрузить страничку, законнектиться к нашему сервису. И уже, кстати, видим, что ресурсов у нас здесь нету никаких не появляется. Промты у нас тоже исчезли. А
14:17
Speaker A
вот у нас список теперь достаточно большой. List tools, list channels, run tool. Так, баз данных не создалась. Как лучше в своём родейкодеры? Идём в агента и говорим ему, что у нас не создалась БД. Да, у нас просто не в том месте
14:35
Speaker A
инициация обазданны происходила, да. Ну ладно, давайте мы опять сервер законнектимся, идём в тулы, List Tools, смотрим List channels, Run Tool и видим, что у нас нет отслеживаемых каналов.
14:46
Speaker A
Давайте добавим самый лучший канал во всём Телеграме. Let's код Drew и вызовем. Канал добавлен. Смотрим список каналов.
14:56
Speaker A
Да, отслеживаемый канала Let's Code Drew добавлен. Кстати, мне не нравится, как он возвращает, поэтому давайте немножечко отредактируем. Нам не нужно вот это вот отслеживаемые каналы. К чему нам эта информация? Кстати, здесь можно было бы возвращать не только строку, но
15:09
Speaker A
и список, типа лист. Но сейчас не это главное. Давайте посмотрим, получится ли у меня загрузить посты за последние 7 дней с одного непонятного канала. Делаем runн success и видим, что лето начинается. А, да, вот вы ещё не просили. Пару постов он показывает,
15:27
Speaker A
значит, тул отрабатывает. Давайте добавим этот MCP теперь в клод. Код. Почему именно в него? потому что он лучше всего поддерживает спецификацию.
15:35
Speaker A
Останавливаем деф-режим. Запускаем наш проект в виде отдельного приложение. Видим, что он запустился на локал хосте на порте 8.000. И пишем вот такую команду в консоли. Clд MCP AD. Это команда консольного клода на добавление MCP. Соответственно, транспорт указываем HTTP, чтобы не запускать это всё через
15:53
Speaker A
Pipe. Это имя MCP нашего, как он будет зарегистрирован в системе. Scope текущий проект и адрес нашего сервера. Но в конце нужно не забыть добавить MCP, потому что MCP запускается не на рутхсте, а на пути немножечко поглубже.
16:08
Speaker A
Ссылочку на команду добавления MCP сервера в консоли я также добавлю в описание к видео. Добавляем сервер.
16:14
Speaker A
Видим, что он у нас прописался в отдельный файлик здесь в корне проекта. Следом запускаем клод. Да, у меня здесь используется подписка Clod Pro, но это не сильно влияет на результат, на самом деле. Проверяем, что у нас MCP сервер
16:27
Speaker A
подключен корректно. видим, что вот он, да, MCPG наш подключен. Ну, кстати, можно посмотреть его тулы, которые у нас здесь имеются, например. Да, всё нормально, всё работает. Теперь можно спросить, на какие каналы Telegram мы отслеживаем. Видим, что клод сразу
16:45
Speaker A
обращается к нашему MCP. Давайте разрешим ему, да, использовать этот в данном проекте. Забавно. Он он распознал, что это мой личный канал.
16:53
Speaker A
Хотите ли добавить другие каналы? Нет. Скажи, о чём говорилось. Погнали последнюю неделю. Опять разрешаем использовать тулы и получаем простенький дайджест. Получилось очень плотное видео. Я его записывал почти полтора часа. Я думаю, если вы дошли до этого момента, то вы, наверное, точно
17:12
Speaker A
поставите мне лайк, подпишитесь на канал и оставите какой-нибудь комментарий под этим видео. А также поделитесь данным видосом со своими знакомыми. Ну а если подпишитесь наponsor.ru, я буду безумно рад. Спасибо, что посмотрели это видео. Всем пока.
Topics:MCPMCP toolsMCP серверPythonSDKAI интеграцияmodel протоколресурсы MCPпромтысоздание сервера

Frequently Asked Questions

Что такое MCP и зачем он нужен?

MCP — это протокол, позволяющий AI взаимодействовать с внешними сервисами через инструменты и ресурсы, упрощая выполнение сложных задач одним запросом.

Какие основные компоненты MCP обсуждаются в видео?

В видео рассматриваются ресурсы, инструменты (tools), промты, а также клиентские функции, такие как сэмплинг, roots и stitstation.

На каком языке создаётся MCP-сервер в видео и почему?

Сервер создаётся на Python из-за лаконичности кода и удобства демонстрации, хотя SDK доступны и для других языков.

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 →