Архитектура MCP / stdio vs SSE / Настройка окружения / Регистрация инструментов и права / Демон launchd / SSH-туннель / SSE мульти-клиент / Стабильность продакшена / FAQ
Если вы используете Cursor, Claude Desktop или OpenClaw, рано или поздно возникнет один и тот же вопрос: на каком компьютере должен работать MCP Server? На ежедневной рабочей машине права Shell и файловая система напрямую открыты для Agent. Удалённый Linux не совместим с экосистемой macOS. Облачный Mac mini находится ровно посередине — Unix-среда, изоляция через снимки и нативные инструменты macOS. Руководство ведёт от основ stdio-subprocess через SSE-мультиклиент и launchd-демон к конфигурации, способной работать 24/7 в продакшене.
Архитектура MCP: Host, Client и Server
Перед началом работы уясним роли трёх участников.
- Host — приложение с интерфейсом пользователя (Cursor, Claude Desktop, OpenClaw). Управляет жизненным циклом одного или нескольких Client-ов.
- Client — слой протокольного адаптера внутри Host. Обнаруживает Server-ы, поддерживает соединения и пересылает вызовы инструментов.
- Server — независимый процесс, предоставляющий инструменты (Tools), ресурсы (Resources) и промпты (Prompts) через стандартизированный протокол.
Host (Cursor)
└─ Client
└─ [stdio / SSE] ──── Server (MCP-инструментальный процесс)
Принцип проектирования: процесс Server должен работать с минимальными привилегиями — регистрировать только инструменты, нужные для текущей задачи. Избегайте анти-паттерна «всемогущего Agent».
Выбор транспорта: stdio vs SSE vs WebSocket
| Транспорт | Типичный сценарий | Подходит для Cloud Mac |
|---|---|---|
| stdio | Локальный subprocess, удалённая SSH-команда | ✅ Рекомендуется: нет публичных портов, самая простая конфигурация |
| SSE | Браузерные клиенты, общий Multi-Host | Нужны reverse proxy + TLS + auth |
| WebSocket | Слой Gateway с долгим соединением | Используется OpenClaw и аналогичными Gateway |
Старый подход написания отдельного REST-связующего слоя для каждой интеграции заменён единым протоколом обнаружения инструментов MCP — Host автоматически получает tools/list от Server при запуске, без кастомного HTTP-клиента на интеграцию. Этот сдвиг превращает интеграцию инструментов из «писать каждый раз с нуля» в «объявить и использовать», позволяя одиночному разработчику подключить дюжину MCP-инструментов за один вечер.
Глоссарий транспортного уровня
- stdio-транспорт
- Host запускает Server как subprocess и обменивается JSON-RPC-сообщениями через stdin/stdout. Процесс завершается вместе с Host — естественная изоляция, никакого сетевого воздействия.
- SSE (Server-Sent Events)
- Server слушает HTTP-порт; клиенты получают события через персистентное соединение. Поддерживает несколько одновременных клиентов, но требует настройки сетевой безопасности.
- Обнаружение инструментов (tools/list)
- Фаза рукопожатия MCP: при запуске Host запрашивает у Server tools/list, получает имена инструментов, схемы параметров и описания, после чего вызывает нужные инструменты.
- HITL (Human In The Loop)
- Паттерн, при котором вызовы инструментов приостанавливаются перед чувствительными операциями для ожидания подтверждения человека, вместо автономного решения модели.
Шаг 1: Подготовка облачной среды Mac
Выбор узла
Задержка и регион
Узлы в Японии и Сингапуре достигают GitHub и npm с задержкой 20–60 мс, что идеально для MCP-инструментов, часто скачивающих зависимости.
Память и инференс
Для одновременного запуска MCP Server и локальной небольшой модели (Ollama 7B-класс) начните как минимум с M4 + 16 ГБ.
Справочная таблица конфигураций
| Сценарий | Минимум | Рекомендуется |
|---|---|---|
| Одиночный MCP Server (только вызовы инструментов) | M4 + 8 ГБ | M4 + 8 ГБ |
| MCP + локальная модель 7B | M4 + 16 ГБ | M4 + 24 ГБ |
| Multi-MCP + параллельные CI-сборки | M4 + 24 ГБ | M4 Pro + 24 ГБ |
Инициализация окружения
# Установить Homebrew (если отсутствует)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Установить Node.js
brew install node@20
echo 'export PATH="/opt/homebrew/opt/node@20/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
# Проверить
node -v && npm -v
Шаг 2: Деплой filesystem MCP Server (режим stdio)
# Запуск filesystem Server, ограниченного /Users/agent/workspace
npx -y @modelcontextprotocol/server-filesystem /Users/agent/workspace
Добавить в MCP-конфигурацию Cursor (~/.cursor/mcp.json):
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/agent/workspace"]
}
}
}
Ключевой момент: Ctrl + C останавливает локальный stdio Server. На удалённом узле используйте launchd для управления жизненным циклом процесса (шаг 4).
Шаг 3: SSH-туннель для удалённого Cursor
# Маппинг удалённого порта 3000 на локальный (режим SSE)
ssh -L 3000:127.0.0.1:3000 user@cloud-mac.zekvps.com
# SSH на удалённую машину и запуск Server (режим stdio)
ssh user@cloud-mac.zekvps.com "npx -y @modelcontextprotocol/server-filesystem /workspace"
Для долгосрочно стабильных деплоев рассмотрите Tailscale для Mesh-VPN вместо ручного SSH-форвардинга.
Шаг 4: launchd-демон для работы 24/7
Создать ~/Library/LaunchAgents/com.zekvps.mcp-filesystem.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.zekvps.mcp-filesystem</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/node@20/bin/npx</string>
<string>-y</string>
<string>@modelcontextprotocol/server-filesystem</string>
<string>/Users/agent/workspace</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
launchctl load ~/Library/LaunchAgents/com.zekvps.mcp-filesystem.plist
launchctl start com.zekvps.mcp-filesystem
launchctl list | grep mcp
Подробнее: ключевые различия между launchd и systemd
| Аспект | launchd (macOS) | systemd (Linux) |
|---|---|---|
| Формат конфигурации | XML plist | INI-style unit |
| Путь пользовательских сервисов | ~/Library/LaunchAgents/ | ~/.config/systemd/user/ |
| Команда загрузки | launchctl load | systemctl --user enable |
| Просмотр логов | log stream / файл | journalctl |
Никогда не устанавливайте инструменты systemd на macOS для управления MCP-процессами.
Границы безопасности и управление правами
- Минимальный scope директории — ограничьте путь
server-filesystemтолько нужной папкой, никогда~или/. - Секреты через переменные окружения — API-ключи через
env, не в plist и не в mcp.json. - Аутентификация SSE-порта — Bearer Token + reverse proxy + TLS обязательны при открытом SSE.
- Снимок перед крупными изменениями — восстановление из снимка на порядок быстрее пересборки.
Итог: выбор пути деплоя
| Сценарий | Рекомендуемый деплой |
|---|---|
| Личный эксперимент, один Host | Локальный stdio (или SSH к облачному Mac) |
| Персональный ассистент 24/7, всегда онлайн | Облачный Mac + launchd-демон |
| Общие командные инструменты, несколько Host-ов | Облачный Mac + SSE + reverse proxy |
| Высокая безопасность / соответствие требованиям | Облачный Mac + Tailscale + аудит-логирование |
Практические примеры совместного деплоя OpenClaw и MCP Server — в разделе OpenClaw на этом сайте.
Разделите MCP-лабораторию и продакшен на облачном Mac mini
Выделенный узел M4, аренда на день, SSH из коробки
Сингапур · Япония · Корея · Гонконг · США
Чтобы перевести MCP или Agent из демо в ежедневную работу, сначала зафиксируйте облачный Mac со снимками. Смотреть тарифы ZekVPS Mac mini — Разделите лабораторию и рабочий стол — деплой станет спокойнее.