Перейти к содержимому
ПереводыHugging Face

MCP Course, юнит 2: MCP-приложение от начала до конца

Перевод юнита 2 курса Hugging Face о MCP: MCP-сервер анализа тональности на Gradio, публикация в Spaces, подключение из Cursor и Continue с локальной моделью, Gradio как MCP-клиент и агент на tiny agents.

Это перевод юнита 2 курса MCP Course. Разделы 2.1–2.6 переведены целиком; раздел 2.7 о запуске на нейропроцессорах AMD (Lemonade Server) кратко пересказан: он нужен только владельцам ноутбуков AMD Ryzen AI. Предыдущий юнит: часть 1 и часть 2. Путеводитель по курсу — здесь.

2.1. Строим MCP-приложение от начала до конца

Заголовок раздела «2.1. Строим MCP-приложение от начала до конца»

Добро пожаловать в юнит 2 курса по MCP!

В этом юните мы с нуля построим полноценное MCP-приложение: создадим сервер на Gradio и подключим к нему несколько клиентов. Такая практика даст вам опыт работы со всей экосистемой MCP.

В этом юните вы:

  • создадите MCP-сервер на встроенной поддержке MCP в Gradio;
  • сделаете инструмент анализа тональности, которым смогут пользоваться модели ИИ;
  • подключитесь к серверу разными клиентами:
    • клиентом на HuggingFace.js;
    • клиентом на Python на основе smolagents;
  • развернёте MCP-сервер в Hugging Face Spaces;
  • протестируете и отладите всю систему.

К концу юнита у вас будет работающее MCP-приложение, которое показывает силу и гибкость протокола.

Прежде чем браться за юнит, убедитесь, что вы:

  • прошли юнит 1 или в общих чертах понимаете понятия MCP;
  • уверенно чувствуете себя и в Python, и в JavaScript/TypeScript;
  • в общих чертах понимаете API и клиент-серверную архитектуру;
  • подготовили среду разработки:
    • Python 3.10+;
    • Node.js 18+;
    • аккаунт Hugging Face (для развёртывания).

(Примечание переводчика: если JavaScript вы не знаете, ничего страшного — везде, где есть вкладки, берите вариант на Python. Node.js всё равно понадобится: через npx запускаются вспомогательные программы вроде mcp-remote.)

Мы построим приложение для анализа тональности текста (sentiment analysis). Оно состоит из трёх основных частей: сервер, клиент и развёртывание.

flowchart LR
subgraph S["Сервер: app.py на Gradio"]
  F["sentiment_analysis()<br/>TextBlob"]
  W["Веб-интерфейс"]
  M["MCP-эндпоинт<br/>/gradio_api/mcp/sse"]
  F --- W
  F --- M
end
subgraph C["Клиенты"]
  C1["Cursor / Continue"]
  C2["Gradio + smolagents"]
  C3["tiny agents<br/>(Python или JS)"]
end
C1 --> M
C2 --> M
C3 --> M
S -. "git push" .-> HF["Hugging Face Spaces"]
Сквозной проект юнита 2 (рисунок переводчика; в оригинале — похожая схема)
  • С помощью gr.Interface Gradio создаёт веб-интерфейс и MCP-сервер.
  • Инструмент анализа тональности реализован на библиотеке TextBlob.
  • Инструмент доступен и по HTTP, и по протоколу MCP.
  • Реализуем клиент на HuggingFace.js
  • или клиент на Python на smolagents.
  • Покажем, как один и тот же сервер работает с разными реализациями клиента.
  • Развернём сервер в Hugging Face Spaces.
  • Настроим клиенты на работу с развёрнутым сервером.

Готовы построить своё первое MCP-приложение от начала до конца? Начнём с подготовки среды разработки и создания MCP-сервера на Gradio.

В этом разделе мы создадим на Gradio MCP-сервер для анализа тональности. Сервер предоставит инструмент анализа тональности, которым смогут пользоваться и люди через веб-интерфейс, и модели ИИ через протокол MCP.

Gradio даёт простой способ создавать MCP-серверы: он автоматически превращает ваши функции на Python в инструменты MCP. Когда вы ставите mcp_server=True в launch(), Gradio:

  1. автоматически превращает ваши функции в инструменты MCP;
  2. отображает компоненты ввода в схемы аргументов инструментов;
  3. определяет формат ответа по компонентам вывода;
  4. настраивает JSON-RPC поверх HTTP+SSE для обмена между клиентом и сервером;
  5. создаёт и веб-интерфейс, и эндпоинт MCP-сервера.

Сначала создадим папку для проекта и установим нужные зависимости:

