Публикация была переведена автоматически. Исходный язык: Русский
Конечно все уже знают и используют ChatGPT и Claude, но есть слой ниже, который определяет, насколько эти инструменты полезны в реальной работе — и он называется MCP. Напишу кратко для что это, почему это круто и как написать свой первый MCP-сервер за вечер.
Проблема, которую решает MCP
Представьте: у вас есть Claude или GPT и вы хотите, чтобы ИИ мог читать файлы на вашем сервере, делать запросы к вашей базе данных, проверять статус задач в Jira. Такой помощник не помешает не правда ли? Как это сделать?
До 2024 года ответ был один — надо было написать кастомную интеграцию под каждую пару «модель + инструмент». Поменяли модель — переписывайте. Добавили новый сервис — снова пишите адаптер. Это так называемая N×M проблема: N моделей умножить на M инструментов — и для каждой комбинации свой код.
До MCP
- Отдельный код для Claude + БД
- Отдельный код для GPT + БД
- Отдельный код для Claude + Jira
- Поменяли модель — переписали всё
После MCP
- Один MCP-сервер для БД
- Один MCP-сервер для Jira
- Любая модель подключается к любому серверу
- N + M вместо N × M
Что такое MCP
MCP (Model Context Protocol) — открытый стандарт, который Anthropic выпустила в ноябре 2024 года. Он определяет единый протокол общения между ИИ-приложением и внешними инструментами. Лучшая аналогия — USB-C для ИИ: один разъём, который подходит почти ко всем девайсам.
На текущий момент MCP поддерживают Claude, ChatGPT, Cursor, VS Code Copilot и десятки других инструментов. Количество скачиваний SDK почти 100 миллионов в месяц. Salesforce, ServiceNow, Workday — все уже выпустили свои MCP-серверы.
Архитектура за 2 минуты
В MCP есть три роли:
Схема взаимодействия:
Host: Claude Desktop / Cursor / ваше приложение→ управляет
Client: MCP Client (внутри host) ↔ JSON-RPC
Server: Ваш MCP-сервер → вызывает PostgreSQL / API / файлы
Host — это приложение, в котором живёт ИИ (Claude Desktop, Cursor и т.д.). Он запускает Client, который общается с вашим MCP-сервером по протоколу JSON-RPC 2.0. Сервер, в свою очередь, обращается к реальным данным: базе, API, файловой системе.
Три примитива MCP
MCP-сервер может предоставлять три типа сущностей:
Tools — Действия, которые может вызвать модель. Запись в БД, отправка запроса, выполнение команды.
Resources — Данные только для чтения: файлы, записи из БД, результаты API. Контекст для модели.
Prompts — Переиспользуемые шаблоны промптов. Помогают стандартизировать сложные запросы.
На практике 90% времени вы будете работать с Tools — именно они дают модели возможность что-то делать, а не просто читать.
Пишем первый MCP-сервер на Python
Используем FastMCP — высокоуровневый фреймворк поверх официального SDK. Он скрывает всю JSON-RPC механику и позволяет описывать инструменты через декораторы — как Flask-роуты.
Установка
# Устанавливаем официальный SDK (включает FastMCP)
pip install mcp
# Или через uv (рекомендуется)
uv add mcpПростой сервер: инструменты для работы с PostgreSQL
Создадим MCP-сервер, который даёт Claude доступ к базе данных — читать таблицы и выполнять запросы:
# server.py
from mcp.server.fastmcp import FastMCP
import psycopg2
import os
# Инициализируем сервер с именем
mcp = FastMCP("database-assistant")
def get_conn():
return psycopg2.connect(os.environ["DATABASE_URL"])
# Декоратор @mcp.tool() — вот и весь MCP
@mcp.tool()
def list_tables() -> list[str]:
"""Показать список всех таблиц в базе данных."""
conn = get_conn()
with conn.cursor() as cur:
cur.execute("""
SELECT tablename FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename
""")
return [row[0] for row in cur.fetchall()]
@mcp.tool()
def query_table(table: str, limit: int = 10) -> list[dict]:
"""Получить первые N строк из таблицы.
Args:
table: Название таблицы
limit: Количество строк (макс. 100)
"""
limit = min(limit, 100) # защита от огромных выборок
conn = get_conn()
with conn.cursor() as cur:
cur.execute(
f"SELECT * FROM {table} LIMIT %s",
(limit,)
)
cols = [desc[0] for desc in cur.description]
return [dict(zip(cols, row)) for row in cur.fetchall()]
# Запускаем через stdio (для Claude Desktop)
if __name__ == "__main__":
mcp.run(transport="stdio")Почему docstring важен: FastMCP автоматически отправляет текст docstring в модель как описание инструмента. Чем точнее описание — тем лучше модель понимает, когда и как использовать этот tool. Это буквально промпт-инжиниринг внутри кода.
Подключаем к Claude Desktop
Добавляем сервер в конфиг Claude Desktop (файл claude_desktop_config.json):
{
"mcpServers": {
"database-assistant": {
"command": "python",
"args": ["/path/to/server.py"],
"env": {
"DATABASE_URL": "postgresql://user:pass@localhost/mydb"
}
}
}
}После перезапуска Claude Desktop — в интерфейсе появится иконка молотка 🔨. Это значит, что инструменты подключены. Теперь можно написать:
Покажи все таблицы в базе данных и выведи первые 5 строк из таблицы users
→ Claude сам вызовет list_tables(), потом query_table("users", 5)
→ и вернёт результат в виде читаемого текстаРеальные примеры использования
Вот что уже существует в реестре MCP-серверов и что можно подключить за минуты:
GitHub MCP — читать issues, PR, коммиты. Claude сам пишет код под реальные задачи из репозитория.
PostgreSQL MCP — официальный сервер. Даём Claude доступ к БД и спрашиваем на русском языке.
Filesystem MCP — безопасный доступ к файлам. Можно попросить проанализировать логи или структуру проекта.
Ваш внутренний API — любой REST-эндпоинт превращается в MCP-tool за 20 строк кода.
Транспорты: stdio vs HTTP
MCP поддерживает два способа соединения:
- stdio — сервер запускается как дочерний процесс. Идеально для локальных инструментов и Claude Desktop. Просто, никаких портов.
- Streamable HTTP — сервер живёт отдельно, доступен по URL. Для команд и продакшн-деплоя. В 2026 году это предпочтительный транспорт для удалённых серверов.
# HTTP-транспорт для деплоя на сервер
if __name__ == "__main__":
mcp.run(
transport="streamable-http",
host="0.0.0.0",
port=8000
)
# Конфиг для Claude Desktop с удалённым сервером:
# "url": "http://localhost:8000/mcp"Про безопасность: MCP-сервер с доступом к БД — это фактически API без аутентификации по умолчанию. Для продакшна обязательно добавьте токен-авторизацию и ограничьте разрешённые операции. Никакого DROP TABLE в списке доступных инструментов.
MCP vs function calling — в чём разница
Часто путают MCP с function calling (tool use) в API. Это разные уровни:
- Function calling — это API-механизм внутри конкретной модели. Вы описываете функции в JSON-схеме при каждом запросе.
- MCP — протокол на уровень выше. Сервер один раз объявляет свои инструменты, и любой MCP-совместимый хост их видит. Под капотом MCP всё равно использует function calling — но вы об этом не думаете.
Короче: function calling — это двигатель, MCP — это стандарт на разъём. Можно использовать двигатель без стандарта, но тогда каждый раз придётся паять провода вручную.
Итог
MCP — новый стандарт, который принят всеми крупными AI-игроками. Если вы пишете что-то, что интегрируется с ИИ — скоро клиенты будут спрашивать «а у вас есть MCP-сервер?» так же, как сейчас спрашивают про REST API.
Конечно все уже знают и используют ChatGPT и Claude, но есть слой ниже, который определяет, насколько эти инструменты полезны в реальной работе — и он называется MCP. Напишу кратко для что это, почему это круто и как написать свой первый MCP-сервер за вечер.
Проблема, которую решает MCP
Представьте: у вас есть Claude или GPT и вы хотите, чтобы ИИ мог читать файлы на вашем сервере, делать запросы к вашей базе данных, проверять статус задач в Jira. Такой помощник не помешает не правда ли? Как это сделать?
До 2024 года ответ был один — надо было написать кастомную интеграцию под каждую пару «модель + инструмент». Поменяли модель — переписывайте. Добавили новый сервис — снова пишите адаптер. Это так называемая N×M проблема: N моделей умножить на M инструментов — и для каждой комбинации свой код.
До MCP
- Отдельный код для Claude + БД
- Отдельный код для GPT + БД
- Отдельный код для Claude + Jira
- Поменяли модель — переписали всё
После MCP
- Один MCP-сервер для БД
- Один MCP-сервер для Jira
- Любая модель подключается к любому серверу
- N + M вместо N × M
Что такое MCP
MCP (Model Context Protocol) — открытый стандарт, который Anthropic выпустила в ноябре 2024 года. Он определяет единый протокол общения между ИИ-приложением и внешними инструментами. Лучшая аналогия — USB-C для ИИ: один разъём, который подходит почти ко всем девайсам.
На текущий момент MCP поддерживают Claude, ChatGPT, Cursor, VS Code Copilot и десятки других инструментов. Количество скачиваний SDK почти 100 миллионов в месяц. Salesforce, ServiceNow, Workday — все уже выпустили свои MCP-серверы.
Архитектура за 2 минуты
В MCP есть три роли:
Схема взаимодействия:
Host: Claude Desktop / Cursor / ваше приложение→ управляет
Client: MCP Client (внутри host) ↔ JSON-RPC
Server: Ваш MCP-сервер → вызывает PostgreSQL / API / файлы
Host — это приложение, в котором живёт ИИ (Claude Desktop, Cursor и т.д.). Он запускает Client, который общается с вашим MCP-сервером по протоколу JSON-RPC 2.0. Сервер, в свою очередь, обращается к реальным данным: базе, API, файловой системе.
Три примитива MCP
MCP-сервер может предоставлять три типа сущностей:
Tools — Действия, которые может вызвать модель. Запись в БД, отправка запроса, выполнение команды.
Resources — Данные только для чтения: файлы, записи из БД, результаты API. Контекст для модели.
Prompts — Переиспользуемые шаблоны промптов. Помогают стандартизировать сложные запросы.
На практике 90% времени вы будете работать с Tools — именно они дают модели возможность что-то делать, а не просто читать.
Пишем первый MCP-сервер на Python
Используем FastMCP — высокоуровневый фреймворк поверх официального SDK. Он скрывает всю JSON-RPC механику и позволяет описывать инструменты через декораторы — как Flask-роуты.
Установка
# Устанавливаем официальный SDK (включает FastMCP)
pip install mcp
# Или через uv (рекомендуется)
uv add mcpПростой сервер: инструменты для работы с PostgreSQL
Создадим MCP-сервер, который даёт Claude доступ к базе данных — читать таблицы и выполнять запросы:
# server.py
from mcp.server.fastmcp import FastMCP
import psycopg2
import os
# Инициализируем сервер с именем
mcp = FastMCP("database-assistant")
def get_conn():
return psycopg2.connect(os.environ["DATABASE_URL"])
# Декоратор @mcp.tool() — вот и весь MCP
@mcp.tool()
def list_tables() -> list[str]:
"""Показать список всех таблиц в базе данных."""
conn = get_conn()
with conn.cursor() as cur:
cur.execute("""
SELECT tablename FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename
""")
return [row[0] for row in cur.fetchall()]
@mcp.tool()
def query_table(table: str, limit: int = 10) -> list[dict]:
"""Получить первые N строк из таблицы.
Args:
table: Название таблицы
limit: Количество строк (макс. 100)
"""
limit = min(limit, 100) # защита от огромных выборок
conn = get_conn()
with conn.cursor() as cur:
cur.execute(
f"SELECT * FROM {table} LIMIT %s",
(limit,)
)
cols = [desc[0] for desc in cur.description]
return [dict(zip(cols, row)) for row in cur.fetchall()]
# Запускаем через stdio (для Claude Desktop)
if __name__ == "__main__":
mcp.run(transport="stdio")Почему docstring важен: FastMCP автоматически отправляет текст docstring в модель как описание инструмента. Чем точнее описание — тем лучше модель понимает, когда и как использовать этот tool. Это буквально промпт-инжиниринг внутри кода.
Подключаем к Claude Desktop
Добавляем сервер в конфиг Claude Desktop (файл claude_desktop_config.json):
{
"mcpServers": {
"database-assistant": {
"command": "python",
"args": ["/path/to/server.py"],
"env": {
"DATABASE_URL": "postgresql://user:pass@localhost/mydb"
}
}
}
}После перезапуска Claude Desktop — в интерфейсе появится иконка молотка 🔨. Это значит, что инструменты подключены. Теперь можно написать:
Покажи все таблицы в базе данных и выведи первые 5 строк из таблицы users
→ Claude сам вызовет list_tables(), потом query_table("users", 5)
→ и вернёт результат в виде читаемого текстаРеальные примеры использования
Вот что уже существует в реестре MCP-серверов и что можно подключить за минуты:
GitHub MCP — читать issues, PR, коммиты. Claude сам пишет код под реальные задачи из репозитория.
PostgreSQL MCP — официальный сервер. Даём Claude доступ к БД и спрашиваем на русском языке.
Filesystem MCP — безопасный доступ к файлам. Можно попросить проанализировать логи или структуру проекта.
Ваш внутренний API — любой REST-эндпоинт превращается в MCP-tool за 20 строк кода.
Транспорты: stdio vs HTTP
MCP поддерживает два способа соединения:
- stdio — сервер запускается как дочерний процесс. Идеально для локальных инструментов и Claude Desktop. Просто, никаких портов.
- Streamable HTTP — сервер живёт отдельно, доступен по URL. Для команд и продакшн-деплоя. В 2026 году это предпочтительный транспорт для удалённых серверов.
# HTTP-транспорт для деплоя на сервер
if __name__ == "__main__":
mcp.run(
transport="streamable-http",
host="0.0.0.0",
port=8000
)
# Конфиг для Claude Desktop с удалённым сервером:
# "url": "http://localhost:8000/mcp"Про безопасность: MCP-сервер с доступом к БД — это фактически API без аутентификации по умолчанию. Для продакшна обязательно добавьте токен-авторизацию и ограничьте разрешённые операции. Никакого DROP TABLE в списке доступных инструментов.
MCP vs function calling — в чём разница
Часто путают MCP с function calling (tool use) в API. Это разные уровни:
- Function calling — это API-механизм внутри конкретной модели. Вы описываете функции в JSON-схеме при каждом запросе.
- MCP — протокол на уровень выше. Сервер один раз объявляет свои инструменты, и любой MCP-совместимый хост их видит. Под капотом MCP всё равно использует function calling — но вы об этом не думаете.
Короче: function calling — это двигатель, MCP — это стандарт на разъём. Можно использовать двигатель без стандарта, но тогда каждый раз придётся паять провода вручную.
Итог
MCP — новый стандарт, который принят всеми крупными AI-игроками. Если вы пишете что-то, что интегрируется с ИИ — скоро клиенты будут спрашивать «а у вас есть MCP-сервер?» так же, как сейчас спрашивают про REST API.