Объяснение 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 месяцев. Для сравнения, пакету React в npm потребовалось примерно три года, чтобы достичь 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? Вовсе нет, и это одно из его сильнейших преимуществ. MCP был принят OpenAI, Google DeepMind и Microsoft, а также тысячами команд разработчиков. Модель с клиентом, совместимым с 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): описание контрактов, проверок и готовых фрагментов кода для команд, использующих эту модель.