Окно терминала
mkdir mcp-sentiment
cd mcp-sentiment
python -m venv venv
source venv/bin/activate # в Windows: venv\Scripts\activate
pip install "gradio[mcp]" textblob

(Что делают команды: создают папку проекта и переходят в неё, создают виртуальное окружение Python, включают его и ставят Gradio с поддержкой MCP и TextBlob. Подробно о виртуальных окружениях — в уроке 0.1.2.)

Hugging Face Spaces для сборки Space нужен файл app.py. Поэтому файл на Python должен называться app.py.

Создайте файл app.py с таким кодом:

import json
import gradio as gr
from textblob import TextBlob
def sentiment_analysis(text: str) -> str:
"""
Analyze the sentiment of the given text.
Args:
text (str): The text to analyze
Returns:
str: A JSON string containing polarity, subjectivity, and assessment
"""
blob = TextBlob(text)
sentiment = blob.sentiment
result = {
"polarity": round(sentiment.polarity, 2), # от -1 (негатив) до 1 (позитив)
"subjectivity": round(sentiment.subjectivity, 2), # от 0 (объективно) до 1 (субъективно)
"assessment": "positive" if sentiment.polarity > 0 else "negative" if sentiment.polarity < 0 else "neutral"
}
return json.dumps(result)
# Создаём интерфейс Gradio
demo = gr.Interface(
fn=sentiment_analysis,
inputs=gr.Textbox(placeholder="Enter text to analyze..."),
outputs=gr.Textbox(), # заменили gr.JSON() на gr.Textbox()
title="Text Sentiment Analysis",
description="Analyze the sentiment of text using TextBlob"
)
# Запускаем интерфейс и MCP-сервер
if __name__ == "__main__":
demo.launch(mcp_server=True)

(Докстринг оставлен на английском — из него Gradio делает описание инструмента для модели. Перевод: «Определить тональность текста. Аргументы: text — текст для анализа. Возвращает: строку JSON с полярностью, субъективностью и оценкой». Полярность (polarity) — насколько текст позитивен или негативен, субъективность (subjectivity) — насколько это мнение, а не факт.)

Пройдём по главным частям:

  1. Определение функции.

    • Функция sentiment_analysis принимает текст и возвращает строковое представление словаря JSON.
    • Тональность она определяет с помощью TextBlob.
    • Докстринг критически важен: по нему Gradio строит схему инструмента MCP.
    • Аннотации типов (str и dict) помогают задать схему входа и выхода.
  2. Интерфейс Gradio.

    • gr.Interface создаёт и веб-интерфейс, и MCP-сервер.
    • Функция автоматически становится инструментом MCP.
    • Компоненты ввода и вывода задают схему инструмента.
    • Компонент вывода JSON обеспечивает правильную сериализацию.
  3. MCP-сервер.

    • mcp_server=True включает MCP-сервер.
    • Сервер будет доступен по адресу http://localhost:7860/gradio_api/mcp/sse.
    • Включить его можно и переменной окружения:
      Окно терминала
      export GRADIO_MCP_SERVER=True

(Примечание переводчика: в разборе остались следы старой версии кода. Функция возвращает str, а не dict, и вывод сделан текстовым полем gr.Textbox, а не gr.JSON — сериализацию в строку выполняет json.dumps.)

Запустите сервер командой:

Окно терминала
python app.py

Вы увидите сообщения о том, что запущены и веб-интерфейс, и MCP-сервер. Веб-интерфейс будет доступен по адресу http://localhost:7860, а MCP-сервер — по адресу http://localhost:7860/gradio_api/mcp/sse.

Проверить сервер можно двумя способами.

  1. Веб-интерфейс.

    • Откройте в браузере http://localhost:7860.
    • Введите текст и нажмите «Submit».
    • Вы увидите результат анализа тональности.
  2. Схема MCP.

    • Откройте http://localhost:7860/gradio_api/mcp/schema.
    • Здесь показана схема инструмента MCP, которой будут пользоваться клиенты.
    • Её также можно найти по ссылке «View API» внизу приложения Gradio.

