1.1 Ласкаво просимо до курсу
Модуль 1 · Введення в MCP- Зрозуміти архітектуру Model Context Protocol та проблеми, які він вирішує
- Навчитися створювати MCP сервери з інструментами, ресурсами та промптами
- Побудувати повноцінний MCP клієнт, що підключається до серверів
- Освоїти три примітиви MCP: Tools, Resources, Prompts
- Отримати практичний досвід через реальні приклади на Python
Чому цей курс змінить ваш підхід до AI-інтеграцій
Уявіть, що ви будуєте AI-додаток. Ваш чат-бот повинен читати документи з Google Drive, створювати задачі в Jira, перевіряти статус CI/CD пайплайну та відповідати на запитання з бази знань. Скільки коду вам потрібно написати?
Традиційний підхід: для кожного сервісу вручну писати JSON-схеми інструментів, функції-обробники, валідацію параметрів, обробку помилок. Десятки файлів, сотні рядків шаблонного коду для кожної інтеграції.
А тепер уявіть інший світ: ви підключаєте готовий MCP-сервер для Google Drive, інший для Jira, третій для GitHub. Кожен з них вже містить усі інструменти, ресурси та промпти. Вам залишається лише написати клієнт, який з'єднає ці сервери з вашим AI-додатком.
Це і є Model Context Protocol -- стандарт, який робить AI-інтеграції простими, стандартизованими та повторно використовуваними.
Ми створимо навчальний проєкт -- CLI-чатбот з власним MCP сервером та власним MCP клієнтом. Сервер керуватиме документами у пам'яті та надаватиме:
- Tools -- інструменти для читання та редагування документів
- Resources -- ресурси для перегляду списку документів та їхнього вмісту
- Prompts -- готові промпти для форматування документів у Markdown
Клієнт підключатиметься до сервера, отримуватиме списки інструментів та передаватиме їх Claude для виконання.
Структура курсу
| Модуль | Теми | Уроки |
|---|---|---|
| M1: Введення | Архітектура MCP, клієнти, комунікація | 3 |
| M2: Сервери | Налаштування, інструменти, Inspector | 3 |
| M3: Клієнти | Реалізація, ресурси, промпти | 5 |
| M4: Підсумки | Порівняння примітивів, патерни, тест | 3 |
Передумови
- Python -- базовий рівень (функції, декоратори, type hints)
- Командний рядок -- вміння працювати в терміналі
- AI/LLM -- загальне розуміння, що таке мовні моделі та tool use
Не потрібно заздалегідь знати MCP -- ми почнемо з нуля.
Часті запитання
1.2 Що таке MCP?
Модуль 1 · Введення в MCP- Зрозуміти проблему, яку вирішує MCP
- Розібрати архітектуру: Host, Client, Server
- Пізнати три примітиви: Tools, Resources, Prompts
- Побачити різницю між традиційним підходом і MCP
Проблема: кожен сервіс -- окрема інтеграція
Ви -- розробник AI-додатку. Вам потрібно, щоб Claude міг працювати з GitHub: створювати issues, переглядати pull requests, коментувати код. Як це зробити традиційно?
- Вивчити GitHub API (десятки ендпоінтів)
- Написати JSON-схему для кожного інструменту (
create_issue,list_prs,add_comment...) - Реалізувати функцію-обробник для кожного інструменту
- Додати валідацію параметрів, обробку помилок, автентифікацію
- Підтримувати це все при оновленнях API
Тепер уявіть, що вам потрібні ще Slack, Google Drive, Jira, PostgreSQL... Кожна інтеграція -- це тижні роботи. А тепер помножте це на кожну команду розробників у світі, яка пише ті самі обгортки знову і знову.
Пам'ятаєте часи, коли кожен телефон мав свій зарядний кабель? Nokia -- один, Samsung -- інший, iPhone -- третій. Щоб зарядити три пристрої, потрібні три різні кабелі.
Потім з'явився USB-C -- один стандарт для всього. Один кабель заряджає телефон, ноутбук, навушники, планшет.
MCP -- це USB-C для AI-інтеграцій. Замість окремого "кабеля" (інтеграції) для кожного сервісу, MCP надає єдиний стандарт. Хтось створює MCP-сервер для GitHub, хтось для Slack -- і будь-який MCP-клієнт може підключитися до них без додаткового коду.
Рішення: Model Context Protocol
MCP (Model Context Protocol) -- це комунікаційний шар, що надає AI-моделям контекст та інструменти без необхідності розробникам писати шаблонний код. MCP зміщує відповідальність за створення інструментів від вашого додатку до спеціалізованих MCP-серверів.
Замість того щоб ви писали tool-схеми та обробники для GitHub API, хтось інший (часто сам провайдер сервісу) створює MCP-сервер -- пакет з готовими інструментами, ресурсами та промптами. Ви просто підключаєтесь до нього.
Архітектура MCP
MCP побудований на чіткій архітектурі з трьома рівнями:
Host (Хост)
AI-додаток, в якому працює мовна модель. Наприклад, Claude Desktop, ваш CLI-чатбот або будь-який інший AI-клієнт. Хост містить один або кілька MCP-клієнтів.
MCP Client (Клієнт)
Комунікаційний інтерфейс між хостом і MCP-сервером. Кожен клієнт підключається до одного сервера. Клієнт не виконує інструменти сам -- він лише передає запити серверу і повертає результати.
MCP Server (Сервер)
Інтерфейс до зовнішнього сервісу, що надає три типи можливостей:
- Tools (інструменти) -- дії, які AI може виконувати
- Resources (ресурси) -- дані для читання
- Prompts (промпти) -- готові інструкції для AI
Ця архітектура створює екосистему. Автор MCP-сервера для GitHub робить це один раз -- і тисячі додатків можуть використовувати його. Розробник AI-додатку пише клієнт один раз -- і може підключити будь-який MCP-сервер. Кожна сторона робить свою частину роботи.
Три примітиви MCP
MCP-сервер може надавати три типи примітивів. Кожен з них має чітке призначення та контролюється різними сторонами:
| Примітив | Хто контролює | Призначення | Приклад |
|---|---|---|---|
| Tools | AI-модель | Дії, що змінюють стан | Створити issue, відправити повідомлення |
| Resources | Додаток | Дані для читання | Список документів, вміст файлу |
| Prompts | Користувач | Готові інструкції | Форматування документа, код-рев'ю |
Не хвилюйтесь, якщо різниця поки що здається тонкою. У модулях 2 та 3 ми реалізуємо кожен з них і побачимо різницю на практиці.
Транспорт: як клієнт спілкується з сервером
MCP -- transport-agnostic протокол. Це означає, що клієнт і сервер можуть комунікувати через різні канали:
- stdio (stdin/stdout) -- найпоширеніший варіант для локальних серверів. Клієнт і сервер працюють на одній машині.
- SSE (Server-Sent Events) -- для віддалених серверів через HTTP.
- WebSocket -- для двосторонньої комунікації у реальному часі.
У нашому навчальному проєкті ми використаємо stdio -- обидва компоненти працюватимуть на вашій машині.
Комунікація між клієнтом і сервером відбувається через визначені типи повідомлень:
- list_tools request/result -- клієнт запитує список доступних інструментів
- call_tool request/result -- клієнт просить виконати інструмент з параметрами
- read_resource request/result -- клієнт запитує дані ресурсу за URI
- list_prompts / get_prompt -- клієнт отримує список або конкретний промпт
Хто створює MCP-сервери?
Подумайте про сервіс, з яким ви часто працюєте (GitHub, Notion, Trello, база даних, тощо). Запишіть:
- Які інструменти (tools) ви б надали? (мінімум 3)
- Які ресурси (resources) можна було б читати?
- Які промпти (prompts) спростили б роботу?
Приклад: MCP-сервер для Notion
Tools: create_page, update_page, delete_page, add_comment, create_database
Resources: notion://pages (список сторінок), notion://pages/{id} (вміст сторінки), notion://databases (список баз)
Prompts: /summarize -- підсумувати сторінку, /meeting-notes -- створити шаблон нотаток зустрічі, /review -- рецензувати документ
1. Яку головну проблему вирішує MCP?
2. Який транспорт найчастіше використовується для локальних MCP-серверів?
3. Які три примітиви надає MCP-сервер?
1.3 MCP клієнти
Модуль 1 · Введення в MCP- Зрозуміти роль MCP-клієнта в архітектурі
- Розібрати повний потік взаємодії від запиту користувача до відповіді
- Побачити типи повідомлень між клієнтом і сервером
Роль клієнта: посередник, а не виконавець
MCP-клієнт -- це комунікаційний інтерфейс між вашим сервером (де працює AI) і MCP-сервером (де живуть інструменти). Ключовий момент: клієнт нічого не виконує сам. Він лише передає запити та повертає відповіді.
Уявіть диспетчера таксі. Пасажир (LLM) дзвонить і каже: "Мені потрібно дістатися з точки А до точки Б". Диспетчер (MCP-клієнт) не їде сам -- він знаходить потрібного водія (MCP-сервер), передає замовлення і координує поїздку. Коли водій завершує маршрут, диспетчер повідомляє пасажиру результат.
Якщо пасажиру потрібна вантажівка, диспетчер знайде вантажівку. Потрібен мінівен -- знайде мінівен. Диспетчер знає, які водії (сервери) доступні і які послуги вони надають.
Повний потік взаємодії
Давайте прослідкуємо повний шлях запиту -- від того, що каже користувач, до фінальної відповіді:
Зверніть увагу: MCP-клієнт бере участь двічі -- спочатку для отримання списку інструментів, потім для виклику обраного інструменту. Це двофазний процес: discovery (що є?) і execution (зроби це). Саме ця структура робить MCP гнучким -- нові інструменти автоматично стають доступними без зміни коду клієнта.
Типи повідомлень
Комунікація між MCP-клієнтом і MCP-сервером відбувається через визначені пари request/result:
| Запит | Відповідь | Призначення |
|---|---|---|
| list_tools request | list_tools result | Отримати список доступних інструментів |
| call_tool request | call_tool result | Виконати інструмент з аргументами |
| read_resource request | read_resource result | Прочитати дані ресурсу за URI |
| list_prompts request | list_prompts result | Отримати список доступних промптів |
| get_prompt request | get_prompt result | Отримати конкретний промпт з аргументами |
Transport-agnostic комунікація
MCP-клієнт і MCP-сервер можуть спілкуватися через різні протоколи передачі (транспорти). Для клієнта це прозоро -- він надсилає ті самі повідомлення незалежно від транспорту.
Найпоширеніший варіант для навчання та локальної розробки -- stdio. Обидва процеси працюють на одній машині, комунікуючи через стандартний ввід/вивід.
Користувач каже: "Зміни заголовок у файлі notes.txt на 'Нотатки проєкту'". Опишіть повний потік взаємодії між усіма компонентами MCP-архітектури (Host, Client, Server, External Service).
- Host приймає запит користувача
- Host запитує MCP Client: list_tools
- MCP Client пересилає запит MCP Server
- MCP Server повертає: [read_doc_contents, edit_document]
- Host надсилає Claude запит + інструменти
- Claude обирає edit_document(doc_id="notes.txt", old_string="старий заголовок", new_string="Нотатки проєкту")
- Host просить MCP Client виконати call_tool
- MCP Client передає запит MCP Server
- MCP Server виконує edit_document на зовнішньому ресурсі
- Результат повертається: MCP Server -> MCP Client -> Host -> Claude -> Користувач
1. Яка головна роль MCP-клієнта?
2. Скільки разів MCP-клієнт бере участь у типовому потоці запиту?
3. Що означає "transport-agnostic"?
2.1 Налаштування проєкту
Модуль 2 · Створення MCP серверів- Налаштувати Python-проєкт з MCP SDK
- Зрозуміти структуру навчального проєкту
- Створити базовий скелет MCP-сервера
- Запустити проєкт і перевірити його роботу
Навчальний проєкт: CLI-чатбот з MCP
Замість абстрактної теорії ми одразу будемо працювати з реальним проєктом. Наш навчальний проєкт -- це CLI-чатбот, який реалізує обидві сторони MCP: і клієнт, і сервер. У реальному світі зазвичай проєкт реалізує або клієнт, або сервер, але для навчання ми зробимо обидва.
- MCP-сервер -- керує документами у пам'яті (без бази даних)
- MCP-клієнт -- підключається до сервера та надає інструменти Claude
- CLI-інтерфейс -- де користувач спілкується з Claude через командний рядок
Встановлення залежностей
MCP Python SDK значно спрощує роботу -- він автоматично генерує JSON-схеми з декорованих Python-функцій.
Або, якщо ви використовуєте UV (швидший менеджер пакетів):
Структура проєкту
Базовий скелет сервера
Створення MCP-сервера починається з однієї лінії коду:
Зверніть увагу, наскільки це просто: FastMCP("Document Manager") -- і сервер готовий. Порівняйте з традиційним підходом, де вам потрібно було б вручну створювати HTTP-сервер, визначати маршрути, серіалізувати/десеріалізувати JSON, обробляти протокол... MCP SDK бере всю інфраструктуру на себе.
Файл конфігурації
Створіть файл .env у корені проєкту:
Запуск та перевірка
Для запуску навчального проєкту:
Якщо все налаштовано правильно, ви побачите запрошення до чату. Спробуйте просте запитання для перевірки:
- ModuleNotFoundError: mcp -- перевірте, що ви встановили пакет:
pip install mcp - ANTHROPIC_API_KEY not set -- переконайтесь, що файл .env існує і містить ключ
- Permission denied -- спробуйте
pip install --user mcp
Створіть порожній MCP-сервер з FastMCP та словник з 3 тестовими документами. Переконайтесь, що сервер створюється без помилок. Які поля повинен мати кожен документ у словнику?
Словник документів -- це проста структура {doc_id: content}, де ключ -- ім'я документа, а значення -- його текстовий вміст:
Документ -- просто рядок тексту. У реальному проєкті це могла б бути структура з метаданими, але для навчання достатньо простого словника.
2.2 Визначення інструментів (Tools)
Модуль 2 · Створення MCP серверів- Створити MCP-інструменти з декоратором @mcp.tool()
- Використати type hints та Field descriptions для автоматичної генерації JSON-схем
- Реалізувати інструменти для читання та редагування документів
- Зрозуміти, як Python SDK перетворює функції на tool-схеми
Інструменти -- це меню ресторану для AI
Коли ви приходите в ресторан, офіціант дає вам меню. Меню описує кожну страву: назва, інгредієнти, ціна. Ви обираєте, що хочете, і кухня готує це для вас.
MCP-інструменти -- це меню для AI. Кожен інструмент має назву, опис параметрів і результат. AI переглядає "меню", обирає потрібний інструмент і "замовляє" його виконання. MCP-сервер -- це кухня, що виконує замовлення.
Традиційний підхід vs MCP SDK
Раніше, щоб створити інструмент для AI, потрібно було вручну написати JSON-схему:
З MCP Python SDK все це замінюється одним декоратором:
MCP SDK автоматично:
- Генерує JSON-схему з type hints (
str,int,bool...) - Використовує
Field(description=...)для опису параметрів - Бере docstring функції як опис інструменту
- Реєструє функцію як обробник інструменту
Жодного ручного JSON! Python код -- єдине джерело правди.
Інструмент 1: Читання документа
Інструмент 2: Редагування документа
Патерн реалізації інструментів
Кожен MCP-інструмент слідує одному і тому ж патерну:
Цей патерн масштабується. Чи ви створюєте інструмент для читання документа, чи для виклику Kubernetes API -- структура однакова. Декоратор + type hints + Field descriptions + валідація + логіка. MCP SDK робить всю інфраструктурну роботу за вас.
Field descriptions -- мова спілкування з AI
Field(description=...) з Pydantic -- це те, що AI "читає", коли обирає інструмент. Чим точніше опис, тим краще AI розуміє, коли і як використовувати інструмент.
Погано: Field(description="id")
Добре: Field(description="The unique identifier of the document, e.g. 'report.pdf' or 'notes.txt'")
AI повинен зрозуміти з опису, яке значення передати. Це не коментар для розробника -- це інструкція для моделі.
Напишіть MCP-інструмент delete_document, який видаляє документ зі словника docs. Інструмент повинен:
- Приймати
doc_idяк параметр з описом - Перевіряти, чи існує документ
- Видаляти документ і повертати підтвердження
2.3 Server Inspector
Модуль 2 · Створення MCP серверів- Навчитися запускати MCP Inspector для тестування серверів
- Протестувати інструменти через браузерний інтерфейс
- Зрозуміти процес дебагінгу MCP-серверів
Тестування без клієнта
Ви написали MCP-сервер з інструментами. Як перевірити, що вони працюють, не будуючи повноцінний клієнт? MCP Inspector -- це браузерний дебагер, який дозволяє тестувати ваш сервер прямо у браузері.
Уявіть, що ви механік, який зібрав двигун. Перш ніж ставити його в автомобіль, ви тестуєте його на стенді. MCP Inspector -- це такий тестовий стенд для вашого MCP-сервера.
Запуск Inspector
Ця команда:
- Запускає ваш MCP-сервер
- Підключається до нього як клієнт
- Відкриває веб-інтерфейс на
localhost
Інтерфейс Inspector
Процес тестування
- Підключіться -- натисніть "Connect" у лівій панелі
- Перейдіть до Tools -- оберіть вкладку "Tools" у верхній навігації
- Оберіть інструмент -- клікніть на інструмент зі списку (наприклад,
read_doc_contents) - Введіть параметри -- заповніть поля (наприклад,
doc_id: "report.pdf") - Запустіть -- натисніть "Run Tool"
- Перевірте результат -- переконайтесь, що вивід коректний
- Успішний сценарій -- коректний doc_id повертає вміст
- Помилковий сценарій -- неіснуючий doc_id повертає помилку
- Граничні випадки -- порожній рядок, спеціальні символи
- Ланцюжок операцій -- прочитати, відредагувати, прочитати знову
Inspector -- це перший етап тестування MCP-сервера. Він дозволяє перевірити кожен інструмент ізольовано, без побудови клієнта. Це економить час і допомагає знайти помилки на ранньому етапі. У реальних проєктах Inspector також корисний для документування доступних інструментів та їхніх параметрів.
Дебагінг поширених проблем
- "Tool not found" -- перевірте, що функція має декоратор
@mcp.tool() - "Invalid parameters" -- перевірте type hints та Field descriptions
- "Server disconnected" -- перевірте, що сервер запущений і немає runtime помилок
- Inspector не відкривається -- перевірте, чи активоване Python-середовище
Inspector знаходиться в активній розробці -- його інтерфейс може змінюватися, але основна функціональність (підключення, вибір інструменту, введення параметрів, запуск) залишається стабільною.
Запустіть Inspector для вашого сервера і виконайте наступний ланцюжок:
- Прочитайте документ
notes.txtза допомогоюread_doc_contents - Відредагуйте його за допомогою
edit_document-- замініть "Monday" на "Tuesday" - Прочитайте документ ще раз, щоб переконатися у зміні
Що ви очікуєте побачити на кожному кроці?
- Крок 1: read_doc_contents(doc_id="notes.txt") -> "Meeting notes from Monday..."
- Крок 2: edit_document(doc_id="notes.txt", old_string="Monday", new_string="Tuesday") -> "Successfully edited notes.txt"
- Крок 3: read_doc_contents(doc_id="notes.txt") -> "Meeting notes from Tuesday..."
Якщо на кроці 3 ви бачите "Tuesday" замість "Monday" -- все працює правильно!
1. Як запустити MCP Inspector?
2. Що робить декоратор @mcp.tool()?
3. Для чого використовується Field(description=...)?
4. Який патерн слідують MCP-інструменти?
3.1 Реалізація клієнта
Модуль 3 · Підключення клієнтів- Побудувати MCP-клієнт, що підключається до сервера
- Реалізувати list_tools() та call_tool()
- Зрозуміти управління ресурсами та cleanup
- Інтегрувати клієнт з CLI-чатботом
Від тестування до реальної інтеграції
У попередньому модулі ми створили сервер і протестували його через Inspector. Тепер час побудувати програмний клієнт -- код, який буде підключатися до сервера, отримувати список інструментів і викликати їх за запитом Claude.
Це як перехід від тестового стенду до реального автомобіля. Двигун (сервер) працює, тепер потрібно з'єднати його з коробкою передач (клієнтом), щоб автомобіль поїхав.
Клас MCPClient
Стандартний підхід -- обгортка навколо ClientSession з MCP SDK для управління з'єднанням та ресурсами:
MCP ClientSession потребує правильного управління ресурсами -- з'єднання повинно бути закритим при завершенні. Обгортковий клас інкапсулює цю логіку, надаючи чистий API для решти додатку: connect(), list_tools(), call_tool(), cleanup().
Інтеграція з Claude
Тепер підключимо клієнт до циклу чату з Claude:
Потік tool calling
Після реалізації клієнта, запустіть CLI-чатбот і протестуйте наступний діалог:
- "What documents are available?" -- Claude повинен використати інструмент
- "What's in the report?" -- Claude повинен прочитати report.pdf
- "Change 'Quarterly' to 'Annual' in the report" -- Claude повинен відредагувати документ
Що ви очікуєте на кожному кроці?
- Claude викличе
read_doc_contentsабо спитає, які документи є (залежить від наявних інструментів) - Claude викличе
read_doc_contents(doc_id="report.pdf")і поверне вміст - Claude викличе
edit_document(doc_id="report.pdf", old_string="Quarterly", new_string="Annual")і підтвердить зміну
Кожного разу Claude самостійно обирає інструмент на основі контексту розмови та описів tools.
3.2 Визначення ресурсів (Resources)
Модуль 3 · Підключення клієнтів- Зрозуміти різницю між Tools та Resources
- Створити статичні та шаблонні ресурси
- Використати MIME-типи для правильної серіалізації
- Застосувати декоратор @mcp.resource()
Ресурси -- це дані для читання, не для дій
Уявіть бібліотеку. Книги (дані) стоять на полицях. Каталог (ресурси) допомагає знайти потрібну книгу: ви шукаєте за назвою, автором або жанром, і каталог показує, де саме стоїть книга.
MCP-ресурси працюють так само: вони надають доступ до даних, але не змінюють їх. Хочете прочитати список документів? Ресурс. Хочете побачити вміст документа? Ресурс. Хочете відредагувати документ? Інструмент.
Tools vs Resources
| Характеристика | Tools | Resources |
|---|---|---|
| Призначення | Дії, що змінюють стан | Читання даних |
| Хто контролює | AI-модель обирає | Додаток запитує |
| Приклад | edit_document, send_message | Список документів, вміст файлу |
| Аналогія | Кнопки на пульті | Екран телевізора |
Два типи ресурсів
1. Статичний ресурс (Direct Resource)
Має фіксований URI. Завжди повертає те саме "джерело" даних:
URI docs://documents -- це "адреса" ресурсу. Клієнт звертається до цієї адреси, щоб отримати список документів.
2. Шаблонний ресурс (Templated Resource)
URI містить параметр у фігурних дужках. Параметр стає аргументом функції:
Тут {doc_id} в URI стає параметром doc_id у функції. Це як маршрути у веб-фреймворках: /users/{id} -> def get_user(id).
MIME-типи
MIME-тип підказує клієнту, як інтерпретувати повернені дані:
MIME-тип -- це контракт між сервером і клієнтом. Якщо сервер каже "application/json", клієнт знає, що потрібно розпарсити JSON. Якщо "text/plain" -- просто показати текст. Неправильний MIME-тип може призвести до помилок десеріалізації на стороні клієнта.
Коли використовувати Resources замість Tools?
Якщо операція тільки читає дані і не змінює стан -- це ресурс. Якщо операція створює, оновлює або видаляє щось -- це інструмент.
- Показати список файлів -> Resource
- Прочитати вміст файлу -> Resource
- Відредагувати файл -> Tool
- Видалити файл -> Tool
- Показати статус CI/CD -> Resource
- Запустити пайплайн -> Tool
Створіть шаблонний ресурс docs://documents/{doc_id}/metadata, який повертає JSON з метаданими документа: id, length (кількість символів), words (кількість слів).
3.3 Доступ до ресурсів з клієнта
Модуль 3 · Підключення клієнтів- Реалізувати read_resource() у MCP-клієнті
- Навчитися обробляти різні MIME-типи
- Інтегрувати ресурси з CLI-чатботом для контекстного доповнення
Читання ресурсів з клієнта
Тепер, коли ми визначили ресурси на сервері, потрібно навчити клієнт їх читати. Додаємо метод read_resource() до нашого MCPClient:
Обробка MIME-типів
Зверніть увагу на перевірку mime_type. Це ключовий момент:
Без перевірки MIME-типу клієнт не знає, як інтерпретувати дані. Якщо сервер повертає JSON-рядок, а клієнт обробляє його як звичайний текст -- ви отримаєте сирий JSON замість зручного Python-об'єкта. MIME-тип -- це контракт між сервером і клієнтом.
Інтеграція ресурсів з чатботом
Ресурси можна використовувати для контекстного доповнення -- автоматичного додавання даних до промпту Claude перед запитом:
Ресурси vs Tools для читання
Виникає запитання: якщо у нас є інструмент read_doc_contents, навіщо створювати ресурс docs://documents/{doc_id}? Різниця в хто контролює:
- Tool read_doc_contents: Claude сам вирішує, коли прочитати документ (model-controlled)
- Resource docs://documents/{doc_id}: ваш додаток вирішує, коли завантажити дані (app-controlled)
Наприклад, ви можете завантажити вміст документа через ресурс до початку чату і вставити в системний промпт -- без участі Claude. А інструмент Claude використає, коли сам вирішить, що потрібно прочитати документ.
Реалізуйте функцію select_documents(client), яка:
- Отримує список документів через
read_resource("docs://documents") - Виводить список користувачу
- Дозволяє обрати один або кілька документів
- Завантажує вміст обраних документів через шаблонний ресурс
- Повертає об'єднаний контекст
3.4 Визначення промптів (Prompts)
Модуль 3 · Підключення клієнтів- Зрозуміти роль промптів як третього примітиву MCP
- Створити промпт-шаблони з аргументами
- Побачити, як промпти відрізняються від Tools та Resources
- Застосувати декоратор @mcp.prompt()
Промпти -- готові рецепти для AI
Уявіть, що ви прийшли в ресторан і хочете приготувати страву. Варіант A: ви описуєте кожен інгредієнт і крок ("візьміть 200г борошна, 2 яйця, змішайте..."). Варіант B: ви кажете "зробіть за рецептом шеф-кухаря номер 5".
MCP-промпти -- це рецепти шеф-кухаря. Замість того, щоб користувач щоразу вигадував ідеальний промпт -- автор MCP-сервера створює перевірені, оптимізовані інструкції для типових задач. Користувач просто обирає потрібний рецепт.
Чим промпти відрізняються від Tools та Resources?
| Примітив | Контролює | Тригер |
|---|---|---|
| Tools | AI-модель | Claude сам вирішує використати |
| Resources | Додаток | Код додатку запитує дані |
| Prompts | Користувач | Користувач обирає через slash-команду або кнопку |
Промпти -- це user-controlled примітив. Вони не виконуються автоматично -- користувач явно обирає їх (наприклад, набирає /format у CLI або натискає кнопку в UI).
Створення промптів
Промпт визначається декоратором @mcp.prompt(). Функція повертає список повідомлень, які будуть надіслані Claude:
Промпт з кількома аргументами
Автор MCP-сервера для, наприклад, системи документації краще за всіх знає, як правильно попросити AI працювати з документами. Він вкладає свою експертизу у промпти. Замість того, щоб кожен користувач вигадував промпт для рецензування -- автор створює /review, що містить всі найкращі практики.
Як промпти використовуються
Створіть MCP-промпт summarize, який просить Claude:
- Прочитати документ за допомогою read_doc_contents
- Створити короткий підсумок (3-5 речень)
- Виділити ключові пункти
- Запропонувати наступні кроки
3.5 Промпти в клієнті
Модуль 3 · Підключення клієнтів- Реалізувати list_prompts() та get_prompt() у клієнті
- Інтегрувати slash-команди з CLI-чатботом
- Побачити повний цикл: від slash-команди до результату
Клієнтська сторона промптів
Промпти визначені на сервері, але запускаються клієнтом. Додаємо два нових методи до MCPClient:
Потік аргументів
Коли клієнт викликає get_prompt("format", {"doc_id": "notes.txt"}), відбувається наступне:
Промпти -- це серверні шаблони, які клієнт може викликати з параметрами. Сервер інтерполює параметри у текст промпту та повертає готові повідомлення для AI. Це забезпечує повторне використання якісних промптів без дублювання коду на стороні клієнтів.
Інтеграція slash-команд у CLI
Повний цикл slash-команди
У реальних MCP-серверах промпти використовуються для:
- Claude Desktop: кнопки "Chat starters" -- це промпти MCP-серверів
- Google Drive MCP:
/analyze-spreadsheet-- аналіз даних у таблиці - GitHub MCP:
/code-review-- рецензування pull request з найкращими практиками - Database MCP:
/optimize-query-- оптимізація SQL-запиту
Реалізуйте функцію autocomplete_command(client, partial_input), яка:
- Отримує список промптів через
list_prompts() - Фільтрує промпти, що починаються з введеного тексту
- Повертає список підказок
Наприклад: введення "/f" повинно запропонувати "/format".
1. Яка різниця між ресурсом та інструментом для читання даних?
2. Що робить MIME-тип у ресурсі?
3. Хто контролює виконання промптів?
4. Що повертає get_prompt()?
4.1 Коли що використовувати
Модуль 4 · Підсумки- Чітко розрізняти три примітиви MCP
- Навчитися обирати правильний примітив для кожної задачі
- Зрозуміти принцип "хто контролює"
Фреймворк прийняття рішень
Після трьох модулів ви реалізували всі три примітиви. Але як обрати правильний для конкретної задачі? Ось простий фреймворк:
Детальне порівняння
| Характеристика | Tools | Resources | Prompts |
|---|---|---|---|
| Контроль | AI-модель | Додаток | Користувач |
| Призначення | Додати здатності AI | Надати дані додатку | Автоматизувати робочий процес |
| Тригер | Claude сам обирає | Код додатку запитує | Користувач натискає / набирає |
| Приклад | Виконати JS для обчислень | Список документів у Google Drive | Кнопка "Chat starter" у Claude |
| Змінює стан? | Може змінювати | Тільки читає | Через tools може змінювати |
| Автоматичний? | Так (Claude вирішує) | Так (код вирішує) | Ні (користувач ініціює) |
| Кому служить | Моделі | Додатку | Користувачу |
Реальні приклади
- Tools: create_file, move_file, share_file, delete_file
- Resources: drive://files (список файлів для UI автодоповнення), drive://files/{id} (вміст файлу для контекстного меню)
- Prompts: /analyze-spreadsheet (аналіз даних), /summarize-doc (підсумок документа)
- Tools: create_issue, create_pr, add_comment, merge_pr
- Resources: github://repos (список репозиторіїв), github://repos/{owner}/{name}/issues (список issues)
- Prompts: /code-review (рецензування PR), /triage-issue (категоризація issue)
- Tools: execute_query (виконати SQL), create_table, insert_row
- Resources: db://tables (список таблиць), db://tables/{name}/schema (схема таблиці)
- Prompts: /optimize-query (оптимізація SQL), /explain-table (пояснення структури)
Дерево рішень
Для кожної задачі визначте, який примітив потрібен -- Tool, Resource чи Prompt:
- Показати список відкритих PR у sidebar додатку
- Автоматично виправити ESLint помилки у файлі
- Шаблон для написання unit-тестів за slash-командою
- Завантажити конфігурацію CI/CD для аналізу
- Відправити повідомлення у Slack-канал
- Кнопка "Пояснити цей код" у UI
- Resource -- дані для UI (app-controlled, тільки читання)
- Tool -- дія, що змінює файли (model-controlled)
- Prompt -- шаблон за запитом користувача (user-controlled)
- Resource -- читання даних для контексту (app-controlled)
- Tool -- дія з побічним ефектом (model-controlled)
- Prompt -- ініціюється користувачем через UI (user-controlled)
4.2 Практичні патерни інтеграції
Модуль 4 · Підсумки- Вивчити патерни автодоповнення та контекстної ін'єкції
- Зрозуміти, як комбінувати примітиви
- Спроєктувати MCP-сервер для реального сценарію
Патерн 1: Контекстна ін'єкція
Один з найпотужніших патернів -- автоматичне додавання контексту до промпту перед надсиланням Claude. Це комбінація Resources + основного запиту:
Claude отримує список документів до того, як починає думати. Це як дати студенту перелік доступних підручників перед іспитом -- він знає, де шукати відповіді, і діє ефективніше.
Патерн 2: Autocomplete через Resources
Ресурси ідеально підходять для автодоповнення у UI. Замість завантаження повного вмісту -- показуємо список опцій:
Патерн 3: Комбінація примітивів
Найпотужніші сценарії виникають при комбінації всіх трьох примітивів:
Один хост може підключатися до кількох MCP-серверів одночасно. Це створює потужні інтеграції:
Claude бачить всі інструменти з усіх серверів і може комбінувати їх: "Знайди баг у базі даних, створи GitHub issue і повідом команду у Slack" -- один запит, три сервери.
Патерн 5: Graceful degradation
Завжди враховуйте, що MCP-сервер може бути недоступним:
Проєктування власного MCP-сервера
Ви будуєте MCP-сервер для CI/CD системи (наприклад, GitHub Actions). Спроєктуйте:
- Tools (мінімум 4) -- що AI може робити?
- Resources (мінімум 3) -- які дані надавати?
- Prompts (мінімум 2) -- які workflow автоматизувати?
- Для кожного ресурсу вкажіть URI та MIME-тип
Tools:
trigger_workflow(repo, workflow_id)-- запустити пайплайнcancel_run(repo, run_id)-- скасувати запускretry_job(repo, job_id)-- перезапустити невдалий крокupdate_secret(repo, name, value)-- оновити секрет
Resources:
ci://repos/{owner}/{repo}/workflows(application/json) -- список workflowci://repos/{owner}/{repo}/runs(application/json) -- останні запускиci://repos/{owner}/{repo}/runs/{id}/logs(text/plain) -- логи запуску
Prompts:
/diagnose-failure-- проаналізувати причину збою пайплайну/optimize-pipeline-- запропонувати оптимізації для швидкості
Проєктування MCP-сервера -- це навичка, яка стає все ціннішою. Екосистема MCP зростає швидко. Якщо ви зможете створювати якісні MCP-сервери для сервісів, з якими працюєте -- ви робите свій AI-досвід та досвід інших розробників значно кращим.
4.3 Підсумковий тест
Модуль 4 · ПідсумкиЦей тест охоплює весь курс -- від архітектури MCP до практичних патернів. Спробуйте відповісти без підглядання у попередні уроки! 8 запитань, кожне перевіряє розуміння ключових концепцій.
1. Яку головну проблему вирішує Model Context Protocol?
2. Яка правильна архітектура MCP?
3. Який декоратор реєструє функцію як MCP-інструмент у Python SDK?
4. Чим відрізняється Resource від Tool для читання даних?
5. Для чого потрібен Field(description=...) у параметрах інструменту?
6. Як MCP Inspector допомагає в розробці?
7. Що повертає get_prompt() у MCP?
8. Який патерн дозволяє AI використовувати інструменти з кількох різних сервісів одночасно?
Підсумок курсу
- Модуль 1: Архітектура MCP (Host -> Client -> Server), три примітиви, транспорти
- Модуль 2: Створення MCP-серверів з Python SDK, @mcp.tool(), Field descriptions, Inspector
- Модуль 3: Побудова клієнтів, @mcp.resource(), MIME-типи, @mcp.prompt(), slash-команди
- Модуль 4: Фреймворк вибору примітивів, патерни інтеграції, проєктування серверів
- MCP = USB-C для AI. Один стандарт замість тисяч окремих інтеграцій.
- Три примітиви = три рівні контролю. Tools (модель), Resources (додаток), Prompts (користувач).
- Python SDK усуває шаблонний код. Декоратори + type hints = автоматичні JSON-схеми.
- Проєктування MCP-сервера -- це навичка. Правильний вибір примітивів визначає якість інтеграції.
Наступні кроки
- Побудуйте свій MCP-сервер для сервісу, з яким працюєте щодня
- Дослідіть офіційні MCP-сервери на
github.com/modelcontextprotocol/servers - Підключіть MCP до Claude Desktop -- налаштуйте
claude_desktop_config.json - Вивчіть SSE транспорт для віддалених серверів
- Поділіться своїм сервером з спільнотою!
Часті запитання
github.com/modelcontextprotocol/servers. Там є сервери для GitHub, Google Drive, Slack, PostgreSQL, Filesystem та багатьох інших. Також шукайте по тегу "mcp-server" на GitHub.Вітаємо!
Ви пройшли шлях від знайомства з архітектурою MCP до побудови повноцінних серверів та клієнтів. Ви знаєте три примітиви, вмієте їх реалізовувати та обирати правильний для кожної задачі.
Тепер створюйте власні MCP-сервери та розширюйте можливості AI!
Пам'ятайте: MCP -- це екосистема. Кожен ваш сервер робить AI-інструменти кращими для всіх. Приєднуйтесь до спільноти та діліться своїми рішеннями.