# MCP в Open WebUI: подключить локальный инструмент и проверить вызов

Источник: https://modelium.tech/zhurnal/mcp-open-webui-lokalno/

Open WebUI начиная с v0.6.31 подключает MCP-серверы с транспортом Streamable HTTP через Admin → Integrations. Для локального опыта используйте отдельный сервер с одним безвредным инструментом, включите его в чате и проверьте фактический вызов по журналу сервера, а не только по ответу модели. Сервер stdio напрямую здесь не подключается; для него нужен иной транспорт или мост mcpo.

**Граница проверки, 28 сентября 2026 года.** Интерфейс и путь настройки ниже сверены с документацией Open WebUI на Git commit `6602effdb92ce647f2abe6dbb61e136b62191d7a`; пример сервера — с Python SDK на commit `f1b6589088534632fef92238ee9750951e3c0185`. Modelium не запускал этот стек, не скачивал веса и не измерял способность конкретной модели вызывать инструменты. Для общего знакомства с протоколом есть [справочник MCP](/spravochnik/mcp/). [s1](#src-s1) [s3](#src-s3) [s4](#src-s4)

## Что именно подключается в Open WebUI?

Нативный MCP-клиент Open WebUI доступен с версии v0.6.31 и принимает **Streamable HTTP**, не локальный `stdio`-процесс и не старый SSE URL. В административном интерфейсе нужно выбрать именно `MCP (Streamable HTTP)`, а не `OpenAPI`. MCP-сервер предоставляет список функций с именами и схемами аргументов; открывшийся в чате список ещё не означает, что модель вызвала функцию. [s1](#src-s1) [s6](#src-s6) [s7](#src-s7)

Инструмент получает права той учётной записи, под которой он работает; администратор добавляет MCP-соединение и через Access Control ограничивает, кто сможет его включать. Обычному пользователю доступна возможность добавить собственный **OpenAPI**-сервер при отдельном разрешении Direct Tool Servers, но не произвольный MCP-сервер. Не путайте это с разделом Workspace Tools: сторонние Python-плагины там запускаются в процессе Open WebUI и требуют отдельного доверия к коду. [s1](#src-s1) [s2](#src-s2)

Для задачи «локальный помощник вызывает безопасную функцию» цепочка такова: **запрос в чате → локальная модель с поддержкой tool calling → Open WebUI → MCP endpoint → проверяемый ответ инструмента**. Сам протокол не делает модель лучше: разработчики прямо предупреждают, что она может проигнорировать доступную функцию либо ошибиться в аргументах. Не выводите успех из правдоподобной фразы модели. [s1](#src-s1) [s2](#src-s2)

## Что подготовить до настройки?

Нужны рабочий Open WebUI версии не ниже v0.6.31, административный доступ, модель с функцией вызова инструментов и отдельный MCP Streamable HTTP endpoint, доступный **из процесса Open WebUI**. Начните с [общей инструкции Open WebUI](/zhurnal/open-webui/) и [проверки tool calling](/zhurnal/tool-calling-lokalnyh-modeley/). Для опытов берите инструмент без доступа к рабочим файлам, ключам, почте и учётным системам. [s1](#src-s1) [s2](#src-s2) [s7](#src-s7)

Если Open WebUI работает в контейнере, `127.0.0.1` внутри него — не loopback хоста с вашим MCP-сервером. В документации для размещённого на хосте сервиса указан адрес `host.docker.internal:<port>`; фактическую доступность этого адреса из контейнера и сетевые ограничения нужно проверять на своей ОС. Не открывайте тестовый endpoint на `0.0.0.0` и в интернет только ради устранения ошибки соединения: спецификация рекомендует локальный bind на loopback и проверку `Origin`. Для нескольких контейнеров используйте согласованную внутреннюю сеть и проверяйте адрес сервиса именно из Open WebUI. [s1](#src-s1) [s6](#src-s6)

Отличайте три адреса: URL Open WebUI в браузере, URL локальной модели (например, Ollama у вас на хосте) и URL MCP-сервера. Успешный ответ Ollama не подтверждает доступность MCP endpoint. Не передавайте в инструменты реальные секреты, пока не подтверждены авторизация, сетевой периметр и права пользователя. [s1](#src-s1) [s6](#src-s6)

## Как получить безопасный пробный сервер?

Если у вас **уже есть** собственный проверенный Streamable HTTP-сервер, используйте его точный `/mcp` URL и разрешённую функцию только для чтения; не переустанавливайте рабочий сервис. Для отдельного учебного опыта на Unix-подобной системе Python SDK документирует `uv add "mcp[cli]"`, объект `MCPServer`, декоратор `@mcp.tool()` и запуск `mcp.run(transport="streamable-http", port=3001)`. Ниже код адаптирован под безвредный ответ: он не открывает файлы и не делает сетевых запросов. Это **инструкция для вашего теста по исходникам**, не результат прогона Modelium. [s3](#src-s3) [s4](#src-s4) [s8](#src-s8)

В пустом учебном каталоге создайте проект, установите SDK и сохраните `server.py`. Сначала оцените зависимости по правилам своей среды: установка `mcp` получает пакет из пакетного индекса. Не запускайте этот код в среде с рабочими секретами. [s3](#src-s3) [s4](#src-s4)

mkdir mcp-webui-smoke && cd mcp-webui-smokeuv inituv add "mcp[cli]"

import loggingfrom mcp.server import MCPServerlogging.basicConfig(level=logging.INFO)mcp = MCPServer("Modelium-safe-smoke")@mcp.tool()def echo_marker(marker: str) -> str:    """Return an explicit test marker without reading private data."""    logging.info("echo_marker called with marker=%s", marker)    return f"tool_called:{marker}"if __name__ == "__main__":    mcp.run(transport="streamable-http", port=3001)

uv run python server.py

SDK в закреплённом примере поднимает endpoint `http://127.0.0.1:3001/mcp`. Этот вариант предназначен для Open WebUI **на том же сетевом хосте**; если интерфейс в Docker, не копируйте адрес `127.0.0.1` в его настройки. Чтобы подключить сервис через контейнерную сеть, нужно отдельно настроить bind, изоляцию и ограничение доступа; публичный незащищённый endpoint не подходит. Простая проверка `curl -I /mcp` не годится: MCP использует POST и может не поддерживать HEAD или обычный GET без сессии. [s8](#src-s8) [s6](#src-s6)

## Как добавить сервер и включить инструмент?

Администратор открывает **Settings → Admin → Integrations → External Tool Servers → Add Connection**, выбирает **MCP (Streamable HTTP)**, указывает проверенный URL endpoint и подходящую авторизацию. Для локального учебного сервера без токена — `None`; `Bearer` выбирают только когда сервер действительно требует ключ и он задан. При необходимости ограничьте список функций фильтром и выдайте доступ тестовому пользователю, затем сохраните; если UI требует рестарт, выполните его в своей тестовой среде. [s1](#src-s1)

Для сервера с OAuth режимы 2.1 и Static требуют отдельной регистрации клиента, а доступ пользователя завершается в его браузере. Кнопка `Check OAuth Discovery` проверяет только документ авторизации: она **не** доказывает наличие инструментов или успешный вызов. Не ставьте OAuth-инструментом «по умолчанию» модель, пока пользователь не авторизовался: интерактивное подтверждение нельзя прозрачно провести посередине запроса модели. Если задействован OAuth, закрепите постоянный `WEBUI_SECRET_KEY`, иначе токены могут стать нечитаемыми после пересоздания Docker-контейнера. [s1](#src-s1)

В чате выберите локальную модель, откройте **Integrations → Tools** у поля ввода и явно включите только тестовую функцию. Используйте режим Native function calling; при недостаточной надёжности конкретной модели ищите проблему отдельно в модели, не называйте её молчание ошибкой MCP. Видимость функции и включённый переключатель — только предварительные признаки. [s1](#src-s1) [s2](#src-s2)

## Как проверить вызов, а не только ответ модели?

Для `echo_marker` отправьте в тестовом чате: «Вызови инструмент `echo_marker` с аргументом `marker=smoke-28`, покажи точный ответ инструмента. Если вызов недоступен, так и скажи». **Критерий успеха:** в трассе/истории исполнения инструмента есть вызов `echo_marker` с аргументом `smoke-28`, инструмент вернул `tool_called:smoke-28`, и ответ модели опирается на этот результат. Если ваша версия интерфейса не показывает трассу, добавьте журнал вызовов **в самом доверенном MCP-сервере** для теста; текст модели без записи выполнения не доказывает вызов. Это проверка маршрута на ваших данных, не бенчмарк модели. [s2](#src-s2) [s4](#src-s4) [s7](#src-s7)

Сначала проверяйте сетевую точку и транспорт, затем наличие функции и права пользователя, потом tool-calling модели. Повторите тест с заведомо другой меткой (`smoke-29`) и сравните оба аргумента и результата: заранее заученная реплика уже не сойдёт за вызов. Для корпоративных данных следующий этап — отдельная политика авторизации инструмента, подтверждение операций и контроль доступа к источникам; права входа в WebUI сами по себе не подтверждают ограничение содержимого документов в RAG. [s1](#src-s1) [s7](#src-s7)

## Если подключение не работает или нужен stdio

- **Бесконечная загрузка после добавления.** Проверьте тип соединения: JSON с `mcpServers` не вводят как OpenAPI-сервер. Восстановите настройку из Admin → Integrations и добавьте MCP-коннектор с правильным типом. [s1](#src-s1)

- **Нет соединения, но OAuth discovery «зелёный».** Discovery не обращается к MCP tool endpoint; отдельно проверьте URL, область видимости сервера из контейнера, требуемый Bearer/OAuth и таймаут холодного старта. [s1](#src-s1)

- **Инструмент есть у администратора, но не у читателя.** Проверьте Access Control коннектора и индивидуальный допуск пользователя; по умолчанию нельзя считать, что общий сервер доступен всем. [s1](#src-s1) [s2](#src-s2)

- **Функция доступна, но модель отвечает без вызова.** Проверьте Native mode, достаточность контекста и качество tool calling у выбранной модели; не подменяйте это тестом «похоже, сработало». [s1](#src-s1) [s2](#src-s2)

- **У вас сервер только **`**stdio**`** или старый SSE.** Нативное соединение Open WebUI с ним не описано. Либо используйте HTTP-версию самого сервера, либо отдельный `mcpo`, который публикует OpenAPI endpoint для stdio/SSE, затем подключайте его как **OpenAPI**, а не как нативный MCP. Этот мост — дополнительная поверхность доступа: задайте ключ и закрытую сеть, не обещайте безопасность только потому, что появился HTTP URL. [s1](#src-s1) [s5](#src-s5)

Следующий шаг: [проверить tool calling локальной модели](/zhurnal/tool-calling-lokalnyh-modeley/) на безвредном инструменте и сохранить фактическую трассу вызова. После этого можно выбирать конкретную задачу, runtime и железо; пока нет проверенного результата, страницу нельзя трактовать как свидетельство локального запуска Modelium. [s1](#src-s1) [s2](#src-s2)

## Источники

1. [Open WebUI — Model Context Protocol: native MCP, access and troubleshooting](https://github.com/open-webui/docs/blob/6602effdb92ce647f2abe6dbb61e136b62191d7a/docs/features/extensibility/mcp.mdx) — получено 2026-09-28
2. [Open WebUI — Tools: enable in chat, Native mode and access](https://github.com/open-webui/docs/blob/6602effdb92ce647f2abe6dbb61e136b62191d7a/docs/features/extensibility/plugin/tools/index.mdx) — получено 2026-09-28
3. [MCP Python SDK — README: installation and server](https://github.com/modelcontextprotocol/python-sdk/blob/f1b6589088534632fef92238ee9750951e3c0185/README.md) — получено 2026-09-28
4. [MCP Python SDK — Streamable HTTP example tutorial002.py](https://github.com/modelcontextprotocol/python-sdk/blob/f1b6589088534632fef92238ee9750951e3c0185/docs_src/run/tutorial002.py) — получено 2026-09-28
5. [Open WebUI — MCP-to-OpenAPI bridge mcpo](https://github.com/open-webui/docs/blob/6602effdb92ce647f2abe6dbb61e136b62191d7a/docs/features/extensibility/plugin/tools/openapi-servers/mcp.mdx) — получено 2026-09-28
6. [MCP specification 2026-07-28 — Streamable HTTP and origin safety](https://github.com/modelcontextprotocol/specification/blob/ab3a39c13bd23be691c2760e1c6c5c15a64582e1/docs/specification/2026-07-28/basic/transports/streamable-http.mdx) — получено 2026-09-28
7. [MCP specification 2026-07-28 — tools schema and safety](https://github.com/modelcontextprotocol/specification/blob/ab3a39c13bd23be691c2760e1c6c5c15a64582e1/docs/specification/2026-07-28/server/tools.mdx) — получено 2026-09-28
8. [MCP Python SDK — Running your server: Streamable HTTP path and bind](https://github.com/modelcontextprotocol/python-sdk/blob/f1b6589088534632fef92238ee9750951e3c0185/docs/run/index.md) — получено 2026-09-28