(Пример от переводчика: на текст «I love this course!» TextBlob вернёт положительную полярность и оценку «positive», на «This is terrible.» — отрицательную и «negative». Точные числа зависят от словаря TextBlob.)

  1. Аннотации типов и докстринги.

    • Всегда указывайте аннотации типов у параметров и возвращаемого значения функции.
    • Добавляйте докстринг с блоком «Args:» для каждого параметра.
    • Так Gradio построит точные схемы инструментов MCP.
  2. Строковые входы.

    • Если сомневаетесь, принимайте аргументы как str.
    • Преобразуйте их в нужный тип внутри функции.
    • Так совместимость с MCP-клиентами лучше.
  3. Поддержка SSE.

    • Некоторые MCP-клиенты не поддерживают MCP-серверы на SSE.
    • В таких случаях используйте mcp-remote:
      {
      "mcpServers": {
      "gradio": {
      "command": "npx",
      "args": [
      "mcp-remote",
      "http://localhost:7860/gradio_api/mcp/sse"
      ]
      }
      }
      }
  4. Проблемы с подключением.

    • Если возникают проблемы с подключением, перезапустите и клиент, и сервер.
    • Проверьте, что сервер запущен и доступен.
    • Убедитесь, что схема MCP открывается по ожидаемому адресу.

Чтобы сервер был доступен другим, его можно развернуть в Hugging Face Spaces.

  1. Создайте новый Space на Hugging Face:

    • откройте huggingface.co/spaces;
    • нажмите «New Space»;
    • дайте Space имя (например, «mcp-sentiment»);
    • выберите SDK «Gradio»;
    • нажмите «Create Space».
  2. Создайте файл requirements.txt:

    gradio[mcp]
    textblob
  3. Отправьте код в Space:

    Окно терминала
    git init
    git add app.py requirements.txt
    git commit -m "Initial commit"
    git remote add origin https://huggingface.co/spaces/YOUR_USERNAME/mcp-sentiment
    git push -u origin main

Теперь ваш MCP-сервер доступен по адресу:

https://YOUR_USERNAME-mcp-sentiment.hf.space/gradio_api/mcp/sse

(Примечание переводчика: YOUR_USERNAME — ваш логин на Hugging Face. При git push в качестве пароля вводится токен доступа с правом записи, а не пароль от аккаунта. Работа с git — в уроке 0.1.1.)

MCP-сервер работает — теперь создадим клиенты для работы с ним. В следующих разделах мы:

  1. создадим клиент на HuggingFace.js по мотивам Tiny Agents;
  2. реализуем клиент на Python на основе smolagents;
  3. проверим оба клиента с развёрнутым сервером.

Переходим к первому клиенту!

В этом разделе мы создадим клиенты, которые умеют работать с нашим MCP-сервером, на разных языках программирования. Реализуем и клиент на JavaScript с HuggingFace.js, и клиент на Python со smolagents.

Чтобы MCP-серверы и клиенты хорошо работали, их нужно правильно настроить. Спецификация MCP ещё развивается, поэтому способы настройки могут меняться. Мы сосредоточимся на нынешних лучших практиках.

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

Эти файлы очень простые, понятные и единообразные у основных MCP-хостов.

Стандартный конфигурационный файл MCP называется mcp.json. Вот его базовая структура:

{
"servers": [
{
"name": "MCP Server",
"transport": {
"type": "sse",
"url": "http://localhost:7860/gradio_api/mcp/sse"
}
}
]
}

В этом примере один сервер, который использует транспорт SSE и подключается к локальному серверу Gradio на порту 7860.

(Примечание переводчика: как и в юните 1, это условная схема курса. Настоящие клиенты ждут объект с именами серверов в качестве ключей — mcpServers у Claude Desktop и Cursor, servers у VS Code. Примеры реальных форматов — в переводе юнита 1.)

Для удалённых серверов с транспортом HTTP+SSE в конфигурации указывают URL сервера:

{
"servers": [
{
"name": "Remote MCP Server",
"transport": {
"type": "sse",
"url": "https://example.com/gradio_api/mcp/sse"
}
}
]
}

Такая конфигурация позволяет вашему клиенту с интерфейсом общаться с MCP-сервером Gradio по протоколу MCP и без швов связывает фронтенд с MCP-сервисом.

Работая с MCP-серверами Gradio, клиент с интерфейсом можно настроить на подключение к серверу по протоколу MCP. Вот как.

Создайте файл config.json с такой конфигурацией:

{
"mcpServers": {
"mcp": {
"url": "http://localhost:7860/gradio_api/mcp/sse"
}
}
}

Такая конфигурация позволяет вашему клиенту с интерфейсом общаться с MCP-сервером Gradio по протоколу MCP.

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

Откройте настройки Cursor (Ctrl + Shift + J / Cmd + Shift + J) → вкладка Tools & Integrations → Add Custom MCP:

macOS:

{
"mcpServers": {
"sentiment-analysis": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://YOURUSENAME-mcp-sentiment.hf.space/gradio_api/mcp/sse",
"--transport",
"sse-only"
]
}
}
}

Windows:

