Развёртывание MCP-сервера для ChatGPT заканчивается не в тот момент, когда начинает отвечать /mcp. ChatGPT должен подключиться к серверу, найти нужные инструменты, корректно аутентифицировать пользователей и выбрать правильный инструмент для каждой задачи. Для большинства команд оптимальный вариант — управляемый хостинг; приватную инфраструктуру лучше подключать через Secure MCP Tunnel.
Сначала определите границы размещения
От выбранной схемы размещения зависят транспорт, объём работы с аутентификацией, операционные издержки и возможность публикации сервера. ChatGPT выступает удалённым MCP-клиентом: он не запускает локальный процесс через stdio напрямую, как это делают некоторые десктопные клиенты (справочный центр OpenAI).
| Вариант размещения | Подключение к ChatGPT | Когда подходит | Основные издержки |
|---|---|---|---|
| Управляемый публичный хостинг | Стабильная HTTPS-точка со Streamable HTTP | Большинство командных приложений и сервисов для клиентов | Ограничения платформы и зависимость от провайдера |
| Собственная публичная точка | Стабильный HTTPS-адрес контейнера, виртуальной машины или кластера | Команды с уже работающей платформой и требованиями к соответствию или сети | Вы самостоятельно отвечаете за TLS, масштабирование, обновления, откат и мониторинг |
| Secure MCP Tunnel | Точка OpenAI ретранслирует запросы к приватному серверу через stdio или HTTP | Локальные системы, закрытые сети и разработка | Доступность начинает зависеть от исправности tunnel-client |
По умолчанию выбирайте управляемый хостинг, если MCP-сервер не хранит состояние, нагрузка возникает время от времени, а у команды нет уже надёжной платформы для публичных приложений. Маршруты Vercel и бессерверные Worker-сценарии Cloudflare дают стабильный HTTPS-адрес, который ожидает ChatGPT. Перед выбором проверьте ограничения конкретной платформы по длительности запросов, потоковой передаче и хранению состояния (Vercel, Cloudflare).
Размещайте публичную точку самостоятельно, если сервер должен работать рядом с существующими базами данных, использовать корпоративную систему идентификации, соответствовать требованиям к месту хранения данных или выполнять задачи, не укладывающиеся в ограничения бессерверной модели. Такой вариант оправдан только тогда, когда у команды уже есть управление секретами, откаты релизов, оповещения и ответственный дежурный.
Используйте Secure MCP Tunnel, если публичный входящий доступ противоречит выбранной модели безопасности. Клиент туннеля OpenAI устанавливает исходящие HTTPS-соединения с api.openai.com:443 и пересылает запросы приватному HTTP-серверу или серверу через stdio; открывать входящий порт в интернете не требуется. При этом в документации OpenAI прямо указано: Secure MCP Tunnel не подходит для публичной публикации, где нужен стабильный общедоступный HTTPS-адрес (документация OpenAI по туннелям, руководство OpenAI по разработке).
Как превратить локальные инструменты в рабочий MCP-сервер для ChatGPT
Надёжное развёртывание MCP-сервера для ChatGPT проходит через отдельные проверки логики инструментов, протокола, доступности в продакшене и маршрутизации запросов моделью. Успешная проверка на одном этапе не гарантирует успеха на следующем.
1. Опишите узкие инструменты и стабильные контракты
Начните с отдельного инструмента для каждого понятного пользовательского действия. В руководстве OpenAI используются отдельные инструменты list_projects, get_project и update_project, а не один универсальный инструмент с несвязанными режимами (документация OpenAI для разработчиков). Для каждого инструмента нужны имя, описывающее действие, точное описание, явная схема входных данных, полезный результат и корректные аннотации безопасности.
Ставьте readOnlyHint: true только для инструментов, которые не меняют состояние. Используйте destructiveHint: true для необратимых или трудно обратимых действий, а openWorldHint: true — когда инструмент обращается к открытым внешним объектам. OpenAI описывает эти аннотации как метаданные для модели, влияющие на работу инструментов и обработку рисков, но требует, чтобы авторизация для каждого защищённого запроса принудительно проверялась на сервере (документация OpenAI для разработчиков).
Возвращайте стабильные идентификаторы записей в structuredContent, если следующий вызов может обновить ту же запись. Не помещайте токены, секреты и лишние персональные данные в content, structuredContent и _meta: OpenAI отдельно подчёркивает, что _meta скрыто от модели, но не является защищённым хранилищем.
2. Поднимите Streamable HTTP локально
Обычное удалённое подключение ChatGPT использует Streamable HTTP, чаще всего по адресу /mcp. Этот путь принят по соглашению, но не обязателен; в ChatGPT нужно указать полный URL развёрнутого сервера (руководство OpenAI по подключению).
Запустите сервер локально и откройте MCP Inspector:
npx @modelcontextprotocol/inspector@latest
Подключите Inspector к адресу вроде http://localhost:3000/mcp. Проверьте инициализацию и список инструментов, затем вызовите каждый инструмент с корректным запросом, ошибочной схемой, отсутствующим идентификатором и сценарием с пустым результатом. Для защищённых инструментов убедитесь, что запросы без учётных данных или с недостаточными правами отклоняются.
3. Настройте контроль доступа до публикации
Публичная проверка работоспособности не означает, что публичным должен быть весь набор инструментов. Если сервер отдаёт только намеренно открытые данные в режиме чтения, отсутствие аутентификации может быть допустимым. Для приватных и пользовательских данных, а также для действий аутентификация и авторизация нужны в каждом запросе (руководство OpenAI по разработке).
В OAuth-защищённой MCP-схеме сервер выступает как resource server. Запрос без аутентификации должен возвращать 401 и указывать клиенту на метаданные защищённого ресурса, обычно по адресу /.well-known/oauth-protected-resource. Поток авторизации должен использовать PKCE, токены с узкими правами, строгую проверку issuer и audience, а при длительных соединениях — поддержку refresh-токенов (справочный центр OpenAI).
Не передавайте MCP-токен во внешний сервис только потому, что оба сервиса принимают bearer-токены. Токен должен быть предназначен именно для ресурса-получателя; для последующих вызовов используйте сервисные учётные данные или корректную схему обмена токенами (руководство по безопасности MCP-развёртывания).
4. Разворачивайте неизменяемый кандидат
Сначала отправьте тот же билд, который прошёл проверку в Inspector, на preview- или staging-адрес, а затем продвигайте этот артефакт в продакшен. Продакшен-точка должна работать по HTTPS, сохранять полный MCP-путь, иметь доступ к зависимостям, а секреты должны храниться в секрет-хранилище платформы.
Для компактного сценария на Vercel установите mcp-handler, @modelcontextprotocol/server и zod; подключите возвращаемый Web Handler в app/api/mcp/route.ts; экспортируйте его для GET и POST, а затем выполните:
npx vercel deploy --prod
После этого URL подключения к ChatGPT будет выглядеть так: https://your-project.vercel.app/api/mcp. Согласно документации Vercel, стандартная длительность функции с Fluid compute составляет 300 секунд, а на подходящих платных конфигурациях предел выше. Поэтому длительные операции лучше выносить в возобновляемые задания, а не удерживать бездействующий поток открытым (руководство Vercel по развёртыванию). Не храните состояние в маршруте, если выбранная среда не предоставляет для этого продуманную общую архитектуру.
До подключения ChatGPT добавьте четыре операционных механизма:
- Настройте тайм-ауты и ограничения частоты для дорогих инструментов.
- Логируйте ошибки инициализации и вызовов, но не записывайте токены и чувствительные результаты.
- Фиксируйте идентификатор релиза при каждом вызове, чтобы инцидент можно было связать с конкретным кодом.
- Поддерживайте проверенный сценарий отката для регрессий схем инструментов и авторизации.
Запустите MCP Inspector для продакшен-URL, а не только для localhost. Повторно проверьте обнаружение инструментов, схемы, аннотации, аутентификацию, успешные вызовы и ошибки. Балансировщик, прокси, правило CORS или перенаправление провайдера идентификации могут сломать интеграцию, даже если локально приложение работало.
Разделите контроль доступа на три уровня
Доступ MCP из ChatGPT контролируется на трёх независимых уровнях; одного OAuth достаточно только для уровня идентификации.
| Уровень | Где контролируется | Что нужно решить |
|---|---|---|
| Доступ к рабочей области | Административные настройки ChatGPT | Кто может создать, опубликовать, включить или использовать приложение? |
| Идентичность пользователя | OAuth-сервер авторизации и MCP resource server | Какая учётная запись выполняет вызов и действителен ли токен для этого сервера? |
| Доступ к ресурсу и действию | Обработчик MCP-инструмента и бэкенд | Может ли этот пользователь выполнить действие для данного клиента, записи или окружения? |
В ChatGPT Business администраторы или владельцы управляют режимом разработчика и публикацией. В рабочих областях Enterprise и Edu появляются RBAC-права для доступа разработчиков, приложений и действий (справочный центр OpenAI). Эти настройки регулируют использование приложения в ChatGPT, но не доказывают, что вызывающий имеет право изменить запись клиента A в бэкенде.
MCP-обработчик должен извлекать идентичность из проверенных учётных данных и при каждом вызове применять проверки клиента и объекта. Никогда не принимайте ID пользователя, организации или роль из аргументов, сгенерированных моделью, за подтверждение личности. Любые аргументы инструмента считайте недоверенными данными.
Разделяйте права на чтение и запись. Например, projects:read можно выдать широкому кругу пользователей, projects:write оставить редакторам, а перед разрушительными операциями выполнять новую серверную проверку. ChatGPT может запросить подтверждение значимого действия, но подтверждение — это защита пользовательского сценария, а не механизм авторизации.
Промпт-инъекции тоже относятся к проблемам контроля доступа. В выводе инструментов и найденных документах могут содержаться вредоносные инструкции, поэтому инструменты записи должны выполнять максимально узкие действия, а допустимые поля нужно проверять на сервере. Универсальный инструмент execute_action одновременно повышает неоднозначность маршрутизации и потенциальный ущерб.
Подключите, протестируйте и опубликуйте приложение в ChatGPT
Подключение адреса создаёт черновик приложения и снимок его метаданных. Публикация делает проверенную конфигурацию доступной рабочей области; это отдельная операция, не равная развёртыванию серверного кода.
- Включите режим разработчика в соответствии с политикой вашей рабочей области ChatGPT.
- Откройте создание приложения и укажите полный HTTPS-адрес MCP, включая
/mcp, если по этому пути смонтирован маршрут. - Выберите способ аутентификации и при необходимости завершите OAuth-процедуру.
- Запустите Scan Tools, проверьте каждое найденное имя, схему, аннотацию и действие, затем создайте черновик.
- Протестируйте черновик в новом чате и только после этого опубликуйте его в рабочей области.
Для приватного сервера выберите Tunnel в качестве подключения, а затем укажите связанный туннель или введите его tunnel_id. Оператору нужны права OpenAI Platform Tunnels Read + Use, тогда как режим разработчика ChatGPT остаётся отдельным разрешением рабочей области (документация OpenAI по туннелям).
Изменения метаданных требуют отдельного жизненного цикла. Для подключения в режиме разработчика разверните или перезапустите сервер, откройте подключение, нажмите Refresh, проверьте обновлённые метаданные и начните новый разговор. Согласно актуальным рекомендациям OpenAI для Business, опубликованные приложения при изменении инструментов или метаданных нужно создать и опубликовать заново. Администраторы Enterprise/Edu могут обновлять действия, просматривать различия и включать новые действия — по умолчанию они отключены (справочный центр OpenAI).
Самая безопасная политика развития сервера — обратная совместимость. Добавляйте необязательные поля и новые инструменты, но не меняйте незаметно смысл существующего инструмента. Старые схемы стоит сохранять, пока все утверждённые снимки и клиенты не перейдут на новую версию.
Проверяйте поведение, которое увидят пользователи ChatGPT
Протокольные тесты показывают, что сервер умеет отвечать. Тесты в ChatGPT проверяют, выбирает ли модель нужный инструмент, передаёт ли подходящие аргументы, соблюдает ли ограничения и не вызывает ли инструмент, когда он не нужен.
Пользователь Reddit u/EmailNo8428 описал эту задачу как проверку двух уровней:
«На самом деле вы одновременно тестируете две вещи: логику инструментов и то, как конкретный клиент их вызывает». (r/mcp)
Соберите небольшой версионируемый набор проверок со следующими сценариями:
| Сценарий | Ожидаемый результат |
|---|---|
| Прямой запрос | Выбран названный пользователем инструмент, переданы корректные аргументы |
| Косвенный запрос | Модель выводит нужный инструмент из цели пользователя |
| Продолжение диалога | Повторно используется стабильный идентификатор из предыдущего ответа |
| Негативный запрос | Ни один MCP-инструмент не вызывается |
| Недостаточно прав | Возвращается понятная ошибка авторизации без утечки данных |
| Запрос на запись | Выбран узкий инструмент записи и запрошено необходимое подтверждение |
| Неоднозначный запрос | Модель запрашивает недостающие сведения, а не выдумывает аргументы |
| Пустой результат | Возвращается корректное пустое состояние, а не ошибка транспорта или схемы |
Фиксируйте выбранный инструмент, аргументы, результат, ошибку и поведение подтверждения. Повторяйте затронутые проверки после каждого изменения имени, описания, схемы, аннотации, правила аутентификации или формата результата; OpenAI рекомендует такой же цикл обновления и повторного тестирования в руководстве по подключению.
Если сервер проходит Inspector, но ChatGPT плохо выбирает инструменты, обычно нужно точнее разделить инструменты, улучшить описания или уточнить схемы. Если маршрутизация правильная, но сервер возвращает 401, уходит в тайм-аут или теряет состояние, проблема, скорее всего, в инфраструктуре или авторизации. Разделение этих диагнозов заметно ускоряет исправление.
FAQ
Может ли ChatGPT напрямую подключиться к localhost или MCP-серверу через stdio?
Нет. Обычно ChatGPT подключается к удалённой MCP-точке. Secure MCP Tunnel от OpenAI умеет передавать запросы приватному серверу через stdio или HTTP без публичного входящего доступа, а временный HTTPS-туннель подходит для разработки, но не для публичной публикации плагина.
Нужен ли MCP-серверу для ChatGPT публичный HTTPS-адрес?
Для обычного удалённого подключения и публичной публикации плагина нужен стабильный HTTPS-адрес. Приватный сервер в режиме разработчика можно подключить через Secure MCP Tunnel, оставив его внутри инфраструктуры под контролем клиента.
Обязательны ли инструменты search и fetch?
Нет. OpenAI сообщает, что подключённым серверам они больше не требуются. Реализуйте стандартные контракты search и fetch, если приложение должно участвовать в поиске по корпоративным знаниям или в сценариях глубокого исследовательского поиска (справочный центр OpenAI).
Почему после развёртывания ChatGPT продолжает показывать старые инструменты?
ChatGPT хранит обнаруженные метаданные и не воспринимает каждый деплой кода как утверждённое изменение набора инструментов. Обновите подключение в режиме разработчика и начните новый разговор; опубликованные приложения в рабочих областях проходят предусмотренный тарифом процесс проверки и повторной публикации.