ПОЧЕМУ ЭТОТ СПОР ВООБЩЕ ВОЗНИК
С конца 2024 года, когда Anthropic выкатила Model Context Protocol, в чатах разработчиков не утихает вопрос: «А зачем мне MCP, если у меня уже работает function calling?» К 2026 году путаница только выросла — потому что оба термина крутятся вокруг одной идеи: дать языковой модели руки, чтобы она дёргала внешний код, а не только генерировала текст.
Проблема в том, что это разные уровни абстракции. Сравнивать их в лоб — всё равно что спорить, что лучше: функция на Python или REST API. Одно живёт внутри процесса, другое — сетевой контракт поверх. Разберёмся без маркетинговой воды, с кодом и цифрами.
ЧТО ТАКОЕ FUNCTION CALLING (TOOL USE)
Function calling — механизм, при котором вы описываете модели набор доступных функций через JSON Schema, а модель в ответ решает: сгенерировать текст или вернуть структурированный вызов инструмента с аргументами. У Anthropic это исторически называется tool use, у OpenAI — function calling, суть одна.
Важно понимать: модель сама ничего не выполняет. Она лишь говорит «вызови get_weather с city=Москва». Дальше ваш код запускает функцию, возвращает результат обратно в диалог, и модель формулирует финальный ответ. Вся оркестрация — на вас.
# Anthropic Messages API, tool use
import anthropic
client = anthropic.Anthropic()
tools = [{
"name": "get_weather",
"description": "Текущая погода в городе",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Название города"}
},
"required": ["city"]
}
}]
resp = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "Какая погода в Москве?"}],
)
# resp.stop_reason == "tool_use" -> модель просит вызвать инструмент
for block in resp.content:
if block.type == "tool_use":
print(block.name, block.input) # get_weather {'city': 'Москва'}
Плюсы очевидны: минимум обвязки, нулевая инфраструктура, работает в одном HTTP-запросе. Минус — все определения инструментов и их реализация живут внутри конкретного приложения. Хотите те же 12 функций в другом сервисе — копипастите схемы и код заново.
ЧТО ТАКОЕ MCP
Model Context Protocol — открытый протокол (спека и SDK опубликованы Anthropic, но им пользуются далеко не только их модели), который стандартизирует, как приложение-хост общается с внешними серверами инструментов. Аналогия, которую все повторяют не зря: MCP — это USB-C для ИИ-инструментов. Один разъём — любое устройство.
Архитектура из трёх ролей:
- Host — приложение с LLM (IDE, десктоп-клиент, ваш агент).
- Client — коннектор внутри хоста, держит соединение один-к-одному с сервером.
- Server — отдельный процесс, который отдаёт tools, resources и prompts. Написан один раз, подключается куда угодно.
Транспорт — обычно stdio для локальных серверов или Streamable HTTP для удалённых. Сервер объявляет свои инструменты, а хост подтягивает их и... скармливает модели через тот же самый function calling. Вот ключевой момент: MCP не заменяет tool use, он его доставляет.
// MCP-сервер на TypeScript (@modelcontextprotocol/sdk)
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({ name: "weather", version: "1.0.0" });
server.tool(
"get_weather",
{ city: z.string().describe("Название города") },
async ({ city }) => {
const data = await fetchWeather(city);
return { content: [{ type: "text", text: JSON.stringify(data) }] };
}
);
await server.connect(new StdioServerTransport());
// Теперь этот сервер видят Claude Desktop, Cursor, ваш агент — без переписывания
КЛЮЧЕВЫЕ ОТЛИЧИЯ В ТАБЛИЦЕ
| Критерий | Function calling / tool use | MCP |
|---|---|---|
| Уровень | Фича API модели | Протокол-транспорт поверх |
| Где живёт инструмент | Внутри одного приложения | Отдельный переиспользуемый сервер |
| Переносимость | Копипаст схем между проектами | Один сервер — много хостов |
| Инфраструктура | Нулевая, один HTTP-вызов | Нужен запущенный сервер + клиент |
| Кто исполняет вызов | Ваш код вручную | MCP-клиент по протоколу |
| Помимо инструментов | Только функции | Ещё resources и prompts |
| Экосистема | Своя на каждый проект | Сотни готовых серверов |
| Порог входа | Минут 15 | Час-два на первый сервер |
ГЛАВНОЕ ЗАБЛУЖДЕНИЕ: ЭТО НЕ «ИЛИ-ИЛИ»
Самая частая ошибка в спорах 2026 года — считать, что вы выбираете одно вместо другого. На деле, когда MCP-хост получает список инструментов от сервера, он превращает их в те же самые tool-определения и передаёт модели через нативный function calling. То есть под капотом MCP всегда использует tool use.
Разница чисто в том, откуда пришли определения инструментов и кто их исполняет:
- Голый function calling: схемы захардкожены в приложении, исполнение вручную.
- MCP: схемы приходят по протоколу от внешнего сервера, исполнение — через стандартный клиент.
Поэтому корректный вопрос звучит не «MCP или function calling», а «стоит ли мне выносить инструменты в MCP-серверы или держать их инлайн».
КОГДА БРАТЬ ЧИСТЫЙ FUNCTION CALLING
- Один проект, 2–5 инструментов. Обёртка MCP тут — оверинжиниринг.
- Инструменты специфичны для этого приложения и нигде больше не пригодятся.
- Жёсткие требования к латентности. Лишний процесс-сервер и IPC добавляют миллисекунды и точки отказа.
- Прототип или демо. Скорость важнее переносимости.
- Serverless без долгоживущих процессов, где поднимать stdio-сервер неудобно.
По ощущениям практиков, для 70% простых интеграций голого tool use достаточно, и городить протокол незачем.
КОГДА НУЖЕН MCP
- Несколько приложений/агентов делят одни интеграции. Написал MCP-сервер для Jira один раз — подключил в IDE, в чат-бота и в CI-агента.
- Нужна готовая экосистема. Серверов под GitHub, Postgres, Slack, файловую систему, браузер уже сотни — берёшь и подключаешь.
- Клиент — не ваш продукт. Если пользователи работают через Claude Desktop, Cursor, Zed или другой MCP-совместимый хост, MCP — единственный способ отдать им инструменты.
- Разделение ответственности в команде. Одна команда пилит сервер, другая — агента, контракт между ними фиксирован протоколом.
- Помимо функций нужны ресурсы и промпты — MCP отдаёт и файлы-контекст, и шаблоны промптов, чего голый function calling не умеет.
Новые MCP-серверы и tool-use фреймворки выходят буквально пачками — свежие релизы удобно отслеживать в каталоге REDDYX, чтобы не собирать интеграцию, которая уже написана до вас.
ПРАКТИЧЕСКАЯ СТРАТЕГИЯ ВЫБОРА НА 2026
Рабочий алгоритм, который я применяю на реальных проектах:
- Старт — всегда с function calling. Опиши инструменты инлайн, убедись, что модель их правильно вызывает, вылови косяки в схемах.
- Заметил, что копируешь те же схемы в третий проект — вот триггер выносить в MCP-сервер.
- Целишься в чужие хосты (IDE, десктоп-клиенты) — сразу MCP, обратной дороги нет.
- Гибрид легален и нормален. Часть инструментов — через MCP-серверы, часть — инлайн-функции в том же агенте. Модель их не различает.
Отдельно про безопасность: MCP-сервер — это исполняемый код с доступом к вашим данным. В 2026 сообщество не раз ловило проблемы с недоверенными серверами (prompt injection через описания инструментов, подмена tool-результатов). Ставьте серверы только из проверенных источников и изолируйте права. Курируемые списки инструментов и разборы находок мы регулярно публикуем в каталоге REDDYX.
ЧТО ПО ПРОИЗВОДИТЕЛЬНОСТИ И ЦЕНЕ
Технически MCP не меняет стоимость запроса к модели — токены за tool-определения и результаты считаются одинаково, независимо от того, пришли инструменты инлайн или по протоколу. Единственная накладка MCP — сетевой/IPC-раунд-трип до сервера, обычно единицы-десятки миллисекунд для локального stdio.
Более тонкий момент: чем больше инструментов вы даёте модели, тем больше токенов в системном контексте и тем выше шанс, что модель выберет не тот инструмент. По наблюдениям сообщества, качество выбора заметно проседает после нескольких десятков инструментов в одном контексте — это касается и MCP, и голого function calling одинаково. Лечится группировкой серверов и подгрузкой инструментов по релевантности, а не свалкой всего сразу.
Частые вопросы
MCP заменяет function calling?
Нет. MCP работает поверх function calling: хост получает инструменты от MCP-сервера и передаёт их модели через тот же самый механизм tool use. Это транспорт и стандартизация, а не замена низкоуровневой фичи.
Можно ли использовать MCP с моделями не от Anthropic?
Да. Хотя протокол опубликовала Anthropic, MCP — открытый стандарт, и клиенты/хосты работают с любой моделью, поддерживающей function calling. Сам сервер вообще не привязан к конкретной модели.
Что выбрать для простого чат-бота с парой инструментов?
Голый function calling. Для 2–5 инструментов внутри одного приложения обёртка MCP — избыточная инфраструктура. Переходите на MCP, только когда те же инструменты нужны в нескольких хостах.
Насколько MCP-серверы безопасны?
MCP-сервер — это исполняемый код с доступом к данным. Ставьте только серверы из доверенных источников, ограничивайте права и помните про риск prompt injection через описания инструментов. Недоверенный сервер способен подменить результаты вызовов.
Если хочется держать руку на пульсе — новые MCP-серверы, tool-use фреймворки и агентные тулзы для AI/ML/Web3 я разбираю по горячим следам в Telegram-канале REDDYX AI — новые репозитории каждые 30–60 минут.