{
"mcpServers": {
"sentiment-analysis": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"mcp-remote",
"https://YOURUSENAME-mcp-sentiment.hf.space/gradio_api/mcp/sse",
"--transport",
"sse-only"
]
}
}
}

(В Linux — как в варианте для macOS. YOURUSENAME — опечатка оригинала в слове USERNAME: подставьте свой логин.)

Примечание. С середины 2025 года Cursor поддерживает прямые подключения к удалённым MCP-серверам по HTTP+SSE и OAuth. mcp-remote может не понадобиться, если только вы не работаете со старыми настройками или не столкнулись с особыми проблемами совместимости.

Ранние версии MCP-клиентов, включая Cursor, поддерживали только локальные серверы через транспорт stdio и не умели работать с удалёнными серверами с аутентификацией. mcp-remote появился как обходной путь. Он:

  • работает локально на вашей машине;
  • соединяет Cursor с удалёнными MCP-серверами;
  • незаметно берёт на себя транспорт и аутентификацию;
  • использует привычный формат конфигурационного файла.

Он по-прежнему полезен в некоторых особых случаях, но теперь Cursor поддерживает удалённые MCP-серверы напрямую. Удалённый сервер можно настроить так:

{
"mcpServers": {
"my-server": {
"url": "https://your-mcp-server.hf.space/gradio_api/mcp/sse"
}
}
}

Актуальные инструкции по настройке — в официальной документации Cursor.

После настройки можно просить Cursor пользоваться вашим инструментом анализа тональности — например, анализировать комментарии в коде, отзывы пользователей или описания pull request.

2.4. MCP в ИИ-ассистенте для кода: локальные и открытые модели

Заголовок раздела «2.4. MCP в ИИ-ассистенте для кода: локальные и открытые модели»

В этом разделе мы подключим MCP к локальным и открытым моделям с помощью Continue — инструмента для создания ИИ-ассистентов программиста, который работает с локальными инструментами вроде Ollama.

Continue можно установить из магазина расширений VS Code.

  1. Нажмите Install на странице расширения Continue в Visual Studio Marketplace.
  2. Откроется страница расширения Continue в VS Code — там снова нажмите Install.
  3. Логотип Continue появится на левой боковой панели. Удобнее перенести Continue на правую панель.

(В оригинале — анимация переноса панели Continue вправо.)

Настроив Continue, перейдём к Ollama — скачаем локальные модели.

Есть много способов запустить локальные модели, совместимые с Continue. Три популярных варианта — Ollama, Llama.cpp и LM Studio. Ollama — открытый инструмент, который позволяет легко запускать большие языковые модели (LLM) локально. Llama.cpp — высокопроизводительная библиотека на C++ для запуска LLM, в которую входит и OpenAI-совместимый сервер. LM Studio даёт графический интерфейс для запуска локальных моделей.

С Hugging Face Hub можно получить локальные модели вместе с командами и быстрыми ссылками для всех основных приложений локального инференса.

(В оригинале — скриншот страницы модели на Hub с кнопкой «Use this model» и списком локальных приложений.)

Llama.cpp предоставляет llama-server — лёгкий HTTP-сервер для LLM, совместимый с OpenAI API. Его можно собрать из исходников по инструкции в репозитории Llama.cpp или взять готовую сборку для вашей системы, если она есть. Подробнее — в документации Llama.cpp.

Получив llama-server, можно запустить модель с Hugging Face такой командой:

Окно терминала
llama-server -hf unsloth/Devstral-Small-2505-GGUF:Q4_K_M

Важно использовать модели со встроенной поддержкой вызова инструментов, например Codestral, Qwen и Llama 3.1.

  1. Создайте папку .continue/models в корне рабочей папки проекта.
  2. Добавьте в неё файл с настройками поставщика модели, например local-models.yaml.
  3. Добавьте в него конфигурацию — в зависимости от того, что вы используете: Ollama, Llama.cpp или LM Studio.

Эта конфигурация — для модели llama.cpp, которую раздаёт llama-server. Обратите внимание: поле model должно совпадать с моделью, которую вы раздаёте.

name: Llama.cpp model
version: 0.0.1
schema: v1
models:
- provider: llama.cpp
model: unsloth/Devstral-Small-2505-GGUF
apiBase: http://localhost:8080
defaultCompletionOptions:
contextLength: 8192 # подберите под модель
name: Llama.cpp Devstral-Small
roles:
- chat
- edit

По умолчанию у каждой модели есть максимальная длина контекста — в данном случае 128000 токенов. Наша схема активнее расходует это окно контекста, выполняя несколько запросов к MCP, и должна справляться с большим числом токенов.

