spinny:~/writing $ less mcp-model-context-protocol-guide.md
12**Model Context Protocol (MCP)** - це відкритий стандарт, створений Anthropic, який визначає, як AI-моделі взаємодіють із зовнішніми інструментами, джерелами даних та сервісами. Уявіть собі це як "USB-C для AI" - універсальний конектор, який дозволяє будь-якому AI-агенту спілкуватися з будь-яким інструментом через стандартизований інтерфейс.34З моменту запуску MCP перевищив **97 мільйонів щомісячних завантажень SDK** і був прийнятий усіма основними постачальниками AI: Anthropic, OpenAI, Google, Microsoft та Amazon. У цьому посібнику ми розглянемо все, що вам потрібно знати для роботи з MCP.56## Чому MCP існує78До MCP кожен AI-додаток мав створювати власні інтеграції для кожного інструменту, який хотів використовувати. Хочете, щоб ваш AI читав файли? Пишіть власний код. Робити запити до бази даних? Ще більше власного коду. Публікувати в Slack? Ще одна інтеграція.910Це створювало **проблему N×M**: N AI-додатків, кожному з яких потрібно M власних інтеграцій, що призводило до дублювання зусиль та фрагментації екосистем.1112```mermaid13graph TD14 subgraph "Before MCP (N×M)"15 A1[AI App 1] --> T1[GitHub Integration]16 A1 --> T2[Slack Integration]17 A1 --> T3[DB Integration]18 A2[AI App 2] --> T4[GitHub Integration]19 A2 --> T5[Slack Integration]20 A2 --> T6[DB Integration]21 end22```2324MCP вирішує це за допомогою **єдиного протоколу**, який будь-який AI-клієнт може використовувати для зв'язку з будь-яким MCP-сервером:2526```mermaid27graph TD28 subgraph "With MCP (N+M)"29 A1[AI App 1] --> MCP[MCP Protocol]30 A2[AI App 2] --> MCP31 MCP --> S1[GitHub Server]32 MCP --> S2[Slack Server]33 MCP --> S3[DB Server]34 end35```3637## Основні концепції3839MCP має три фундаментальні примітиви:4041### 1. Інструменти (Tools)42Інструменти - це функції, які AI може викликати. Вони представляють дії на кшталт "створити файл", "запитати базу даних" або "надіслати повідомлення". Кожен інструмент має назву, опис та JSON Schema для своїх параметрів.4344```typescript45{46 name: "create_issue",47 description: "Create a new GitHub issue",48 inputSchema: {49 type: "object",50 properties: {51 title: { type: "string", description: "Issue title" },52 body: { type: "string", description: "Issue body" },53 repo: { type: "string", description: "Repository name" }54 },55 required: ["title", "repo"]56 }57}58```5960### 2. Ресурси (Resources)61Ресурси - це дані, які AI може читати. Вони представляють файли, записи бази даних, відповіді API або будь-яке інше джерело даних. Ресурси ідентифікуються за URI.6263```typescript64{65 uri: "file:///Users/dev/project/README.md",66 name: "Project README",67 mimeType: "text/markdown"68}69```7071### 3. Промпти (Prompts)72Промпти - це багаторазові шаблони, які допомагають структурувати взаємодії. Вони можуть включати динамічні параметри та корисні для стандартизації типових робочих процесів.7374```typescript75{76 name: "code_review",77 description: "Review code changes for quality and security",78 arguments: [79 { name: "diff", description: "The code diff to review", required: true }80 ]81}82```8384## Архітектура8586MCP дотримується клієнт-серверної архітектури:8788```mermaid89graph LR90 subgraph "Host Application"91 Client[MCP Client]92 end9394 subgraph "MCP Server"95 Server[Server Process]96 Server --> Tools[Tools]97 Server --> Resources[Resources]98 Server --> Prompts[Prompts]99 end100101 Client -- "JSON-RPC 2.0\n(stdio or SSE)" --> Server102```103104- **Хост**: AI-додаток (Claude Desktop, Cursor, ваш власний додаток)105- **Клієнт**: Підтримує з'єднання 1:1 з MCP-сервером106- **Сервер**: Надає інструменти, ресурси та промпти клієнту107- **Транспорт**: Зв'язок здійснюється через JSON-RPC 2.0 по stdio (локально) або Server-Sent Events (віддалено)108109## Створення MCP-сервера110111Давайте створимо практичний MCP-сервер, який взаємодіє зі списком завдань, збереженим у JSON-файлі.112113### Налаштування114115```bash116mkdir mcp-todo-server && cd mcp-todo-server117npm init -y118npm install @modelcontextprotocol/sdk zod119```120121### Реалізація сервера122123```typescript124// src/index.ts125import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";126import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";127import { z } from "zod";128import fs from "fs";129130const TODO_FILE = "./todos.json";131132function readTodos(): { id: number; text: string; done: boolean }[] {133 if (!fs.existsSync(TODO_FILE)) return [];134 return JSON.parse(fs.readFileSync(TODO_FILE, "utf-8"));135}136137function writeTodos(todos: { id: number; text: string; done: boolean }[]) {138 fs.writeFileSync(TODO_FILE, JSON.stringify(todos, null, 2));139}140141const server = new McpServer({142 name: "todo-server",143 version: "1.0.0",144});145146// Tool: Add a todo147server.tool(148 "add_todo",149 "Add a new todo item",150 { text: z.string().describe("The todo text") },151 async ({ text }) => {152 const todos = readTodos();153 const newTodo = { id: Date.now(), text, done: false };154 todos.push(newTodo);155 writeTodos(todos);156 return { content: [{ type: "text", text: `Added: "${text}"` }] };157 }158);159160// Tool: List todos161server.tool(162 "list_todos",163 "List all todo items",164 {},165 async () => {166 const todos = readTodos();167 const list = todos168 .map((t) => `${t.done ? "✅" : "⬜"} [${t.id}] ${t.text}`)169 .join("\n");170 return { content: [{ type: "text", text: list || "No todos yet." }] };171 }172);173174// Tool: Complete a todo175server.tool(176 "complete_todo",177 "Mark a todo as completed",178 { id: z.number().describe("The todo ID to complete") },179 async ({ id }) => {180 const todos = readTodos();181 const todo = todos.find((t) => t.id === id);182 if (!todo) return { content: [{ type: "text", text: "Todo not found." }] };183 todo.done = true;184 writeTodos(todos);185 return { content: [{ type: "text", text: `Completed: "${todo.text}"` }] };186 }187);188189// Resource: Current todos as a readable resource190server.resource(191 "todos://list",192 "Current todo list",193 async () => ({194 contents: [{195 uri: "todos://list",196 mimeType: "application/json",197 text: JSON.stringify(readTodos(), null, 2),198 }],199 })200);201202// Start the server203const transport = new StdioServerTransport();204await server.connect(transport);205```206207### Конфігурація208209Щоб використовувати цей сервер з Claude Desktop, додайте його до вашої конфігурації:210211```json212{213 "mcpServers": {214 "todo": {215 "command": "npx",216 "args": ["tsx", "/path/to/mcp-todo-server/src/index.ts"]217 }218 }219}220```221222## Створення MCP-клієнта223224Ви також можете створити власний клієнт, який підключається до будь-якого MCP-сервера:225226```typescript227import { Client } from "@modelcontextprotocol/sdk/client/index.js";228import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";229230const transport = new StdioClientTransport({231 command: "npx",232 args: ["tsx", "./src/index.ts"],233});234235const client = new Client({ name: "my-client", version: "1.0.0" });236await client.connect(transport);237238// List available tools239const { tools } = await client.listTools();240console.log("Available tools:", tools.map((t) => t.name));241242// Call a tool243const result = await client.callTool({244 name: "add_todo",245 arguments: { text: "Write MCP blog post" },246});247console.log(result);248```249250## Популярні MCP-сервери251252Екосистема MCP швидко зросла. Ось деякі з найпопулярніших серверів:253254| Сервер | Опис | Сценарій використання |255|--------|------|----------------------|256| **GitHub** | Створення issues, PR, управління репозиторіями | Робочі процеси розробки |257| **Slack** | Надсилання повідомлень, управління каналами | Командна комунікація |258| **PostgreSQL** | Запити та управління базами даних | Доступ до даних |259| **Filesystem** | Читання, запис та пошук файлів | Локальна розробка |260| **Puppeteer** | Автоматизація браузера та скрейпінг | Веб-тестування |261| **Sentry** | Моніторинг помилок та налагодження | Підтримка продакшену |262| **Supabase** | База даних, автентифікація, сховище | Бекенд-операції |263264## MCP проти A2A (Agent-to-Agent)265266MCP обробляє комунікацію **агент-інструмент**, тоді як протокол **A2A (Agent-to-Agent)** від Google обробляє комунікацію **агент-агент**. Вони доповнюють один одного:267268```mermaid269graph TD270 Agent1[Agent 1] -- "A2A Protocol" --> Agent2[Agent 2]271 Agent1 -- "MCP Protocol" --> Tool1[GitHub MCP Server]272 Agent2 -- "MCP Protocol" --> Tool2[Database MCP Server]273```274275- **MCP**: Як AI-агент використовує інструменти (вертикальна інтеграція)276- **A2A**: Як AI-агенти співпрацюють один з одним (горизонтальна інтеграція)277278## Найкращі практики2792801. **Тримайте сервери сфокусованими**: Один сервер на домен (сервер GitHub, сервер Slack тощо). Не створюйте монолітні сервери.2812. **Валідуйте вхідні дані за допомогою Zod**: Завжди валідуйте вхідні дані інструментів правильними схемами.2823. **Обробляйте помилки коректно**: Повертайте зрозумілі повідомлення про помилки, а не стек-трейси.2834. **Використовуйте ресурси для даних лише для читання**: Якщо AI потрібно лише читати дані, надавайте їх як ресурс, а не як інструмент.2845. **Додавайте хороші описи**: Хороші описи інструментів та параметрів допомагають AI зрозуміти, коли і як використовувати кожен інструмент.2856. **Тестуйте за допомогою MCP Inspector**: Використовуйте `npx @modelcontextprotocol/inspector` для інтерактивного тестування вашого сервера.286287## Початок роботи288289```bash290# Create a new MCP server from template291npx @modelcontextprotocol/create-server my-server292293# Test with the MCP Inspector294npx @modelcontextprotocol/inspector npx tsx ./src/index.ts295```296297## Висновок298299MCP став де-факто стандартом використання AI-інструментів у 2026 році. Незалежно від того, чи ви створюєте власних AI-агентів, розширюєте Claude Code або створюєте інтеграції для існуючих платформ, розуміння MCP є необхідним. Протокол достатньо простий, щоб вивчити його за півдня, але достатньо потужний для створення AI-робочих процесів виробничого рівня.300301**Наступні кроки:**302- Ознайомтесь зі [Специфікацією MCP](https://spec.modelcontextprotocol.io/)303- Перегляньте [існуючі MCP-сервери](https://github.com/modelcontextprotocol/servers) для натхнення304- Створіть свій перший сервер з TypeScript або Python SDK305- Протестуйте його з Claude Desktop або MCP Inspector306
:MCP (Model Context Protocol): Повний посібник для розробниківlines 1-306 (END) — press q to close