DanLevy.net

Ваш ИИ-агент бесполезен без этого

Почему MCP — это USB-C искусственного интеллекта.

Вы создали ИИ-агента. Возможно, даже хорошего. Промпты продуманы, модель быстрая, ответы кажутся естественными.

Но потом кто-то просит его проверить Salesforce на наличие записи о клиенте. Или вытащить последние тикеты Jira. Или поискать во внутренней документации.

И ваш красивый агент просто… не может.

Это проблема интеграции, с которой рано или поздно сталкивается каждая ИИ-платформа. Вашему агенту нужны руки. Ему нужны глаза в ваши реальные бизнес-системы. Без них вы просто запускаете дорогой чат-бот.

Традиционное решение? Написать кастомную API-обёртку для каждого сервиса, с которым хотите соединиться. Прочитать их документацию, обработать их аутентификацию, разобраться с их лимитами запросов, молиться, чтобы они не изменили свои эндпоинты в следующем месяце. Затем повторить для следующего сервиса. И следующего.

Model Context Protocol полностью меняет эти расчёты.


Что на самом деле решает MCP

Подумайте о USB до USB-C. У вас были Mini-USB, Micro-USB, проприетарные разъёмы Apple и ящик, полный кабелей, которые работали только с определёнными устройствами. USB-C не просто добавил новый разъём — он установил стандарт, означающий, что любой кабель может работать с любым устройством.

MCP делает то же самое для интеграций инструментов ИИ.

Вместо написания кастомного кода для подключения вашего агента к Salesforce, HubSpot, GitHub или любому другому сервису, вы реализуете протокол один раз (или скачиваете предсобранный сервер), и любой совместимый с MCP агент может немедленно с ним общаться.

Протокол обрабатывает уровень коммуникации. Вы просто определяете, что делают ваши инструменты и какие данные им нужны.


Настройка нескольких интеграций

Mastra имеет нативную поддержку MCP через свой MCPClient. Вы можете подключать как локальные инструменты (запущенные как дочерние процессы), так и удалённые сервисы (работающие на собственной инфраструктуре).

Вот реалистичная производственная настройка, подключающая Google Maps для маршрутизации, сервис погоды и локальный поиск в Википедии:

src/mastra/mcp/index.ts
import { MCPClient } from '@mastra/mcp';
export const mcpClient = new MCPClient({
servers: {
// Локальный инструмент (Stdio)
wikipedia: {
command: 'npx',
args: ['-y', 'wikipedia-mcp'],
},
// Карты и навигация (Удалённый/HTTP)
googleMaps: {
url: new URL(process.env.GOOGLE_MAPS_MCP_URL!),
requestInit: {
headers: {
Authorization: `Bearer ${process.env.GOOGLE_MAPS_API_KEY}`,
},
},
},
// Интеграция сервиса погоды
weather: {
url: new URL('https://mcp.weatherapi.dev/v1'),
requestInit: {
headers: {
'X-API-Key': process.env.WEATHER_API_KEY!,
},
},
},
},
});

Клиент управляет жизненным циклом соединения, обрабатывает порождение процессов для локальных инструментов и поддерживает HTTP-соединения для удалённых серверов. Вы не трогаете сокеты или stdio напрямую.


Подключение инструментов к агентам

Как только у вас настроен MCP-клиент, передать эти инструменты агенту довольно просто:

src/mastra/agents/navigation-agent.ts
import { Agent } from '@mastra/core/agent';
import { openai } from '@ai-sdk/openai';
import { mcpClient } from '../mcp';
export const navigationDirectionsAgent = new Agent({
id: 'navigation-directions-agent',
name: 'Навигационный ассистент',
instructions: `Вы — полезный навигационный ассистент, который помогает с планированием маршрутов и советами по путешествиям.
- Всегда подтверждайте начальную и конечную точки
- Используйте инструменты Google Maps для поиска оптимальных маршрутов
- Проверяйте погодные условия вдоль маршрута
- Предоставляйте расчётное время в пути и предлагайте альтернативы при плохой погоде
- Включайте релевантные детали, такие как пробки, состояние дорог и точки интереса
- Сохраняйте ответы ясными и полезными для действий`,
model: openai('gpt-5'),
tools: await mcpClient.getTools(), // <--- Вот волшебная строка
});