(Примечание переводчика: в конфигурациях выше contextLength: 8192 — это сколько контекста Continue будет использовать, а 128 000 — предел самой модели Devstral. Если агент «забывает» начало разговора после нескольких вызовов инструментов, увеличьте contextLength, насколько позволяет память. На одной RTX 4080 модель Devstral Small (24B) в 4 битах помещается целиком, и контекст в 32 000 токенов тоже. Как устроены llama.cpp и квантование Q4_K_M — в уроках 7.2.1 и 7.2.2.)

Инструменты — мощный способ дать моделям связь с внешним миром. Модели они передаются как объект JSON с именем и схемой аргументов. Например, инструмент read_file с аргументом filepath даёт модели возможность запросить содержимое конкретного файла.

(В оригинале — схема автономного агента: модель, инструменты, разрешения пользователя и цикл вызовов.)

Вот как агент использует инструменты:

  1. В режиме агента доступные инструменты отправляются вместе с чат-запросами user.
  2. Модель может включить в свой ответ вызов инструмента.
  3. Пользователь даёт разрешение. Этот шаг пропускается, если для инструмента установлена политика Automatic.
  4. Continue вызывает инструмент — своими встроенными средствами или через MCP-сервер, который этот инструмент предоставляет.
  5. Continue отправляет результат обратно модели.
  6. Модель отвечает — возможно, новым вызовом инструмента, и всё начинается снова с шага 2.

(Это тот же цикл «мысль → действие → наблюдение», что и в уроке 8.3.1.)

Continue поддерживает многих поставщиков локальных моделей. Для разных задач можно использовать разные модели или переключаться между ними по мере надобности. Этот раздел посвящён локальным решениям, но Continue работает и с популярными поставщиками вроде OpenAI, Anthropic, Microsoft/Azure, Mistral и другими. Можно подключить и собственного поставщика моделей.

Всё настроено — добавим существующий MCP-сервер. Вот быстрый пример подключения нового MCP-сервера к ассистенту:

  1. Создайте папку .continue/mcpServers в корне рабочей папки проекта.
  2. Добавьте в неё файл playwright-mcp.yaml.
  3. Запишите в playwright-mcp.yaml следующее и сохраните.
name: Playwright mcpServer
version: 0.0.1
schema: v1
mcpServers:
- name: Browser search
command: npx
args:
- "@playwright/mcp@latest"

Теперь проверьте MCP-сервер таким запросом:

1. Using playwright, navigate to https://news.ycombinator.com.
2. Extract the titles and URLs of the top 4 posts on the homepage.
3. Create a file named hn.txt in the root directory of the project.
4. Save this list as plain text in the hn.txt file, with each line containing the title and URL separated by a hyphen.
Do not output code or instructions—just complete the task and confirm when it is done.

