Під час підключення AI-агента до зовнішніх інструментів і API є два основні підходи: використовувати Model Context Protocol (MCP) як абстрактний шар або викликати API напряму через HTTP. Обидва підходи працюють. Вони мають різні компроміси щодо гнучкості, складності, продуктивності та переносимості.
У цій статті порівнюються два підходи за допомогою конкретних прикладів коду, аналізу затримки та схеми ухвалення рішень для вибору між ними.
Два підходи
Пряма HTTP-інтеграція
AI-застосунок (або його бекенд) викликає зовнішні API напряму за допомогою стандартних HTTP-запитів. Розробник пише код для формування запитів, обробки автентифікації, розбору відповідей і передавання результатів назад до LLM.
┌──────┐ ┌────────┐ ┌─────────────┐
│ User │────▶│ AI App │──── HTTP request ─────▶│ Weather API │
└──────┘ │ │◀─── JSON response ─────│ │
│ │ └─────────────┘
│ │── result as context ──▶ LLM
│ │◀── formatted answer ───
└───┬────┘
│
▼
User gets answer
MCP-інтеграція
AI-застосунок підключається до MCP-сервера, який обгортає зовнішній API. Застосунок використовує протокол MCP, щоб виявляти доступні інструменти, викликати їх за назвою та отримувати результати. MCP-сервер виконує фактичні HTTP-виклики до зовнішнього API.
┌──────┐ ┌───────────────────┐ ┌────────────┐ ┌──────────┐
│ User │────▶│ AI App/MCP Client │── JSON-RPC ─▶│ MCP Server │────▶│ HTTP API │
└──────┘ │ │◀─ JSON-RPC ──│ │◀────│ │
│ │ └────────────┘ └──────────┘
│ │── result as context ──▶ LLM
│ │◀── formatted answer ───
└─────────┬─────────┘
│
▼
User gets answer
Ключова відмінність: за прямого HTTP AI-застосунок володіє кодом інтеграції з API. За MCP ним володіє MCP-сервер, а AI-застосунок просто викликає інструменти за назвою.
Ви можете мати MCP-частину цієї схеми без створення сервера: Quickchat AI розміщує streamable-HTTP MCP-сервер для кожного AI Agent, а перетворення вашого агента на MCP-сервер зводиться до вставлення одного URL в AI-застосунок.
Порівняння коду
Порівняймо обидва підходи на практичному прикладі: отримання репозиторіїв користувача GitHub.
Пряма HTTP-інтеграція
import httpx
async def get_user_repos(username: str, token: str) -> list[dict]:
"""Отримати репозиторії користувача GitHub."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"https://api.github.com/users/{username}/repos",
headers={
"Authorization": f"Bearer {token}",
"Accept": "application/vnd.github.v3+json",
"X-GitHub-Api-Version": "2022-11-28"
},
params={"sort": "updated", "per_page": 10}
)
response.raise_for_status()
repos = response.json()
return [
{
"name": r["name"],
"description": r["description"],
"stars": r["stargazers_count"],
"language": r["language"],
"url": r["html_url"]
}
for r in repos
]
Щоб інтегрувати це з LLM, вам також потрібно:
- Визначення інструмента у форматі, якого очікує LLM (схема OpenAI function calling, схема Claude tool use тощо)
- Код для розбору виклику інструмента від LLM, запуску
get_user_reposі вставлення результату назад у розмову - Обробка помилок для HTTP-збоїв, лімітів запитів і завершення строку дії автентифікації
MCP-сервер
from mcp.server.fastmcp import FastMCP
import httpx
mcp = FastMCP("github-server")
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
@mcp.tool()
async def get_user_repos(username: str) -> str:
"""Отримати 10 найнещодавніше оновлених репозиторіїв користувача GitHub.
Args:
username: ім'я користувача GitHub для пошуку
"""
async with httpx.AsyncClient() as client:
response = await client.get(
f"https://api.github.com/users/{username}/repos",
headers={
"Authorization": f"Bearer {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3+json",
"X-GitHub-Api-Version": "2022-11-28"
},
params={"sort": "updated", "per_page": 10}
)
response.raise_for_status()
repos = response.json()
lines = []
for r in repos:
stars = r["stargazers_count"]
lang = r["language"] or "невідомо"
lines.append(f"- {r['name']} ({lang}, {stars} зірок): {r['description'] or 'Немає опису'}")
return "\n".join(lines)
if __name__ == "__main__":
mcp.run(transport="stdio")
Версія з MCP інкапсулює виклик API, автентифікацію і форматування відповіді всередині сервера. Будь-який MCP-сумісний клієнт може використовувати цей інструмент, нічого не знаючи про GitHub API.
Що змінюється для AI-застосунку
| Concern | Direct HTTP | MCP |
|---|---|---|
| Визначення інструмента | Записується у нативному форматі LLM (схема OpenAI тощо) | Автоматично генерується з MCP-сервера |
| Автентифікація | Керується AI-застосунком | Керується MCP-сервером |
| Розбір відповіді | AI-застосунок витягує і форматує дані | MCP-сервер повертає попередньо відформатований результат |
| Обробка помилок | AI-застосунок обробляє HTTP-помилки | MCP-сервер обробляє помилки, повертає структуровані повідомлення про помилки |
| Додавання нового інструмента | Написати новий код в AI-застосунку | Підключитися до нового MCP-сервера (або додати інструмент до наявного сервера) |
| Зміна LLM | Переписати визначення інструментів для нового формату LLM | Зміни не потрібні |
Порівняння продуктивності
MCP додає шар між AI-застосунком і зовнішнім API. Цей шар має вартість.
Затримка
Для stdio transport (локальні MCP-сервери) накладні витрати мінімальні: запуск процесу під час старту (одноразово, зазвичай менше 100ms) і міжпроцесна взаємодія для кожного повідомлення (менше мілісекунди на сучасних системах). На практиці виклик зовнішнього API домінує в загальній затримці.
Для remote MCP servers (Streamable HTTP або SSE) додається один HTTP round-trip між клієнтом і MCP-сервером, а також HTTP round-trip MCP-сервера до зовнішнього API. Якщо MCP-сервер і зовнішній API розміщені поруч, ці накладні витрати малі (одиниці мілісекунд). Якщо вони в різних регіонах, ефект накопичується. Втім, транспорт рідко є тим, що відчуває користувач: під час створення агента довідкового центру на hosted MCP server від Notion 248 викликів інструментів у середньому тривали 2.7 секунди кожен, майже весь час припадав на пошук у Notion і рендеринг сторінок, а не на проміжний перехід.
| Setup | Approximate added latency |
|---|---|
| Локальний MCP-сервер (stdio) | < 1ms на виклик інструмента |
| Віддалений MCP-сервер (той самий регіон, що й API) | 1-5ms на виклик інструмента |
| Віддалений MCP-сервер (інший регіон, ніж API) | 10-50ms на виклик інструмента |
Для більшості сценаріїв використання AI-агентів, де інференс LLM триває 500ms-5s, накладні витрати MCP незначні.
Керування з’єднаннями
Прямий HTTP: ваш застосунок керує з’єднаннями з кожним зовнішнім API. Це означає обробку пулів з’єднань, логіки повторних спроб і обмеження частоти запитів для кожного API.
MCP: ваш застосунок керує одним з’єднанням на кожен MCP-сервер. Сервер керує з’єднанням із зовнішнім API. Якщо у вас 10 інструментів, розподілених між 3 MCP-серверами, ви керуєте 3 з’єднаннями замість 10.
Коли використовувати MCP
Кілька інтеграцій з інструментами
Якщо вашому AI-застосунку потрібно підключитися до 5+ зовнішніх сервісів, MCP зменшує обсяг інтеграційної роботи. Замість написання та підтримки власних API-клієнтів для кожного сервісу ви підключаєтеся до MCP-серверів (багато з них доступні як open-source проєкти).
Переносимість між AI-платформами
Якщо ви створюєте MCP-сервери для своїх інструментів, ці сервери працюють із будь-яким MCP-клієнтом: Claude Desktop, Cursor, Windsurf, власними застосунками та платформами на кшталт Quickchat AI. За прямого HTTP вам довелося б повторно реалізувати визначення інструментів для формату кожної платформи.
Динамічне виявлення інструментів
MCP підтримує виявлення інструментів під час виконання через tools/list. AI-застосунок може підключитися до сервера і дізнатися, які інструменти доступні, без жорстко закодованої конфігурації. Це корисно для сценаріїв, де інструменти часто змінюються або налаштовуються користувачем.
Розділення відповідальності
Якщо різні команди володіють різними інструментами, MCP забезпечує чисту межу. Команда, яка володіє інтеграцією з Salesforce, створює і підтримує MCP-сервер Salesforce. Команда AI-застосунку підключається до нього без потреби розуміти API Salesforce. Оновлення API Salesforce обробляються в MCP-сервері без змін в AI-застосунку.
Коли використовувати прямий HTTP
Одна або дві інтеграції
Якщо вашому AI-агенту потрібно викликати лише один API (наприклад, пошук у базі даних), накладні витрати на запуск MCP-сервера зайві. Прямий HTTP-виклик простіший і має менше рухомих частин.
Також вам не потрібно писати запит вручну. Конструктор API Action простою англійською читає задокументований REST API, генерує метод, URL, параметри та опис, а потім дає змогу перевірити реальну відповідь перед увімкненням.
Максимальний контроль над запитами
MCP-сервери абстрагують HTTP-деталі. Якщо вам потрібен точний контроль над формуванням запиту (певні заголовки, параметри запиту, підписування запиту або нестандартна автентифікація), прямий HTTP дає цей контроль без боротьби з абстрактним шаром.
Операції, чутливі до затримки
Якщо важлива кожна мілісекунда (наприклад, голосові агенти в реальному часі, де виклики інструментів мають завершуватися в межах суворого часового бюджету), вилучення MCP-шару усуває один перехід.
HTTP-виклики не для AI
Якщо HTTP-виклик не запускається AI-агентом (наприклад, бекенд cron job, що синхронізує дані), MCP не має значення. MCP спеціально розроблений для взаємодії AI з інструментами. Звичайні бекенд-сервіси мають використовувати звичайні HTTP-клієнти.
Гібридний підхід
Багато продакшн-систем використовують обидва підходи. Патерн:
- MCP для інтеграцій з інструментами, які AI-агент викликає під час розмов (пошук у CRM, створення tickets, запити до knowledge base)
- Прямий HTTP для внутрішніх бекенд-операцій, webhooks і взаємодії system-to-system
Так Quickchat AI працює всередині. Платформа підтримує як HTTP Request Actions (прямі API-виклики з шаблонізацією параметрів), так і Remote MCP Actions (з’єднання із зовнішніми MCP-серверами). Ви обираєте правильний підхід для кожної інтеграції:
| Integration type | Recommended approach |
|---|---|
| Простий API-виклик із відомими параметрами | HTTP Request Action |
| Складна інтеграція з кількома пов’язаними інструментами | Remote MCP Action |
| Сторонній сервіс із наявним MCP-сервером | Remote MCP Action |
| Внутрішній API з власною автентифікацією | HTTP Request Action |
| Інструмент, що налаштовується користувачем | Remote MCP Action |
Докладне порівняння того, як це працює на практиці, включно з відмінностями між GPT Actions від OpenAI і MCP, див. у статті GPT Actions vs MCP.
Схема ухвалення рішень
Використовуйте цю блок-схему для вибору:
- Чи AI-агент викликає інструмент? Якщо ні (це бекенд-операція), використовуйте прямий HTTP.
- Скільки зовнішніх інструментів вам потрібно? Якщо 1-2, прямий HTTP простіший. Якщо 3+, розгляньте MCP.
- Чи існує готовий MCP-сервер для сервісу? Якщо так, його використання заощадить час розробки.
- Чи потрібно, щоб інтеграція працювала на кількох AI-платформах? Якщо так, MCP забезпечує переносимість.
- Чи є затримка критичною (бюджет менше 100ms для викликів інструментів)? Якщо так, виміряйте накладні витрати MCP і ухваліть рішення відповідно.
- Чи різні команди володіють різними інтеграціями? Якщо так, модель MCP «один сервер на інтеграцію» допомагає з межами відповідальності.
На практиці, якщо ви створюєте AI-агента, якому потрібно взаємодіяти із зовнішніми сервісами, MCP дедалі частіше є типовим вибором. Екосистема готових серверів достатньо велика, щоб часто можна було почати без написання будь-якого серверного коду.
Додаткова література
- Підключіть свого AI Agent до Remote MCP Server: Дайте агенту живі інструменти, крок за кроком
- Як працює Model Context Protocol. Пояснення MCP: Вступ до MCP
- GPT Actions vs MCP: Порівняння з підходом OpenAI
- Специфікація MCP: Офіційна специфікація протоколу
- HubSpot AI Actions: Приклад HTTP-based AI actions на практиці
- Інцидент OpenAI Hugging Face, що насправді сталося: Покроковий розбір інциденту і що насправді означає hacking