Когда пользователь спрашивает: “Какой лучший маршрут из Сан-Франциско в Лейк-Тахо, и стоит ли мне беспокоиться о погоде?”

Агент читает доступные определения инструментов, понимает, что у него есть доступ к инструментам маршрутизации Google Maps и прогноза погоды, выполняет их с правильными параметрами и отвечает оптимальным маршрутом плюс текущими погодными условиями по пути.

Вы не написали ни одной строчки кода интеграции с API Google Maps или сервисом погоды.


Аутентификация на пользователя

Здесь легко сделать ошибку безопасности: жёстко прописать учётные данные.

Если вы положите один ключ API Google Maps в переменные окружения и на этом остановитесь, каждый пользователь будет делить одну и ту же квоту и лимиты запросов. Что ещё важнее, если вы используете сервисы, которые хранят пользовательские предпочтения (например, сохранённые места или избранные маршруты), все будут видеть одни и те же данные. Для демо это нормально. В продакшене это — ответственность.

Mastra справляется с этим, позволяя вам создавать MCP-клиенты динамически с пользовательскими учётными данными:

async function handleUserRequest(userPrompt: string, userCredentials: UserCreds) {
// Создать клиент для ЭТОГО конкретного пользователя
const userMcp = new MCPClient({
servers: {
googleMaps: {
url: new URL(process.env.GOOGLE_MAPS_MCP_URL!),
requestInit: {
headers: {
// Конкретный API-ключ или токен пользователя
Authorization: `Bearer ${userCredentials.mapsApiKey}`,
'X-User-ID': userCredentials.userId,
},
},
},
},
});
const agent = mastra.getAgent('navigationDirectionsAgent');
// Инжектить инструменты во время выполнения
const response = await agent.generate(userPrompt, {
toolsets: await userMcp.getToolsets(),
});
return response;
}

Каждый пользователь получает свой изолированный набор инструментов со своими API-квотами и предпочтениями. Сохранённые места Пользователя А остаются приватными, история маршрутов Пользователя Б отдельна. Вот как на практике работают мультитенантные SaaS-агенты.


Создание композитных инструментов

Иногда нужно объединить несколько MCP-инструментов в одну операцию. Возможно, вы хотите спланировать маршрут, учитывающий как трафик в реальном времени, так и погодные условия по пути.

Вы можете обернуть MCP-инструменты в кастомные определения инструментов:

export const smartRouteTool = createTool({
id: 'smart-route-planner',
description: 'Планирует оптимальный маршрут с учётом трафика и погодных условий',
execute: async ({ context, mastra }) => {
// Получить сырые инструменты
const tools = await mcpClient.getTools();
// 1. Получить базовый маршрут из Google Maps
const routeData = await tools.googleMaps_getDirections.execute({
context: {
origin: context.origin,
destination: context.destination
}
});
// 2. Проверить погоду вдоль маршрута
const weatherData = await tools.weather_getForecast.execute({
context: { coordinates: routeData.waypoints }
});
// 3. Вернуть улучшенный маршрут с погодными предупреждениями
return {
...routeData,
weatherAlerts: weatherData.alerts,
recommendation: weatherData.severe ? 'Рассмотрите возможность отложить поездку' : 'Безопасно путешествовать'
};
},
});

Это даёт вам детальный контроль над тем, как именно инструменты взаимодействуют, при этом всё ещё используя протокол MCP для тяжёлой работы.


К чему это ведёт

Писать кастомных API-клиентов для каждого сервиса, с которым должен общаться ваш ИИ-агент, никогда не было устойчивым. Это плохо масштабируется, часто ломается и привязывает вашу платформу к конкретным реализациям.

MCP не решает каждую задачу интеграции — аутентификация всё ещё сложна, лимиты запросов всё ещё имеют значение, и не у каждого сервиса пока есть MCP-сервер. Но он закладывает основу, которая делает создание платформ агентов значительно менее болезненным.

Если вы проектируете ИИ-систему, которой нужно взаимодействовать с внешними сервисами, понимание MCP, вероятно, стоит вашего времени.

Ресурсы

Прочитайте серию

  1. Маршрутизация LLM
  2. Безопасность и гвардрейлы
  3. MCP и интеграции инструментов (Эта статья)
  4. Воркфлоу и память