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. Вы можете подключать как локальные инструменты (запускаемые как дочерние процессы), так и удалённые сервисы (работающие на своей инфраструктуре).

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

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: '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, вероятно, стоит вашего времени.

Ресурсы

Читайте серию

  1. Маршрутизация LLM
  2. Безопасность и защита
  3. MCP и интеграция инструментов (Этот пост)
  4. Рабочие процессы и память