(Перевод запроса: «1. С помощью playwright открой https://news.ycombinator.com. 2. Извлеки заголовки и URL четырёх верхних постов на главной. 3. Создай файл hn.txt в корне проекта. 4. Сохрани этот список простым текстом в hn.txt: в каждой строке заголовок и URL через дефис. Не выводи код или инструкции — просто выполни задачу и подтверди, когда закончишь». Запрос можно писать и по-русски, если модель хорошо понимает русский.)

В результате в текущей рабочей папке появится файл hn.txt.

(В оригинале — скриншот: Continue вызывает инструменты Playwright и создаёт файл.)

Соединив Continue с локальными моделями вроде Llama 3.1 и MCP-серверами, вы получили мощный рабочий процесс: код и данные остаются у вас, а возможности ИИ — передовые.

Такая схема позволяет настраивать ИИ-ассистента специальными инструментами — от автоматизации браузера до работы с файлами, — и всё это целиком на вашей машине. Готовы поднять свой рабочий процесс на новый уровень? Начните экспериментировать с разными MCP-серверами со страницы MCP в Continue Hub и узнайте, как локальный ИИ может изменить вашу работу с кодом.

В прошлом разделе мы создали MCP-сервер на Gradio и подключились к нему MCP-клиентом. В этом разделе мы посмотрим, как использовать Gradio в роли MCP-клиента, который подключается к MCP-серверу.

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

Подключимся к учебному MCP-серверу, который уже работает на Hugging Face. Для примера возьмём вот этот — Space с набором инструментов MCP.

from smolagents.mcp_client import MCPClient
with MCPClient(
{"url": "https://abidlabs-mcp-tool-http.hf.space/gradio_api/mcp/sse", "transport": "sse",}
) as tools:
# Инструменты удалённого сервера доступны здесь
print("\n".join(f"{t.name}: {t.description}" for t in tools))

Вывод:

prime_factors: Compute the prime factorization of a positive integer.
generate_cheetah_image: Generate a cheetah image.
image_orientation: Returns whether image is portrait or landscape.
sepia: Apply a sepia filter to the input image.

(Четыре инструмента: разложение положительного целого числа на простые множители, генерация картинки с гепардом, определение ориентации изображения (портретная или альбомная) и фильтр «сепия».)

Отлично, вы подключились к учебному MCP-серверу. Теперь воспользуемся им в приложении.

Сначала установим библиотеки smolagents, Gradio и mcp-client, если их ещё нет:

Окно терминала
pip install "smolagents[mcp]" "gradio[mcp]" mcp fastmcp

Теперь импортируем нужные библиотеки и создадим простой интерфейс Gradio, который подключается к MCP-серверу через MCP-клиент.

import gradio as gr
import os
from mcp import StdioServerParameters
from smolagents import InferenceClientModel, CodeAgent, ToolCollection, MCPClient

Затем подключимся к MCP-серверу и получим инструменты, с помощью которых будем отвечать на вопросы.

mcp_client = MCPClient(
{"url": "https://abidlabs-mcp-tool-http.hf.space/gradio_api/mcp/sse", "transport": "sse",} # Это MCP-клиент, который мы создали в прошлом разделе
)
tools = mcp_client.get_tools()

(Примечание переводчика: комментарий в оригинале неточен — по этому адресу работает учебный MCP-сервер, а клиент создаём мы сами в этой строке. Импорты StdioServerParameters и ToolCollection в коде дальше не используются.)

Инструменты есть — создадим простого агента, который отвечает на вопросы с их помощью. Пока возьмём простую InferenceClientModel и модель по умолчанию из smolagents.

Важно передать InferenceClientModel ваш ключ API. Токен можно получить в аккаунте Hugging Face (подробнее здесь) и задать в переменной окружения HF_TOKEN.

model = InferenceClientModel(token=os.getenv("HF_TOKEN"))
agent = CodeAgent(tools=[*tools], model=model)

Теперь создадим простой интерфейс Gradio, в котором агент отвечает на вопросы.

demo = gr.ChatInterface(
fn=lambda message, history: str(agent.run(message)),
type="messages",
examples=["Prime factorization of 68"],
title="Agent with MCP Tools",
description="This is a simple agent that uses MCP tools to answer questions."
)
demo.launch()

Вот и всё! Мы создали простой интерфейс Gradio, который через MCP-клиент подключается к MCP-серверу и отвечает на вопросы.

(В оригинале здесь встроено работающее демо — Space mcp-course/unit2-gradio-client. Пример вопроса «Prime factorization of 68» — «Разложи 68 на простые множители»; правильный ответ: 68 = 2 × 2 × 17.)

Вот полный пример использования MCP-клиента в Gradio:

import gradio as gr
import os
from smolagents import InferenceClientModel, CodeAgent, MCPClient
try:
mcp_client = MCPClient(
{"url": "https://abidlabs-mcp-tool-http.hf.space/gradio_api/mcp/sse", "transport": "sse",}
)
tools = mcp_client.get_tools()
model = InferenceClientModel(token=os.getenv("HUGGINGFACE_API_TOKEN"))
agent = CodeAgent(tools=[*tools], model=model, additional_authorized_imports=["json", "ast", "urllib", "base64"])
demo = gr.ChatInterface(
fn=lambda message, history: str(agent.run(message)),
type="messages",
examples=["Analyze the sentiment of the following text 'This is awesome'"],
title="Agent with MCP Tools",
description="This is a simple agent that uses MCP tools to answer questions.",
)
demo.launch()
finally:
mcp_client.disconnect()

Обратите внимание: мы закрываем MCP-клиент в блоке finally. Это важно, потому что MCP-клиент — долгоживущий объект, и его нужно закрыть при выходе из программы.

Чтобы приложение было доступно другим, его можно развернуть в Hugging Face Spaces — так же, как в прошлом разделе. Чтобы развернуть MCP-клиент на Gradio в Hugging Face Spaces:

  1. Создайте новый Space на Hugging Face:

    • откройте huggingface.co/spaces;
    • нажмите «Create new Space»;
    • выберите SDK «Gradio»;
    • дайте Space имя (например, «mcp-client»).
  2. Укажите в коде URL MCP-сервера:

    mcp_client = MCPClient(
    {"url": "https://abidlabs-mcp-tool-http.hf.space/gradio_api/mcp/sse", "transport": "sse"}
    )
  3. Создайте файл requirements.txt:

    gradio[mcp]
    smolagents[mcp]
  4. Отправьте код в Space:

    Окно терминала
    git init
    git add app.py requirements.txt
    git commit -m "Initial commit"
    git remote add origin https://huggingface.co/spaces/YOUR_USERNAME/mcp-client
    git push -u origin main

Примечание: при добавлении remote origin смотрите password-git-deprecation — как подключаться с токеном доступа вместо пароля.

(Примечание переводчика: токен для модели не кладите в код — в настройках Space есть раздел «Secrets», значения оттуда приложение получает как переменные окружения.)

В этом разделе мы разобрали, как использовать Gradio в роли MCP-клиента, который подключается к MCP-серверу, и как развернуть такой клиент в Hugging Face Spaces.

Мы построили MCP-серверы на Gradio и научились создавать MCP-клиенты. Завершим наше сквозное приложение агентом, который без усилий работает с нашим инструментом анализа тональности. Раздел опирается на проект Tiny Agents, который показывает предельно простой способ разворачивать MCP-клиенты, подключающиеся к сервисам вроде нашего сервера тональности на Gradio.

В этом последнем упражнении юнита 2 мы покажем, как реализовать MCP-клиенты на TypeScript (JS) и на Python, которые умеют общаться с любым MCP-сервером, включая наш сервер анализа тональности на Gradio. Так замыкается весь путь нашего MCP-приложения: от MCP-сервера на Gradio с инструментом тональности до гибкого агента, который пользуется этим инструментом наряду с другими возможностями.

(В оригинале — шуточная картинка-мем о tiny agents, автор — https://x.com/adamdotdev.)

Установим пакеты, нужные для Tiny Agents.

(В оригинале после этой подсказки фрагмент конфигурации пропущен; он такой же, как в разделе 2.2 «Советы при проблемах».)

Tiny Agent может запускать MCP-серверы как программы командной строки. Для этого понадобится установить npm и запускать сервер через npx. Это нужно и для Python, и для JavaScript.

Установим npx через npm. Если npm у вас не установлен, посмотрите документацию npm.

Окно терминала
# устанавливаем npx
npm install -g npx

(Как и в юните 1: обычно npx уже есть вместе с npm.)

Затем установим пакет mcp-remote.

Окно терминала
npm i mcp-remote

Для JavaScript нужно установить пакет tiny-agents.

Окно терминала
npm install @huggingface/tiny-agents

Повторим пример из юнита 1 и создадим простого Tiny Agent. Tiny Agents создают MCP-клиенты из командной строки по конфигурационным файлам JSON.

Создадим проект с простым Tiny Agent.

Окно терминала
mkdir my-agent
touch my-agent/agent.json
cd my-agent

Файл JSON будет выглядеть так:

{
"model": "Qwen/Qwen2.5-72B-Instruct",
"provider": "novita",
"servers": [
{
"type": "stdio",
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:7860/gradio_api/mcp/sse"
]
}
]
}

Запустим агента командой:

Окно терминала
npx @huggingface/tiny-agents run agent.json

Это простой Tiny Agent, который подключается к нашему MCP-серверу на Gradio. В нём есть модель, провайдер и конфигурация сервера.

ПолеОписание
modelоткрытая модель, на которой работает агент
providerпровайдер инференса для агента
serversсерверы, которыми пользуется агент. Для нашего MCP-сервера на Gradio используем mcp-remote

Теперь, когда мы понимаем и Tiny Agents, и MCP-серверы на Gradio, посмотрим, как они работают вместе! Красота MCP в том, что он даёт агентам стандартный способ работать с любым MCP-совместимым сервером, включая наш сервер анализа тональности на Gradio из прошлых разделов.

Чтобы подключить Tiny Agent к серверу анализа тональности на Gradio, который мы построили в этом юните, достаточно добавить его в список серверов. Вот как изменить конфигурацию агента:

const agent = new Agent({
provider: process.env.PROVIDER ?? "novita",
model: process.env.MODEL_ID ?? "Qwen/Qwen2.5-72B-Instruct",
apiKey: process.env.HF_TOKEN,
servers: [
// ... уже подключённые серверы ...
{
command: "npx",
args: [
"mcp-remote",
"http://localhost:7860/gradio_api/mcp/sse" // ваш MCP-сервер на Gradio
]
}
],
});

Теперь агент может пользоваться инструментом анализа тональности наряду с другими инструментами! Например, он может:

  1. прочитать текст из файла с помощью сервера файловой системы;
  2. определить его тональность с помощью нашего сервера на Gradio;
  3. записать результат обратно в файл.

(Примечание переводчика: создать объект Agent мало — его нужно ещё запустить. В Python-версии huggingface_hub агент асинхронный: сначала await agent.load_tools(), затем ответы читаются из agent.run("ваш вопрос") в цикле async for. Точный порядок вызовов — в документации Tiny Agents и в блог-посте о Python-версии; для первого знакомства хватит команды tiny-agents run agent.json.)

Когда вы развернёте MCP-сервер на Gradio в Hugging Face Spaces, поменяйте URL сервера в конфигурации агента на адрес вашего Space:

{
command: "npx",
args: [
"mcp-remote",
"https://YOUR_USERNAME-mcp-sentiment.hf.space/gradio_api/mcp/sse"
]
}

(В настоящем JSON ключи пишутся в кавычках: "command", "args". В оригинале фрагмент взят из кода на TypeScript.)

Так агент сможет пользоваться инструментом анализа тональности откуда угодно, а не только локально!

Итог: наше MCP-приложение от начала до конца

Заголовок раздела «Итог: наше MCP-приложение от начала до конца»

В этом юните мы прошли путь от основ MCP до полноценного приложения:

  1. создали MCP-сервер на Gradio с инструментом анализа тональности;
  2. научились подключаться к нему MCP-клиентами;
  3. построили tiny agent на TypeScript и Python, который работает с нашим инструментом.

Это показывает силу Model Context Protocol: мы создаём специализированные инструменты в знакомых фреймворках (например, Gradio), открываем их через стандартный интерфейс (MCP), и агенты без усилий пользуются ими наряду с другими возможностями.

Построенная схема позволяет агенту:

  • подключаться к нескольким поставщикам инструментов;
  • динамически узнавать доступные инструменты;
  • пользоваться нашим собственным инструментом анализа тональности;
  • сочетать его с другими возможностями — доступом к файловой системе, работой в браузере.

Именно такой модульный подход делает MCP таким мощным для построения гибких приложений ИИ.

2.7. Локальные Tiny Agents на NPU и встроенной графике AMD (пересказ)

Заголовок раздела «2.7. Локальные Tiny Agents на NPU и встроенной графике AMD (пересказ)»

Этот раздел написан совместно с AMD и рассчитан на компьютеры с процессорами AMD Ryzen AI и видеокартами Radeon, поэтому мы передаём его кратко.

  • Lemonade Server — программа для локального запуска моделей на нейропроцессоре (NPU) и встроенной графике AMD. Под Windows ставится установщиком, под Linux — пакетом lemonade-sdk (курс фиксирует версию 8.0.3) и запускается командой lemonade-server-dev serve. Ускорение на GPU идёт через движок llama.cpp с Vulkan, ускорение на NPU — только для Ryzen AI 300 под Windows.
  • Lemonade Server даёт OpenAI-совместимый эндпоинт http://localhost:8000/api/, поэтому агент из раздела 2.6 переключается на него одной строкой: "endpointUrl": "http://localhost:8000/api/" и "model": "Qwen3-8B-GGUF"; сервер тональности на Gradio подключается так же, через mcp-remote.
  • Вторая часть раздела — ассистент для конфиденциальных данных, который целиком работает на вашем компьютере: агент на маленькой модели Jan-nano (4B, файл GGUF в квантовании Q4_0) получает MCP-сервер Desktop Commander (доступ к файлам, терминалу и редактированию кода) и помогает оценивать резюме кандидатов на вакансию. Вы создаёте описание вакансии job_description.md и папку candidates с резюме, а агент читает их и пишет выводы — данные никуда не уходят с машины.

На вашей машине с NVIDIA то же самое делается без Lemonade: поднимите модель в vLLM или llama.cpp и укажите её адрес в endpointUrl. Помните, что сервер вроде Desktop Commander даёт модели доступ к терминалу и файлам — запускайте такие эксперименты в отдельной папке или контейнере и не давайте агенту права на запись туда, где лежит важное (урок 8.3.4 — о том, почему это опасно).

EnglishРусский
end-to-end applicationприложение от начала до конца, сквозной проект
sentiment analysis, polarity, subjectivityанализ тональности, полярность, субъективность
deploy, Spaceразвернуть, Space (приложение на Hugging Face)
endpointэндпоинт (адрес, по которому отвечает сервер)
bridge (mcp-remote)посредник, мост
coding assistantИИ-ассистент программиста
local model, inference serverлокальная модель, сервер инференса
tool policy: Automaticполитика инструмента: вызывать без подтверждения
code agent, authorized importsагент кода, разрешённые импорты
NPU (neural processing unit)нейропроцессор