Model Context Protocol (MCP) — это открытый протокол, который позволяет ИИ-моделям безопасно взаимодействовать с внешними инструментами, базами данных и API. Если вы разрабатываете приложения с интеграцией ИИ, MCP-сервер станет мостом между вашей моделью и реальными данными.
В этом руководстве вы узнаете, как настроить MCP-сервер с нуля: от выбора SDK до деплоя в продакшн. Мы разберём практические примеры на Python, настроим транспорты, обеспечим безопасность и научимся отлаживать сервер. Статья рассчитана на разработчиков и DevOps-инженеров, которые хотят внедрить MCP в свои проекты.
Введение: что такое MCP-сервер и зачем он нужен вашему проекту
MCP — это стандартизированный протокол для обмена контекстом между ИИ-моделями и внешними сервисами. Вместо того чтобы встраивать логику вызова функций напрямую в код модели, MCP предлагает единый интерфейс. Представьте, что ваша модель может запросить текущую погоду, выполнить SQL-запрос или отправить email — и всё это через один протокол. Основные преимущества MCP: безопасность (модель не имеет прямого доступа к системе), расширяемость (легко добавить новый инструмент) и стандартизация (единый формат для всех интеграций).
MCP не заменяет модель ИИ, а дополняет её, предоставляя безопасный контекст для выполнения действий. Например, в чат-ботах MCP используется для доступа к базе данных клиентов, а в AI-агентах — для выполнения скриптов. Альтернативы MCP — прямые вызовы функций (function calling) через API модели, но они требуют жёсткой привязки к конкретной модели и усложняют масштабирование. MCP решает эти проблемы, предлагая универсальный слой абстракции.
Ключевые компоненты MCP-архитектуры
Архитектура MCP состоит из трёх компонентов: хост, клиент и сервер. Хост — это приложение, которое инициирует соединение (например, Claude Desktop или ваш веб-сервер). Клиент поддерживает постоянное соединение с сервером и управляет запросами. Сервер предоставляет контекст в виде инструментов, ресурсов и промптов. Каждый клиент устанавливает соединение 1:1 с сервером, что обеспечивает изоляцию.
| Компонент | Роль | Пример |
|---|---|---|
| Хост | Инициатор соединения, управляет клиентами | Claude Desktop, веб-приложение |
| Клиент | Поддерживает постоянное соединение, отправляет запросы | MCP Client SDK |
| Сервер | Предоставляет инструменты, ресурсы, промпты | MCP-сервер на Python |
- Хост: приложение-инициатор (например, Claude Desktop) — запускает клиента и управляет сессиями.
- Клиент: поддерживает постоянное соединение с сервером — отвечает за передачу запросов и получение ответов.
- Сервер: предоставляет контекст (инструменты, ресурсы, промпты) — реализует логику взаимодействия с внешними системами.
Когда стоит использовать MCP-сервер
MCP-сервер оправдан в сценариях, где требуется динамический доступ к данным или выполнение действий. Вот несколько примеров:
- Работа с базами данных в реальном времени — модель может выполнять SQL-запросы к вашей БД.
- Интеграция с корпоративными API — доступ к CRM, ERP или другим системам.
- Выполнение пользовательских скриптов — запуск кода на сервере по запросу модели.
- Доступ к файловой системе — чтение и запись файлов в безопасной среде.
Важно: Для простых статических данных (например, список городов) MCP избыточен. Используйте его только там, где нужна динамика и безопасность.
Подготовка к настройке: выбор SDK и окружения
Перед началом работы выберите SDK, который соответствует вашему стеку. MCP поддерживает несколько языков: Python, TypeScript, Java и Kotlin. Для быстрого старта рекомендую Python SDK — у него обширная документация и простота настройки. TypeScript SDK подойдёт, если ваш проект на Node.js, а Java/Kotlin — для корпоративных решений.
Совет: Убедитесь, что версия SDK соответствует спецификации MCP (последняя стабильная). Проверьте репозиторий на GitHub.
Сравнение SDK для MCP

