Протокол · Tools / Resources / Prompts · отладка и деплой · база знаний
Backend- и AI-разработчики с базой Python или TypeScript сталкиваются с одной проблемой: Claude и GPT умны, но не видят вашу БД, внутренние API и локальные файлы — нет стандартизированного канала к внешним инструментам. Model Context Protocol (MCP) от Anthropic — открытый протокол: AI-клиенты (Cursor, Claude Desktop) общаются с вашим сервером через JSON-RPC. После этой статьи вы сможете самостоятельно разработать и задеплоить production-ready MCP Server: архитектура → окружение → Hello World → Tools / Resources / Prompts → HTTP-транспорт → отладка → Docker → проект базы знаний → экосистема 2026.
Даже сильные модели не знают ваших CRM-клиентов и вчерашних логов. Путь отрасли ясен: Function Calling → Plugins → MCP. Первые два часто vendor-specific; MCP стандартизирует обнаружение и вызов инструментов — написали один раз, используете в разных клиентах.
Боль: Claude / GPT должен ходить в БД, API и файлы — у каждого свой формат.
Сценарий: читать Markdown-заметки в Cursor, смотреть GitHub Issues в Claude Desktop.
Обещание: от пустой папки до deployable сервера — с кодом и таблицей ошибок.
Anthropic выпустила MCP в ноябре 2024, чтобы стандартизировать связь ИИ с инструментами и решить проблему N×M адаптеров. Контекст — в нашей статье про MCP и HTTP.
Модель Client ↔ Server: Client на стороне ИИ (Claude Desktop, Cursor); Server отдаёт возможности через JSON-RPC:
Tools: вызываемые функции — поиск, вычисления, запросы к БД.
Resources: читаемые данные — файлы, URL, конфиг.
Prompts: параметризуемые шаблоны промптов.
Основа — JSON-RPC 2.0. Транспорт: stdio (локальный subprocess, дефолт Cursor) или HTTP + SSE / Streamable HTTP (удалённый). Жизненный цикл: handshake → initialize → запросы → shutdown.
| Измерение | MCP | OpenAI Function Calling | LangChain Tools |
|---|---|---|---|
| Стандарт | Открытый протокол | Proprietary | Привязка к фреймворку |
| Транспорт | stdio / HTTP | HTTP | HTTP |
| Cross-model | Да | Нет | Частично |
| Resources / Prompts | Нативно | Нет | Нет |
| Экосистема 2026 | 10 000+ серверов | Зрелая | Зрелая |
Python (mcp, FastMCP) для новичков; TypeScript (@modelcontextprotocol/sdk) для frontend/full-stack. В статье — Python, TS для справки.
# Python python -m venv .venv && source .venv/bin/activate pip install mcp httpx pydantic # TypeScript (справка) npm init -y && npm install @modelcontextprotocol/sdk
my-mcp-server/ ├── server.py # точка входа ├── tools/ # calculator.py, web_search.py ├── resources/ # file_reader.py ├── prompts/ # templates.py ├── tests/test_tools.py ├── pyproject.toml └── README.md
MCP Inspector: npx @modelcontextprotocol/inspector python server.py
Claude Desktop: редактировать claude_desktop_config.json.
Cursor: Settings → MCP → добавить command + args.
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-first-server")
@mcp.tool()
def say_hello(name: str) -> str:
"""Приветствует человека"""
return f"Hello, {name}! Это ваш первый MCP-инструмент."
if __name__ == "__main__":
mcp.run()После python server.py в Cursor укажите {"command":"python","args":["/abs/path/server.py"]} — say_hello должен появиться в списке инструментов.
Абсолютные пути к server.py и Python из venv.
После изменений перезапустить MCP-соединение или окно Cursor.
Явно попросить вызов инструмента в чате и проверить регистрацию.
Сигнатура = документация: типы, возврат и docstring управляют выбором инструмента. Имена: snake_case, глагол в начале (search_web). Ошибки — структурированный JSON, не голые exceptions.
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="Поисковый запрос")
max_results: int = Field(default=5, description="Макс. результатов")
language: str = Field(default="ru", description="Язык результатов")
@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
"""Веб-поиск, возвращает список результатов"""
...| Инструмент | Назначение | Замечание |
|---|---|---|
| Калькулятор | Мат. выражения | ast.literal_eval, не eval |
| Файлы | Чтение/запись локально | Whitelist, нормализация путей |
| HTTP | Внешние API | Timeout, retry, лимит размера |
| SQL-запрос | Read-only SQL | Параметры, без DDL |
| Время | Now, часовые пояса | ISO 8601 |
@mcp.tool()
async def fetch_url(url: str) -> str:
"""Загружает содержимое URL"""
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.get(url)
return response.textСеть/IO: timeout 15–30 с.
Чувствительные ops: auth (API key, разрешённые пути).
{"error": "...", "hint": "..."} для retry модели.
Resource vs Tool: Resource — поставщик данных (read-only); Tool — действие. Адресация через URI: file://, http://, custom://.
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
"""Конфигурация приложения"""
return json.dumps({"version": "1.0", "env": "production"})
@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
"""Профиль пользователя по ID"""
return json.dumps(db.query_user(user_id))Типы: текст (text/plain, JSON), бинарные (изображения, PDF), потоки (live-данные). Практика: filesystem-сервер с listing, чтением, опциональным watch.
MCP Prompts — параметризуемые фрагменты для единообразия промптов в команде.
from mcp.types import PromptMessage, TextContent
@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
"""Шаблон ревью кода"""
return [PromptMessage(
role="user",
content=TextContent(type="text", text=f"""Проверьте этот {language}-код:
1. Качество 2. Баги и безопасность 3. Производительность
```{language}
{code}
```""")
)]Multi-turn шаблоны (user + assistant) для интервью или debug-помощника. Клиент вызывает prompts/get.
| Характеристика | stdio | HTTP + SSE |
|---|---|---|
| Деплой | Локально | Удалённый сервер |
| Задержка | Очень низкая | Сеть |
| Multi-client | Нет | Да |
| Сценарий | IDE локально | SaaS / команда |
mcp = FastMCP("remote-server", transport="streamable-http")
if __name__ == "__main__":
mcp.run(host="0.0.0.0", port=8000)Production: Bearer Token, CORS, rate limiting. Не выставляйте неаутентифицированный HTTP-MCP в интернет.
Графически тестировать tools/list, tools/call, JSON-RPC-логи и сценарии ошибок.
@pytest.mark.asyncio
async def test_calculator_tool():
server_params = StdioServerParameters(command="python", args=["server.py"])
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool("calculate", {"expression": "2 + 2"})
assert result.content[0].text == "4"| Ошибка | Причина | Решение |
|---|---|---|
| Инструмент не виден | Неверный путь в config | Проверить абсолютный путь |
| Ошибка JSON | Несериализуемый тип | Преобразовать в str или dict |
| Timeout | Медленное выполнение | Async + timeout |
| Permission denied | Путь / TCC | Whitelist / VNC для диалога |
FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "server.py"]
Railway / Render: быстро для side projects.
Lambda / Cloud Run: serverless — cold start, ограничения stdio.
VPS + Nginx: reverse proxy, TLS, rate limit.
Структурированные логи, метрики Prometheus, Sentry, /health. Декларировать версию MCP, расширять tools обратно совместимо.
Цель: ИИ ищет локальные Markdown-заметки, семантический индекс, создание заметок. В Cursor: «Что я записал про MCP на прошлой неделе?»
| Компонент | Рекомендация |
|---|---|
| Векторная БД | ChromaDB / Qdrant (локально) |
| Embeddings | text-embedding-3-small |
| File watch | watchfiles для инкрементального индекса |
index_notes: сканировать каталог, векторный индекс.
semantic_search: семантический поиск.
write_note: создать или дописать Markdown.
Resource: notes://{path} для одной заметки.
semantic_search экономит токены vs вставка всей библиотеки и даёт более точные ответы.
mcp-server-filesystem — файловая система
mcp-server-github — GitHub
mcp-server-brave-search — веб-поиск
mcp-server-postgres — база данных
mcp-server-slack — Slack
В 2026 Cursor, Claude Desktop, OpenAI, Google Gemini и Microsoft поддерживают MCP; marketplace и enterprise-security (OAuth 2.1, audit) созревают. Документация: modelcontextprotocol.io; Python SDK: github.com/modelcontextprotocol/python-sdk.
Выбрать хост (Cursor / Claude Desktop), проверить MCP в версии 2026.
Разработка локально через stdio, Inspector для tools/list.
Зарегистрировать в Cursor MCP, smoke test Hello World.
Browser-, keychain-, screen-capture-серверы: GUI-сессия macOS для TCC (SSH недостаточно).
HTTP + Docker + auth в prod; связать с руководством Agent Skill и браузерным MCP.
Python (mcp + FastMCP) — быстрее всего; TypeScript (@modelcontextprotocol/sdk) для Node-команд. Протокольный слой идентичен.
IDE локально: stdio. Multi-user / SaaS: HTTP + SSE / Streamable HTTP с аутентификацией.
Tools выполняют действия; Resources предоставляют данные для чтения через URI.
Browser MCP, связка ключей и запись экрана вызывают диалоги TCC macOS. SSH не может нажать «Всегда разрешать» — нужна VNC-GUI на хосте.
MCP — стандартный протокол AI-tooling; цепочка от Hello World до production — ключевая компетенция AI-инженера в 2026. Какой инструмент вы построите следующим?
Скрытая стоимость редко в коде, а в среде выполнения: Windows + cloud Mac + Cursor MCP требуют TCC-диалоги, venv и логи Inspector в одной desktop-сессии. Свой Mac mini добавляет сон, обновления ОС и амортизацию; 8 ГБ RAM быстро не хватает при векторном индексе и параллельных серверах.
Чтобы проверять MCP почасово с GUI на той же машине, что и Cursor, арендуйте удалённый Mac через VNCMac — основная кнопка ведёт на тарифы, пакеты на главной.