Протоколы инструментов: function calling и MCP

В разделе 2 мы парсили текст вручную. В продакшне вызов инструментов стандартизируют — это надёжнее. Разбираем function calling и MCP.

Function calling — встроенная возможность модели возвращать не текст, а структурированный запрос на вызов инструмента. MCP — протокол, стандартизирующий подключение внешних инструментов к агентам.

Проблема «ручного» парсинга

В разделе 3 модель писала Action: calc[2+2], а мы разбирали это регулярками. Это хрупко: модель отклоняется от формата, парсер ломается. Хочется, чтобы модель сразу выдавала структуру, а не текст, который надо угадывать.

Function calling

Современные модели умеют это нативно. Вы передаёте им описания инструментов (имя + схема, как в уроке 2.2), а модель в ответ возвращает структурированный вызов: имя инструмента и аргументы — уже разобранные, без парсинга текста.

// модель возвращает структуру (не текст для парсинга):
{
  "tool_calls": [
    {
      "name": "calc",
      "arguments": { "expression": "2 + 2" }
    }
  ]
}
// агент выполняет calc(expression="2 + 2") и возвращает результат
// следующим сообщением — петля та же, но без хрупкого парсера

Это убирает целый класс ошибок: не нужно регулярками вытаскивать имя и аргумент, модель выдаёт их явно и по схеме. Цикл агента остаётся прежним — меняется только способ получить «что вызвать».

MCP (Model Context Protocol)

Function calling решает «как модель просит инструмент». MCP решает другую задачу — как подключать инструменты к агентам стандартно. Без стандарта каждый инструмент интегрируют под конкретный фреймворк по-своему; это не переносимо.

MCP вводит общий протокол: инструмент (или источник данных) поднимается как MCP-сервер и описывает, что умеет; агент-клиент подключается и пользуется — независимо от фреймворка. По духу это как USB для инструментов: один разъём, к которому подходит много устройств.

// MCP-сервер объявляет инструмент (схематично):
{
  "tools": [
    {
      "name": "search_docs",
      "description": "Ищет по внутренней документации",
      "inputSchema": { "type": "object",
        "properties": { "query": { "type": "string" } } }
    }
  ]
}
// любой MCP-клиент (агент) может подключиться и вызвать search_docs

Как это связано

Что решаетУровень
Function callingкак модель просит вызвать инструментмодель ↔ агент
MCPкак инструменты подключаются к агентам стандартноагент ↔ инструменты

Они дополняют друг друга: модель через function calling решает что вызвать, а MCP даёт стандартный способ подключить эти инструменты и переиспользовать их между разными агентами и фреймворками.

Зачем стандарты вообще

  • Надёжность — структурированный вызов вместо хрупкого парсинга текста.
  • Переносимость — один MCP-инструмент работает с разными агентами.
  • Экосистема — общие протоколы позволяют делиться инструментами, а не писать каждый заново.

Итог

  • Function calling: модель возвращает структурированный вызов инструмента вместо текста — без хрупкого парсинга.
  • MCP стандартизирует подключение инструментов к агентам: сервер объявляет, клиент пользуется.
  • Они на разных уровнях и дополняют друг друга: «что вызвать» (function calling) и «как подключить» (MCP).
Проверьте себя
1. Чем function calling лучше ручного парсинга текста ReAct?
AОн быстрее печатает текст
BМодель возвращает структурированный вызов (имя + аргументы), убирая хрупкий парсинг регулярками
CОн не требует описания инструментов
DОн работает без модели
2. Какую задачу решает MCP (Model Context Protocol)?
AКак модель формулирует мысль
BКак обрезать историю диалога
CКак стандартно подключать внешние инструменты и данные к агентам, переносимо между фреймворками
DКак считать стоимость токенов
3. Как соотносятся function calling и MCP?
AЭто одно и то же
BMCP заменяет function calling
CFunction calling работает только без MCP
DОни на разных уровнях: function calling — «что вызвать» (модель↔агент), MCP — «как подключить инструменты» (агент↔инструменты)