Ваш ИИ-агент бесполезен без этого
Почему 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 для маршрутизации, сервис погоды и локальный поиск в Википедии:
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-клиент, передать эти инструменты агенту довольно просто:
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, вероятно, стоит вашего времени.
Ресурсы
Прочитайте серию
- Маршрутизация LLM
- Безопасность и гвардрейлы
- MCP и интеграции инструментов (Эта статья)
- Воркфлоу и память