| SDK | Язык | Поддержка транспортов | Документация | Примеры |
|---|---|---|---|---|
| Python SDK | Python | stdio, SSE | Подробная, есть туториалы | Много, включая базы данных |
| TypeScript SDK | TypeScript/JavaScript | stdio, SSE | Хорошая, с типами | Примеры для Node.js |
| Java SDK | Java | stdio, SSE | Средняя | Ограничены |
| Kotlin SDK | Kotlin | stdio, SSE | Базовая | Для Android/JVM |
- Python SDK: простой старт, обширная документация — идеально для прототипов.
- TypeScript SDK: типобезопасность, интеграция с Node.js — для веб-приложений.
- Java SDK: для корпоративных решений — если у вас стек Java.
- Kotlin SDK: для Android/JVM — мобильные и серверные проекты.
Установка и настройка окружения
Создайте директорию проекта и настройте виртуальное окружение. Для Python используйте venv:
mkdir mcp-server-example
cd mcp-server-example
python -m venv venv
source venv/bin/activate # Linux/Mac
venvScriptsactivate # Windows
Установите MCP SDK через pip:
pip install mcp
Настройте переменные окружения в файле .env:
API_KEY=your_api_key_here
DATABASE_URL=postgresql://user:pass@localhost/db
- Создание виртуального окружения (venv, virtualenv) — изолирует зависимости проекта.
- Установка MCP SDK через pip install mcp — основная библиотека.
- Настройка переменных окружения (API_KEY, DATABASE_URL) — для безопасного хранения секретов.
Пошаговое руководство по созданию MCP-сервера
Теперь перейдём к практике. Создадим простой MCP-сервер на Python, который предоставляет инструмент для получения погоды. Этот пример поможет понять базовую структуру.
Важно: Инструменты — это асинхронные функции, которые модель может вызывать. Не забудьте добавить обработку ошибок.
Создание базового сервера с инструментами
Создайте файл server.py и добавьте следующий код:
from mcp.server.fastmcp import FastMCP
# Создаём экземпляр сервера
mcp = FastMCP("Weather Server")
# Определяем инструмент
@mcp.tool()
async def get_weather(city: str) -> str:
"""Получить текущую погоду для города."""
# Здесь может быть вызов реального API погоды
return f"Погода в {city}: солнечно, +22°C"
# Запускаем сервер
if __name__ == "__main__":
mcp.run(transport="stdio")
Объяснение шагов:
- Импорт FastMCP и создание экземпляра — FastMCP упрощает создание сервера.
- Определение инструмента с описанием и параметрами — декоратор @mcp.tool() регистрирует функцию как инструмент.
- Запуск сервера с выбором транспорта — transport=’stdio’ для локального использования.
«Код с комментариями: определение функции ‘get_weather’, регистрация через декоратор @mcp.tool(). Запуск через mcp.run(transport=’stdio’).»
Добавление ресурсов и промптов
Ресурсы — это данные, которые модель может читать (например, файлы конфигурации). Промпты — предопределённые шаблоны запросов. Добавим ресурс и промпт в наш сервер:
@mcp.resource("config://app")
async def get_config() -> str:
"""Возвращает конфигурацию приложения."""
return "{"version": "1.0"}"
@mcp.prompt()
async def generate_report(topic: str) -> str:
"""Сгенерировать отчёт по теме."""
return f"Пожалуйста, напишите отчёт на тему: {topic}"
- Ресурсы: статические (файлы) и динамические (шаблоны) — ресурс ‘config://app’ возвращает JSON.
- Промпты: предопределённые шаблоны запросов — промпт ‘generate_report’ задаёт тему.
- Пример: ресурс ‘config://app’ и промпт ‘generate_report’ — модель может их использовать.
Настройка транспорта: stdio vs SSE

