Протоколы инструментов: 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Это одно и то же
BОни на разных уровнях: function calling — «что вызвать» (модель↔агент), MCP — «как подключить инструменты» (агент↔инструменты)
CMCP заменяет function calling
DFunction calling работает только без MCP
Поддержать проект