Почему MCP с локальными моделями — это не «просто подключил и работает»
Ты запустил Ollama, поднял Open Web UI, выбрал модную Qwen2.5 14B (или Llama 4, если у тебя 48 ГБ VRAM). Просишь модель: «Найди последние коммиты в репозитории pytorch». Она кивает, выплевывает JSON с tool_call, а потом... ничего. Или начинает генерировать текст, в котором подробно описывает, как она «выполнила поиск», хотя на самом деле даже не дернула API.
Я уже писал о том, почему opensource-модели фейкут вызовы инструментов. Проблема не ушла. Но Open Web UI последних версий (с апреля 2026) наконец-то получил встроенную поддержку MCP — Model Context Protocol. И теперь можно замкнуть контур: модель вызывает инструмент, сервер исполняет, результат возвращается. Без вранья.
Этот гайд — именно про то, как это сделать на стеке Ollama + Open Web UI. Без облачных прокси, без кустарных скриптов на Flask. Только local-first, только хардкор.
Что нам нужно, чтобы не ходить по граблям
Мой опыт показывает: половина проблем с MCP в локальном окружении — это не кривые руки, а несовместимость версий. На 1 июня 2026 года актуальный стек выглядит так:
| Компонент | Минимальная версия | Рекомендованная |
|---|---|---|
| Ollama | 0.5.0 | 0.5.4+ |
| Open Web UI | 0.4.0 | 0.5.2+ |
| uv (менеджер Python) | 0.4.0 | 0.5.0+ |
| Модель (с tool calling) | Qwen2.5 7B, DeepSeek V3, Llama 4 8B | Qwen3 14B, DeepSeek R1 32B |
Важно: Не смотри на версию Ollama ниже 0.5.0 — function calling там работает через одно место. Обновляйся.
План: от установки до первого реального вызова
1 Ставим uv и MCP-серверы
uv — это быстрый менеджер Python на Rust. Он уже стал стандартом в 2026 году, а pip отправился на пенсию. С его помощью мы развернём MCP-серверы — они будут выполнять реальные вызовы (файловая система, HTTP-запросы, базы данных).
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.bashrc
uv --version
Теперь создадим директорию для наших MCP-инструментов и положим туда серверы. Я предпочитаю mcp-server-time (возвращает текущее время) и mcp-server-fetch (HTTP-запросы).
mkdir ~/mcp-servers && cd ~/mcp-servers
uv init .
uv add mcp-server-time mcp-server-fetch
# Проверяем, что серверы запускаются:
uv run mcp-server-time --transport stdio &
Почему stdio? Потому что Open Web UI подключается к MCP-серверам через стандартный ввод/вывод, а не через HTTP. Это безопаснее и не требует портов.
2 Запускаем Ollama с включенным function calling
В новых версиях Ollama function calling включается отдельным флагом --tool-calls при старте сервера. Без этого модель может генерировать JSON, но он никогда не будет исполнен.
# Останавливаем старый ollama serve, если был запущен
pkill ollama
# Запускаем с поддержкой инструментов
ollama serve --tool-calls 2>&1 | tee ~/ollama.log
Проверь в логах строку Tool calling enabled. Если её нет — обновляй Ollama до версии 0.5.4+.
Грабли: Некоторые модели (например, старый Mixtral 8x7B) не умеют реальный tool calling, даже если сервер включён. Используй Qwen2.5, DeepSeek V3 или Llama 4 — они прошли мой тест на честность.
3 Настраиваем Open Web UI для работы с MCP
Open Web UI начиная с версии 0.4.0 имеет раздел Admin Panel → Models → MCP Servers. Там можно добавить свои серверы.
Перейди в этот раздел и нажми «Add MCP Server». Заполни поля:
- Name: time
- Command:
uv - Arguments:
run --directory /home/user/mcp-servers mcp-server-time - Transport: stdio
Сохрани. Для сервера fetch повтори то же самое, только имя и аргументы другие.
4 Выбираем модель, которая не врёт
В Open Web UI выбери модель, скачанную через Ollama. Например, qwen3:14b-instruct-q4_K_M (релиз мая 2026). Или llama4:8b-instruct.
Важно: модель должна поддерживать native function calling. Проверить это можно, отправив через API запрос с инструментами и посмотрев, возвращает ли модель tool_call с корректными аргументами. Подробнее про проверку я писал в статье про Qwen3 VL.
5 Тестируем: «Который час?»
Открой чат с новой моделью. Напиши: «Покажи текущее время и дату в формате ISO 8601». Если всё настроено правильно, ты увидишь в логах вызов инструмента get_current_time, а затем ответ с реальным временем с твоего компьютера.
Если модель вместо вызова начинает генерировать текст — скорее всего, она не видит инструменты. Проверь, что MCP-серверы запущены и Open Web UI подцепил их (зелёная иконка в админке).
Разбор типичных ошибок (и как их чинить)
Ошибка 1: «Authentication required» от MCP-сервера
Некоторые MCP-серверы (особенно те, что выдёргивают данные с GitHub или Google Drive) требуют токен даже для локального использования. Выход — запускать их с флагом --no-auth или указывать пустой токен через переменную окружения. Полный разбор этой проблемы — в статье «MCP для локальных моделей: как настроить сервер».
Ошибка 2: Модель генерирует tool_call, но сервер не отвечает
Проблема в рантайме. Ollama должен перехватить JSON-вызов и отправить его на выполнение. Если ты видишь в логах модели валидный JSON, но ответ от сервера не приходит — включи дебаг-режим Ollama: OLLAMA_DEBUG=1 ollama serve --tool-calls. Скорее всего, сервер MCP упал с ошибкой импорта или неправильным путём.
Ошибка 3: Open Web UI не показывает инструменты в чате
Проверь версию: Open Web UI 0.4.0+ поддерживает MCP только для моделей, подключенных через Ollama. Если ты используешь другой провайдер (например, llama.cpp напрямую), MCP может не работать. Читай гайд по подключению MCP-серверов к llama-server — там другой подход.
Продвинутые сценарии: больше, чем часы и погода
Когда базовая связка заработала, можно расширять. Вот что я использую в продакшене (да, локальная LLM в продакшене — это реально):
- Доступ к файловой системе — MCP-сервер
filesystemчитает и записывает файлы в разрешённых директориях. - Выполнение Python-скриптов — изолированная среда через
mcp-sandbox. - Управление Docker — контейнеры поднимаются по запросу модели.
- Slack API — модель отправляет сообщения от твоего имени (через токен, конечно).
Каждый такой сервер запускается аналогично: через uv, с конфигом в Open Web UI. Единственное ограничение — модель должна уметь обрабатывать сложные инструменты с несколькими параметрами. Qwen3 14B справляется на ура, DeepSeek R1 32B — ещё лучше.
Реальный кейс из моего CI: модель (Llama 4 8B) получает задачу «запустить тесты на ветке feature/new-mcp», она вызывает инструмент github_list_commits, потом docker_run с образом, и возвращает лог тестов. Всё локально, без интернета.
Как проверить, что модель не фейкует (и не дать ей это сделать)
Вернёмся к проблеме из моего первого поста. Даже с включённым tool calling некоторые модели имитируют вызов, не запуская сервер. Как отличить реальный вызов от галлюцинации?
- Смотри логи MCP-сервера. Если сервер получил JSON-RPC запрос — он выведет его в stderr. Реальный вызов видно.
- Ограничь контекст модели. Если модель не может найти ответ сама, но якобы «выполнила поиск» — это обман. Отключи интернет у модели (запусти без MCP-fetch) и попроси что-то, что требует внешних данных. Если она снова сгенерирует JSON с результатами — она фейкует.
- Используй строгую схему. Open Web UI передаёт в модель дескрипцию инструментов. Если модель не видит их — она не сможет сформировать правильный tool_call. В моём тесте Llama 4 и Qwen3 никогда не фейкают, а вот старые модели (Mixtral, Mistral 7B) — постоянно.
FAQ: частые вопросы с митапов
Почему Open Web UI не видит мой MCP-сервер?
Проверь путь к uv и аргументы. Команда должна быть абсолютной, без тильды. Используй /home/user/.local/bin/uv.
Можно ли подключать MCP к Ollama через сторонние прокси?
Да, я тестировал mcp-proxy. Но Open Web UI с версии 0.4.0 работает напрямую, без прокси. Это проще.
Какая модель лучше всего для tool calling локально?
На июнь 2026 — Qwen3 14B (инструкт) и DeepSeek R1 8B. Llama 4 8B тоже хороша, но тяжеловата.
Как обновить Open Web UI до версии с MCP?
Если ты ставил через pip: pip install open-webui --upgrade. Если через Docker: docker pull ghcr.io/open-webui/open-webui:main.
Последний совет: не верь модели на слово
Я перепробовал десятки сборок. Самая надёжная — Qwen3 14B на Ollama 0.5.4 с Open Web UI 0.5.2. Все инструменты работают, модель не фейкует. Но не забывай: локальная LLM — это как стажёр. Она может случайно сделать что-то опасное (удалить файл, если ты дал права на запись). Всегда ограничивай MCP-серверы через --allowed-directories и не давай полный доступ к системе.
Если хочешь больше автоматизации — посмотри на Open Cowork или Show UI Aloha. Там те же принципы, но с GUI и готовыми агентами.
А теперь — иди и настрой. Если на каком-то шаге застрянешь, пиши в комменты. Я проверяю каждую неделю.