Транспорт определяет, как клиент и сервер обмениваются данными. stdio — для локального использования, SSE — для удалённого доступа через HTTP. Выбор зависит от сценария.
Частая ошибка: Использование stdio для удалённого доступа. stdio работает только в рамках одного процесса, поэтому для веб-приложений нужен SSE.
Сравнение stdio и SSE
| Характеристика | stdio | SSE |
|---|---|---|
| Скорость | Низкая задержка | Средняя задержка |
| Безопасность | Высокая (локальный доступ) | Требует аутентификации |
| Масштабирование | Ограничено (один процесс) | Поддерживает балансировку |
| Когда использовать | Локальные AI-агенты | Веб-приложения, API |
- stdio: низкая задержка, простота, только локально — идеально для разработки.
- SSE: удалённый доступ, поддержка HTTP, сложнее в настройке — для продакшена.
Настройка SSE-сервера с FastAPI
Для удалённого доступа используйте SSE. Установите FastAPI и uvicorn:
pip install fastapi uvicorn
Создайте файл sse_server.py:
from fastapi import FastAPI
from mcp.server.fastmcp import FastMCP
from mcp.server.sse import SseServerTransport
from starlette.routing import Mount
app = FastAPI()
mcp = FastMCP("Weather Server")
@mcp.tool()
async def get_weather(city: str) -> str:
return f"Погода в {city}: солнечно, +22°C"
# Настройка SSE транспорта
sse = SseServerTransport("/mcp")
@app.get("/sse")
async def handle_sse():
async with sse.connect_sse() as (read, write):
await mcp.run(read, write, init_options)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
Теперь сервер доступен по адресу http://localhost:8000/sse. Клиент может подключиться через SSE.
- Установка зависимостей: fastapi, uvicorn, mcp — необходимые пакеты.
- Создание FastAPI-приложения и подключение SSE — интеграция с веб-сервером.
- Запуск и тестирование через curl или браузер — проверьте подключение.
Безопасность и аутентификация MCP-сервера
Безопасность критична, особенно при удалённом доступе. Используйте API-ключи, OAuth2 или JWT для аутентификации. Для SSE-транспорта добавьте middleware.
Важно: Никогда не передавайте секретные ключи через stdio-транспорт — используйте переменные окружения.
Реализация аутентификации через API-ключи
Добавим middleware на FastAPI для проверки заголовка Authorization:
from fastapi import FastAPI, Header, HTTPException
app = FastAPI()
API_KEYS = {"key1": "user1", "key2": "user2"}
@app.middleware("http")
async def check_api_key(request, call_next):
api_key = request.headers.get("Authorization")
if api_key not in API_KEYS:
raise HTTPException(status_code=403, detail="Invalid API key")
response = await call_next(request)
return response
Храните ключи в .env или secrets manager. Регулярно ротируйте их.
- Создание middleware для проверки ключа — перехватывает запросы.
- Хранение ключей в .env или secrets manager — безопасное хранение.
- Тестирование аутентификации — отправьте запрос с ключом.
«Пример middleware на FastAPI для проверки заголовка Authorization. Генерация и хранение ключей.»
Rate limiting и защита от DDoS

Используйте slowapi для ограничения запросов:
pip install slowapi
from slowapi import Limiter
from slowapi.util import get_remote_address
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
@app.get("/sse")
@limiter.limit("5/minute")
async def handle_sse():
...
Логируйте подозрительную активность и настройте алерты.
- Установка и настройка slowapi — библиотека для rate limiting.
- Определение лимитов для разных эндпоинтов — например, 5 запросов в минуту.
- Мониторинг и алерты — используйте Prometheus.
Отладка, логирование и мониторинг MCP-сервера
Отладка MCP-сервера требует специальных инструментов. MCP Inspector — официальный инструмент для тестирования. Логирование помогает отслеживать ошибки, а мониторинг — производительность.
Совет: MCP Inspector — официальный инструмент для тестирования сервера. Запускайте его с флагом —debug для подробных логов.
Использование MCP Inspector для отладки
Установите Inspector через npx:
npx @modelcontextprotocol/inspector
Подключитесь к серверу:
npx @modelcontextprotocol/inspector --transport stdio --command "python server.py"
Inspector покажет список инструментов и позволит вызвать их. Используйте флаг —debug для подробных логов.
- Установка: npx @modelcontextprotocol/inspector — глобальная установка.
- Подключение к серверу через stdio или SSE — укажите команду.
- Просмотр списка инструментов и их вызов — тестируйте в реальном времени.
Настройка логирования и мониторинга
Используйте structlog для структурированных логов в JSON:
pip install structlog
import structlog
structlog.configure(
processors=[
structlog.processors.JSONRenderer()
]
)
logger = structlog.get_logger()
@mcp.tool()
async def get_weather(city: str) -> str:
logger.info("get_weather called", city=city)
return f"Погода в {city}: солнечно, +22°C"
Для мониторинга экспортируйте метрики через prometheus_client:
pip install prometheus_client
from prometheus_client import Counter, start_http_server
request_count = Counter('mcp_requests_total', 'Total requests')
@mcp.tool()
async def get_weather(city: str) -> str:
request_count.inc()
return f"Погода в {city}: солнечно, +22°C"
- Конфигурация structlog с JSON-выводом — удобно для анализа.
- Экспорт метрик через prometheus_client — собирайте данные.
- Создание дашборда в Grafana — визуализируйте метрики.
Масштабирование и деплой MCP-сервера
Для продакшена MCP-сервер нужно масштабировать. Docker и Kubernetes — стандартные решения. Также можно использовать serverless (AWS Lambda).
Важно: При масштабировании учитывайте, что каждый клиент требует отдельного соединения. Используйте пул соединений.
Деплой MCP-сервера в Docker

