MCP пояснено: як створити асистента для PostgreSQL на основі природної мови для Claude.
MCP пояснюється через проект: як Model Context Protocol перетворює інтеграції типу N x M на формат N + M, який потім може запитувати тільки для читання сервер PostgreSQL у Claude Desktop.
Джерела: MCP Explained: The Protocol That Finally Gives AI a Standard Way to Talk to the World
Проблема «клеючого» коду
У певний момент кожен розробник, який створює продукти на основі ШІ, стикається з однаковою перешкодою. Модель є функціональною, а корисні дані знаходяться в базі даних, файловій системі чи якомусь API. Бракує ж чистого, стандартизованого способу поєднання цих двох елементів.
Тож з’являється «клеючий» код: тут адаптер, там крихкий обгорток. Він працює доти, доки не змінюється модель, не з’являється ще один джерело даних чи поки новий колега не змушений буде реверс-інжинірингувати всю інфраструктуру обробки даних.
Відповідь від Anthropic з’явилась у листопаді 2024 року у вигляді Model Context Protocol (MCP). Протягом приблизно двох років він перетворився з нішевого експерименту на основну інфраструктуру для агентів: до середини 2026 року кількість завантажень SDK сягнула 97 мільйонів на місяць, а у офіційному реєстрі налічувалося майже 10 000 активних публічних серверів.
Уявіть продукт, у якому користувачі ставлять запитання щодо даних компанії простою англійською мовою. Ідея проста, але реалізація складна. Система має інтерпретувати запитання, перетворювати його на запит до бази даних, виконувати його, передавати результати моделі та сформувати відповідь. Якщо додати до цього всі інструменти, з якими має працювати ШІ — календар, репозиторій у GitHub чи робочий простір у Slack — кожен з них стає окремою інтеграцією з власними форматами API, процедурами автентифікації та форматами помилок.
Деякі інженери називають таку ситуацію «інтеграцією у стилі спагеті». Якщо позначити кількість моделей як N, а інструментів — як M, кожна пара вимагає власного коду. Додавши ще одну модель, потрібно переробляти код для всіх інструментів, а додавши ще один інструмент — оновлювати інтеграції кожної моделі.
Що таке MCP
MCP — це відкритий стандарт, заснований на JSON-RPC 2.0, який надає моделям спільний словниковий запас для взаємодії з зовнішніми інструментами та даними. Кількість можливих комбінацій N × M скорочується до N + M, оскільки один сервер може обслуговувати будь-якого клієнта, який дотримується цього протоколу.
Найпопулярнішою аналогією є USB-C. Раніше зарядні пристрої відрізнялися для ноутбуків, телефонів, камер та навушників, кожен з яких потребував власного кабелю. USB-C змінив сам роз’єм, але не схему живлення, і тепер один кабель підходить для всього. MCP виконує подібну функцію для ШІ: модель, яка розуміє цей протокол, може взаємодіяти з будь-яким інструментом, який його підтримує, тож сервер, написаний один раз, працюватиме з кожною сумісною моделлю.
Управління зробило 2026 рік поворотним моментом. У грудні 2025 року Anthropic передала MCP до Agentic AI Foundation — спеціалізованого фонду в межах Linux Foundation, який було спільно створено Anthropic, Block та OpenAI, що свідчило про те, що цей протокол більше належить не лише Anthropic. За цим послідувала підтримка з боку громадськості: генеральний директор OpenAI схвалив його та оголосив про підтримку через SDK для агентів та ChatGPT, а Google DeepMind протягом кількох днів підтвердила, що Gemini буде використовувати MCP для інструментів. Тепер цей протокол є стандартним шляхом від моделей до зовнішніх інструментів, даних та сервісів.
Три складові
Хост — це додаток, з яким фактично працює користувач: Claude Desktop, розширення для VS Code чи внутрішній чат-бот.
Клієнт MCP знаходиться всередині хоста. Він підтримує відкриті з’єднання з одним або кількома серверами MCP та направляє повідомлення між моделлю та цими серверами, тож коли модель вирішує викликати інструмент, клієнт передає запит.
Сервер MCP — це місце, де знаходяться можливості. Кожен сервер обгортає інструмент або джерело даних під стандартний інтерфейс та може пропонувати три типи ресурсів:
- Інструменти — це функції, які можна викликати, такі як
run_sql_query,search_webабоsend_email. Модель використовує їх для виконання дій або отримання даних. - Ресурси — це читабельні дані, такі як файли, рядки баз даних чи документи, які модель може включити до свого вікна контексту.
- Шаблони запитів — це повторно використовувані шаблони запитів, які сервер передає хосту.
Повідомлення кодуються у форматі JSON-RPC 2.0 та передаються через один із двох способів передачі даних. stdio підходить для серверів, які працюють як локальні процеси на комп’ютері клієнта. Streamable HTTP призначений для віддалених серверів та хмарних рішень, використовуючи звичайні HTTP-запити та, за потреби, Server-Sent Events (SSE) для потокових відповідей та сповіщень від сервера до клієнта. Завдяки цьому розділенню один протокол покриває як локальну розробку, так і системи у промислових масштабах.
Одне запитання, крок за кроком
Ось що відбувається між моментом, коли користувач вводить запитання, та отриманням відповіді.
- Користувач запитує: «Скільки замовлень ми отримали минулого тижня?»
- Модель бачить це запитання поруч із списком доступних інструментів, отриманих від сервера MCP під час запуску.
- Вона вирішує, що потрібно використати
query_database, та надсилає структурований запит до інструменту. - Клієнт MCP перехоплює виклик та надсилає його до відповідного сервера.
- Сервер виконує запит та повертає результат у форматі JSON.
- Модель читає цей результат та формулює відповідь простою мовою.
Модель ніколи не взаємодіє безпосередньо з базою даних, і їй не потрібен шаблон підключення заздалегідь, адже все це обробляє сервер MCP.
Проект: інтерфейс чату для PostgreSQL
Якщо залишити теорію осторонь, ось щось конкретне. Команда зберігає дані замовлень у PostgreSQL, а колеги, які не є технічними спеціалістами, постійно просять у єдиного спеціаліста з SQL підготувати звіти. Метою є створення інтерфейсу чату, де вони можуть ставити запитання простою англійською мовою та отримувати миттєві відповіді без необхідності писати SQL-код.
План полягає у використанні сервера MCP перед базою даних PostgreSQL, який пропонує єдиний інструмент query_database та підключений до Claude. Тоді будь-хто з команди може поставити запитання простою мовою та отримати справжні дані у відповідь.
Налаштування
Почніть з нової папки проекту та встановіть необхідні залежності.
mkdir nl-db-assistant
cd nl-db-assistant
npm init -y
npm install @modelcontextprotocol/sdk pg dotenv zod
Ці пакети ділять роботу між собою. @modelcontextprotocol/sdk — це офіційний набір Anthropic для JavaScript та TypeScript, призначений для серверів MCP; pg — це стандартний клієнт PostgreSQL для Node.js, а dotenv запобігає потраплянню облікових даних бази даних у вихідний код. zod перевіряє схеми під час виконання, і MCP використовує його для створення JSON-схеми, за допомогою якої модель навчається, як викликати інструменти.
Створіть файл .env у корені проекту, у якому буде зберігатися рядок підключення.
DATABASE_URL=postgresql://your_user:your_password@localhost:5432/your_database
Негайно додайте .env до .gitignore, адже облікові дані ніколи не повинні потрапляти до історії змін.
Шаблон сервера
Далі йде server.js, який починається з імпортів, назви та версії сервера, а також з пулу баз даних.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import pg from "pg";
import dotenv from "dotenv";
dotenv.config();
// Set up the PostgreSQL connection pool
const pool = new pg.Pool({
connectionString: process.env.DATABASE_URL,
});
// Create the MCP server instance
const server = new McpServer({
name: "postgres-assistant",
version: "1.0.0",
});
Ім’я та версія повідомляються клієнту під час процедури узгодження можливостей під час підключення. Пул з’єднань створюється один раз та використовується для кожного запиту, що є значно ефективнішим, ніж відкривати нове з’єднання щоразу.
Розкриття схеми
Щоб модель могла створювати корисні запити, вона повинна знати, які таблиці та стовпці існують. Актуальна схема розкривається як читабельний ресурс MCP, який можна використовувати в контексті.
server.resource(
"database-schema",
"schema://main",
async (uri) => {
const result = await pool.query(`
SELECT
table_name,
column_name,
data_type
FROM information_schema.columns
WHERE table_schema = 'public'
ORDER BY table_name, ordinal_position
`);
const schema = result.rows.reduce((acc, row) => {
if (!acc[row.table_name]) acc[row.table_name] = [];
acc[row.table_name].push(`${row.column_name} (${row.data_type})`);
return acc;
}, {});
const schemaText = Object.entries(schema)
.map(([table, cols]) => `${table}:\n ${cols.join("\n ")}`)
.join("\n\n");
return {
contents: [{
uri: uri.href,
text: schemaText,
}],
};
}
);
information_schema.columns — це вбудований перегляд PostgreSQL, який описує кожну таблицю та стовпець. Код виконує запит до нього, перетворює рядки у читабельний текст та повертає його як ресурс. Модель читає цей ресурс перед тим, як вирішити, як сформулювати запит, тож має повну схему та не змушена здогадуватися щодо коректного SQL.
Інструмент запитів
Це серце сервера — інструмент, який використовується моделлю для виконання SQL-запитів до бази даних.
server.tool(
"query_database",
"Run a read-only SQL query against the PostgreSQL database. Use this to answer questions about data, counts, trends, or summaries.",
{
sql: z.string().describe(
"A valid PostgreSQL SELECT query. Only SELECT statements are allowed."
),
},
async ({ sql }) => {
// Safety gate: only allow SELECT statements
const trimmed = sql.trim().toUpperCase();
if (!trimmed.startsWith("SELECT")) {
return {
content: [{
type: "text",
text: "Error: only SELECT queries are permitted through this interface.",
}],
isError: true,
};
}
try {
const result = await pool.query(sql);
const output = JSON.stringify(result.rows, null, 2);
return {
content: [{
type: "text",
text: `Query returned ${result.rowCount} row(s):\n\n${output}`,
}],
};
} catch (err) {
return {
content: [{
type: "text",
text: `Query failed: ${err.message}`,
}],
isError: true,
};
}
}
);
Уважно стежте за рядком опису, другим аргументом, адже модель читає його під час вирішення, чи та як використовувати інструмент. Напишіть його у вигляді інструкцій для досвідченого стажера, який ніколи не бачив бази даних. Схема Zod для параметра sql автоматично перетворюється на JSON-схему, яку бачить модель, і вона визначає форму аргумента. Захисник у верхній частині приймає лише оператори SELECT, тому жодні операції запису не проходять ні навмисно, ні випадково.
Запуск сервера
Нарешті сервер запускається через протокол stdio.
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("PostgreSQL MCP server is running");
За допомогою stdio клієнт MCP запускає скрипт як дочірній процес та взаємодіє з ним через стандартний вхід та вихід. Це найпростіший та найнадійніший спосіб передачі даних для локальної розробки. У рядку журналу навмисно використовується console.error, щоб він не забруднював канал stdout, який MCP використовує для передачі протокольних повідомлень.
Підключення Claude Desktop
Відкрийте файл конфігурації Claude Desktop. У macOS він знаходиться тут:
~/Library/Application Support/Claude/claude_desktop_config.json
У Windows шлях є таким:
%APPDATA%\Claude\claude_desktop_config.json
Додайте запис для нового сервера:
{
"mcpServers": {
"postgres-assistant": {
"command": "node",
"args": ["/absolute/path/to/nl-db-assistant/server.js"]
}
}
}
Перезапустіть Claude Desktop — у інтерфейсі з’явиться іконка додаткового інструменту, яка підтвердить, що сервери MCP підключені та готові до роботи.
Спробуємо
Підходять звичайні формулювання: скільки замовлень надійшло протягом минулого тижня, яка категорія продуктів принесла найбільший дохід цього місяця чи хто є п’ятьма найбільшими клієнтами за загальною вартістю замовлень.
Claude читає актуальний ресурс схеми, формує відповідний SQL-запит, викликає функцію query_database, отримує результати та перетворює їх на зрозумілу відповідь. Нетехнічні колеги ніколи не бачать запиту, лише запитання та відповідь.
Близько 80 рядків JavaScript створюють сервер, який відображає актуальну схему PostgreSQL для будь-якої підключеної моделі, перетворює запитання натуральної мови на SQL, забезпечує лише читальний доступ та повертає структурований результат, який модель може узагальнити. Його було написано лише один раз, і будь-яка модель, сумісна з MCP — чи то Claude зараз, чи інша завтра — може її використовувати без змін у сервері. Ось перевага спільного протоколу.
Кількість користувачів
Швидкість поширення була високою. Кількість щомісячних завантажень SDK зросла з 100 000 при запуску до 97 мільйонів до березня 2026 року, що на 970 разів більше за 18 місяців. На противагу цьому пакету npm від React знадобилося приблизно три роки, щоб досягти 100 мільйонів щомісячних завантажень.
У продуктивному використанні цей інструмент застосовується компаніями Block, Bloomberg, Amazon та сотнями підприємств зі списку Fortune 500. У квітні 2026 року Pinterest описав свою інфраструктуру MCP для продуктивної роботи: сервери, призначені конкретно для Presto, Spark та Airflow, з можливістю підтвердження чутливих операцій людиною. За даними, близько 66 000 викликів інструментів на місяць від 844 активних користувачів дозволяють заощадити приблизно 7 000 інженерних годин щомісяця.
Наразі існують офіційні або підтримувані спільнотою сервери MCP для Slack, GitHub, Google, Salesforce та Stripe, а також для HubSpot, Shopify, Notion, Linear, Sentry, Figma, Webflow, Cloudflare та Postman.
Основною темою плану розвитку на 2026 рік є готовність до використання в корпоративних проектах. Основними елементами є автентифікація через OAuth 2.1, пов’язана з корпоративними постачальниками ідентичності, координація кількох агентів, де один агент може викликатися як сервер інструментів, та реєстр перевірених серверів із рейтингами безпеки.
Часто ставлені запитання
Чи є MCP просто викликом функції з додатковими кроками? Ні, адже вони знаходяться на різних рівнях. Виклик функції — це коли модель вирішує скористатися інструментом, тоді як MCP — це протокол, який поєднує модель та інструмент. Виклик функції визначає, чи потрібно викликати інструмент, тоді як MCP керує процесом підключення до нього та взаємодії з ним. Типові сучасні рішення поєднують їх.
Чи він працює лише з Claude? Зовсім ні, і це одна з його найкращих особливостей. OpenAI, Google DeepMind та Microsoft, а також тисячі команд розробників використовують MCP. Модель із клієнтом, сумісним з MCP, може використовувати будь-який сервер MCP, незалежно від того, хто створив кожну зі сторін.
Чи готовий він до використання у промислових умовах у 2026 році? Для більшості застосувань — так, з огляду на великомасштабні реалізації, про які згадувалося вище. Однак для систем, де критично важлива швидкість реакції, таких як торгівля в реальному часі чи вимоги до часу відповіді менше 100 мс, така абстракція має свої недоліки, і прямі з’єднання через API можуть бути кращими за ті, що здійснюються через MCP.
Чи достатньо він безпечний для використання в корпоративних проектах? Він поступово наближається до цього стандарту. Оновлення специфікації у березні 2025 року додало всеосяжну систему авторизації на основі OAuth 2.1, а плани на 2026 рік передбачають інтеграцію зі стандартами SAML та OIDC з постачальниками облікових записів, такими як Okta та Azure AD. У сферах з суворим регулюванням, таких як фінанси чи охорона здоров’я, поки що потрібні додаткові механізми забезпечення відповідності стандартам.
Хто нею керує, і чи може Anthropic змінити напрямок? З грудня 2025 року цей протокол знаходиться під егідою Agentic AI Foundation у складі Linux Foundation. Це робить його нейтральною щодо постачальників, спільною інфраструктурою, керованою спільнотою, порівнянною з HTTP або TCP/IP, і жодна окрема компанія не може односторонньо змінити його напрямок.
Що відрізняє інструмент від ресурсу? Інструмент — це дія, яку модель обирає виконати, наприклад, виконати запит, надіслати повідомлення чи створити файл. Ресурс — це дані, які вона пасивно читає, такі як файл, схема чи документ. Ресурси завантажуються в контекст, але інструменти виконуються за потреби під час розмови.
Чи може один сервер обслуговувати кілька баз даних чи сервісів? Так. Сервер може надавати стільки інструментів та ресурсів, скільки це доцільно, а поширеним рішенням є сервер даних-платформи, який забезпечує право на читання до кількох баз даних, кожна з яких є окремим інструментом чи ресурсом.
Пов’язана література
- Практичні нотатки: Model Context Protocol (MCP) пояснено: посібник для початківців — Детальний огляд Практичних нотаток: Model Context Protocol (MCP) пояснено: посібник для початківців: контракти, перевірки та шаблони коду для команд, які використовують цю модель.