Ваш ИИ-агент бесполезен без этого
Почему 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. Вы можете подключать как локальные инструменты (запускаемые как дочерние процессы), так и удалённые сервисы (работающие на своей инфраструктуре).
Вот реалистичная production-настройка, подключающая Google Maps для маршрутизации, погодный сервис и локальный поиск по Wikipedia:
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: 'Navigation & Directions Assistant', instructions: `You are a helpful navigation assistant that provides route planning and travel advice. - Always confirm the start and destination locations - Use Google Maps tools to find optimal routes - Check weather conditions along the route - Provide estimated travel times and suggest alternatives if weather is poor - Include relevant details like traffic, road conditions, and points of interest - Keep responses clear and actionable`, model: openai('gpt-5'), tools: await mcpClient.getTools(), // <--- Это та самая магическая строка});Когда пользователь спрашивает: «Какой лучший маршрут от Сан-Франциско до озера Тахо, и стоит ли мне беспокоиться о погоде?»
Агент читает доступные определения инструментов, понимает, что у него есть доступ к маршрутизации Google Maps и инструментам прогноза погоды, выполняет их с правильными параметрами и отвечает оптимальным маршрутом плюс текущими погодными условиями вдоль пути.
Вы не написали ни строчки кода Google Maps API или интеграции с погодным сервисом.
Аутентификация для каждого пользователя
Есть одна ошибка безопасности, которую легко совершить: жёстко закодированные учётные данные.
Если вы положите один ключ Google Maps API в переменные окружения и назовёте это готовым решением, все пользователи будут делить одну квоту и одни лимиты запросов. Более того, если вы используете сервисы, которые хранят пользовательские настройки (например, сохранённые адреса или избранные маршруты), все будут видеть одни и те же данные. Для демо это работает. В production это проблема.
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 и интеграция инструментов (Этот пост)
- Рабочие процессы и память