Создайте Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "server.py"]
docker-compose.yml для связки с базой данных:
version: '3'
services:
mcp-server:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mcp
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mcp
Соберите и запустите:
docker-compose up --build
- Создание Dockerfile на основе python:3.11-slim — лёгкий образ.
- Копирование зависимостей и кода — оптимизация слоёв.
- Запуск через docker-compose с пробросом портов — удобно для разработки.
Масштабирование с Kubernetes
Создайте Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-server
spec:
replicas: 3
selector:
matchLabels:
app: mcp-server
template:
metadata:
labels:
app: mcp-server
spec:
containers:
- name: mcp-server
image: your-registry/mcp-server:latest
ports:
- containerPort: 8000
Service типа LoadBalancer:
apiVersion: v1
kind: Service
metadata:
name: mcp-server-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8000
selector:
app: mcp-server
HorizontalPodAutoscaler для автоматического масштабирования:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: mcp-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: mcp-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- Создание Deployment с репликами — 3 экземпляра.
- Настройка Service типа LoadBalancer — доступ извне.
- Применение HPA на основе CPU — автоматическое масштабирование.
Лучшие практики и типичные ошибки при настройке MCP-сервера
Чтобы сервер работал стабильно, следуйте лучшим практикам. Вот несколько советов и частых ошибок.
Совет: Всегда указывайте описания для инструментов и параметров — модель использует их для понимания, когда вызывать функцию.
Рекомендации по именованию и структуре
- Именование: ‘get_weather’ вместо ‘weather’ — используйте глаголы.
- Структура: разделение на модули (tools, resources, prompts) — организуйте код.
- Документация: описание, параметры, возвращаемое значение — пишите docstring.
Пример хорошего инструмента:
@mcp.tool()
async def create_user(name: str, email: str) -> dict:
"""Создать нового пользователя.
Args:
name: Имя пользователя.
email: Email пользователя.
Returns:
dict: Данные созданного пользователя.
"""
# Логика создания
Типичные ошибки и их решение
| Ошибка | Причина | Решение |
|---|---|---|
| Tool not found | Неправильное имя инструмента | Проверьте регистр и описание |
| Connection refused | Неверный порт или адрес | Убедитесь, что сервер запущен |
| Timeout | Долгий запрос | Добавьте таймауты или асинхронность |
- Ошибка: инструмент не вызывается — проверьте, что модель видит инструмент через Inspector.
- Ошибка: сервер не отвечает — проверьте логи и транспорт.
- Ошибка: неверные данные — валидируйте входные параметры.
Заключение: дальнейшие шаги и ресурсы

Мы рассмотрели полный цикл настройки MCP-сервера: от выбора SDK до деплоя в Kubernetes. Теперь вы можете интегрировать ИИ-модели с внешними данными безопасно и эффективно. Для углублённого изучения рекомендую изучить официальную спецификацию MCP и примеры из репозитория. Также обратите внимание на автоматизацию тестирования с помощью плагинов и CI/CD-интеграций, чтобы встроить MCP в ваш пайплайн.
Важно: Подпишитесь на репозиторий MCP на GitHub, чтобы быть в курсе обновлений протокола.
Полезные ссылки и сообщества
- Официальная спецификация MCP — modelcontextprotocol.io.
- Примеры серверов в репозитории — github.com/modelcontextprotocol.
- Сообщество в Discord — ссылка на официальном сайте.
Часто задаваемые вопросы
Что такое MCP-сервер?
MCP-сервер — это приложение, которое реализует протокол Model Context Protocol. Он предоставляет ИИ-моделям доступ к внешним инструментам, ресурсам и промптам через стандартизированный интерфейс.
Какой транспорт выбрать: stdio или SSE?
stdio подходит для локальных приложений (например, AI-агенты на вашем ПК). SSE нужен для удалённого доступа через HTTP, например, если сервер работает в облаке.
Как обеспечить безопасность MCP-сервера?

Используйте API-ключи, OAuth2 или JWT для аутентификации. Для SSE добавьте middleware. Никогда не храните секреты в коде — используйте переменные окружения.
Можно ли масштабировать MCP-сервер?
Да, через Docker и Kubernetes. Учитывайте, что каждый клиент требует отдельного соединения, поэтому используйте пул соединений и балансировку нагрузки.
Где найти примеры MCP-серверов?
В официальном репозитории MCP на GitHub есть примеры на Python, TypeScript и Java. Также можно посмотреть примеры интеграций в нашем блоге.