Мы находимся на пороге нового типа программного обеспечения. В своём недавнем keynote на YC Startup School Андрей Карпати описал Software 3.0 — мир, в котором естественный язык становится основным интерфейсом для программирования, а большие языковые модели выступают одновременно вычислительными движками и автономными соавторами.
В отличие от Software 1.0, где разработчики писали явные инструкции, или Software 2.0, где нейросети обучались паттернам на данных, Software 3.0 работает на естественном языке. Наши промпты становятся программами, а LLM переводят наши намерения в исполняемое поведение.
В этом руководстве мы создадим MCP-сервер, предоставляющий удалённый доступ к песочнице Novita AI, в котором наш ИИ-агент сможет безопасно выполнять код. Сам агент будет создан с помощью библиотеки mcp-use, которая также автоматически управляет взаимодействием с MCP-сервером.
Что такое MCP (Model Context Protocol)?
Model Context Protocol (MCP) — это открытый стандарт, разработанный Anthropic для взаимодействия ИИ-моделей с внешними сервисами, инструментами и источниками данных. Представьте его как «USB-C для ИИ»: он предоставляет стандартный интерфейс между агентами и внешним миром.
Три ключевых компонента:
- Инструменты: Вызываемые функции / API, которые предоставляет сервер (например, веб-браузинг, выполнение кода).
- Ресурсы: Внешние данные, предоставляемые сервером, обычно предназначенные для контекста ИИ-агента (например, файлы, метаданные, наборы данных).
- Промпты: Эти подробные инструкции предназначены для управления поведением агента при взаимодействии с вышеперечисленными инструментами или ресурсами.
Чтобы получить более подробную информацию о MCP, его архитектуре и компонентах, ознакомьтесь с нашей статьёй о создании первого MCP-сервера
Почему MCP важен для интеграции ИИ-инструментов
MCP обеспечивает двустороннюю связь между ИИ-агентами и внешними системами. Это позволяет легко «подключать» LLM к кастомным инструментам, сокращая объём работ по интеграции и минимизируя риск ошибок.
Знакомство с библиотекой mcp-use

Библиотека mcp-use — это Python-пакет, который упрощает создание ИИ-агентов, взаимодействующих с MCP-серверами. Она управляет созданием агента и взаимодействием с MCP-серверами для доступа к внешним инструментам и источникам данных, позволяя вам сосредоточиться только на логике вашего приложения.
Обзор Novita AI Sandbox и Model API

Что такое песочница и почему это важно
Песочница — это безопасная изолированная среда выполнения, в которой недоверенный код может быть запущен без влияния на хост-систему. По сути это лёгкий виртуальный компьютер для вашего ИИ-агента, в котором можно выполнять код, запускать команды, создавать файлы и т.д.
Novita AI предоставляет эту песочницу в облаке, чтобы ваш агент мог быстро получать к ней доступ по требованию, с гибкой поминутной тарификацией в зависимости от использованных ресурсов.
Ключевые особенности песочницы Novita:
- Безопасная изоляция: Каждая песочница получает собственную изолированную файловую систему и окружение, что защищает данные и предотвращает нежелательные взаимодействия.
- Быстрый запуск: Экземпляры песочницы запускаются в среднем менее чем за ~200 мс, что делает их идеальными для сценариев с низкой задержкой.
- Поддержка нескольких языков: Вы можете запускать код на нескольких языках программирования, включая Python, JavaScript, TypeScript и другие.
- Быстрая пауза и возобновление: Вы можете приостановить работу песочницы в любой момент и возобновить её при необходимости, при этом состояние файловой системы и процессов полностью восстанавливается.
- Выполнение в фоне: Поддерживает выполнение фоновых задач и подходит для сценариев, требующих ожидания результата.
Novita Model API:

Novita предлагает обширную библиотеку открытых ИИ-моделей от ведущих исследовательских лабораторий, таких как OpenAI, Google, DeepSeek, Qwen и других. В их числе модели для работы с языком, зрением, аудио, видео и эмбеддингами. Наши языковые модели также полностью совместимы с SDK OpenAI, поэтому переход с OpenAI на Novita требует только обновления базового URL и API-ключа в вашем клиенте, после чего вы выбираете модель Novita.
| from openai import OpenAI client = OpenAI( base_url=“https://api.novita.ai/v3/openai”, api_key=“ ) |
Настройка среды разработки
Для начала мы клонируем репозиторий GitHub, настроим чистую среду Python, установим все необходимые зависимости и получим ключи Novita AI.
Клонирование репозитория GitHub и установка зависимостей с помощью uv.
1. Установите uv (лёгкий менеджер пакетов Python)
| pip install uv |
2. Клонируйте репозиторий (репозиторий на GitHub) и перейдите в его папку.
| git clone https://github.com/Studio1HQ/mcp\_remote\_execution.git cd mcp_remote_execution |
3. Создайте и активируйте виртуальное окружение uv
| # Creates a virtual environment uv venv # Activate the virtual environment source .venv/bin/activate # For Mac/Linux # or .venv\Scripts\activate # For Windows |
4. Установите зависимости проекта
| # Install dependencies uv sync |
Создание аккаунта Novita AI и получение API-ключа
1. Зарегистрируйтесь на novita.ai.

2. В панели управления наведите курсор на иконку профиля пользователя и нажмите API Keys во всплывающем меню.

3. На странице управления ключами нажмите Add New Key. Во всплывающем окне введите название для вашего ключа, нажмите Confirm, после чего скопируйте сгенерированный ключ.

4. Теперь в папке проекта создайте файл .env и вставьте в него следующее содержимое:
| NOVITA_API_KEY=“ NOVITA_BASE_URL=“https://api.novita.ai/v3/openai” NOVITA_E2B_DOMAIN=“sandbox.novita.ai” NOVITA_E2B_TEMPLATE=“code-interpreter-v1” |
Пополнение баланса аккаунта Novita AI.
Для использования песочницы Novita вам нужно пополнить баланс вашего аккаунта. На вкладке панели управления нажмите ‘Billing’. Затем на странице биллинга добавьте способ оплаты и пополните баланс как минимум на 10 долларов.

Создание MCP-сервера и интеграция с ИИ-агентом
Теперь, когда среда разработки настроена, приступим к созданию. Этот процесс будет состоять из двух частей: сначала мы разберём создание MCP-сервера, а затем создадим приложение ИИ-агента (которое выступает в роли MCP-клиента). Но перед началом давайте создадим менеджер песочницы, который будет использоваться MCP-сервером.
Менеджер песочницы
Он будет отвечать за запуск и остановку экземпляров песочницы. В нашей конфигурации мы ограничим сервер одним экземпляром песочницы одновременно. Менеджер песочницы также будет управлять выполнением Python-кода и запуском shell-команд в песочнице.
Сначала в файле sandbox_manager.py у нас есть класс SandboxManager, который принимает следующие параметры:
- sandbox_template: Шаблон, используемый для создания экземпляра песочницы. Мы будем использовать «code-interpreter-v1», в котором предустановлены часто используемые Python-пакеты (например, pandas, numpy).
- sandbox_domain: Доменный эндпоинт, используемый для подключения к экземпляру песочницы Novita AI.
- sandbox_timeout: Длительность (в секундах), определяющая, как долго песочница остаётся активной перед автоматическим завершением.
| from novita_sandbox.code_interpreter import Sandbox class SandboxManager: def __init__( self, sandbox_template: str, sandbox_domain: str, sandbox_timeout: int, ): self.sandbox_template = sandbox_template self.sandbox_domain = sandbox_domain self.sandbox_timeout = sandbox_timeout |
Теперь добавим методы для создания и остановки песочницы.
- Для создания мы получаем sandbox_api_key, используем его для запуска нового экземпляра песочницы для пользователя и возвращаем сообщение об успехе с ID песочницы или сообщение об исключении, если что-то пошло не так.
- Для остановки мы получаем sandbox_api_key и sandbox_id, подключаемся к песочнице и останавливаем её, если она существует. Как и раньше, мы возвращаем сообщение об успехе или об исключении в зависимости от результата.
| … class SandboxManager: … # below existing code def create_sandbox_session(self, sandbox_api_key: str) -> str: “”“ This will create a new sandbox instance. Args: sandbox_api_key (str): The API key for the sandbox. Returns: str: Success message with the sandbox ID of the new sandbox or error message. ”“” try: # create the new sandbox sandbox = Sandbox.create( template=self.sandbox_template, api_key=sandbox_api_key, domain=self.sandbox_domain, timeout=self.sandbox_timeout, ) return f"Successfully created sandbox. Sandbox ID: {sandbox.sandbox_id}“ except Exception as e: return f"Failed to create new sandbox:{str(e)}” def stop_sandbox_session(self, sandbox_api_key: str, sandbox_id: str) -> str: “”“ This will kill a sandbox instance if it exists. Args: sandbox_api_key (str): The API key for the sandbox. sandbox_id (str): The ID of the sandbox. Returns: str: Success message with the sandbox ID of the killed sandbox or error message. ”“” try: # connect to sandbox sandbox = Sandbox.connect( api_key=sandbox_api_key, sandbox_id=sandbox_id, ) sandbox.kill() return f"Successfully killed Sandbox ID: {sandbox_id}“ except Exception as e: return f"Failed to kill Sandbox ID: {sandbox_id}\ {str(e)}” |
Наконец, добавим методы для выполнения Python-кода и shell-команд в песочнице пользователя после подключения к ней с помощью API-ключа и ID. Все выходные данные песочницы (включая исключения и ошибки) возвращаются в виде словаря.
| … class SandboxManager: … # below existing code def run_python_code( self, python_code: str, sandbox_api_key: str, sandbox_id: str ) -> dict: “”“ Runs the python code on the sandbox, and if there any image outputs they are skipped. Args: python_code (str): The python code to run. sandbox_api_key (str): The API key for the sandbox. sandbox_id (str): The ID of the sandbox. Returns: dict: Containing stdout, logs, error, etc. ”“” try: # connect to sandbox sandbox = Sandbox.connect( api_key=sandbox_api_key, sandbox_id=sandbox_id, ) execution = sandbox.run_code(python_code, language=“python”) return { # we will skip image outputs. “outputs”: [result for result in execution.results if not result.png], “logs”: execution.logs, “error”: execution.error, } except Exception as e: return {“error”: str(e)} def run_on_command_line( self, command: str, sandbox_api_key: str, sandbox_id: str ) -> dict: “”“ Runs the command on the sandbox. Args: command (str): The command to run. sandbox_api_key (str): The API key for the sandbox. sandbox_id (str): The ID of the sandbox. Returns: dict: Containing the output of the command and the execution error if any. ”“” try: # connect to sandbox sandbox = Sandbox.connect( api_key=sandbox_api_key, sandbox_id=sandbox_id, ) result = sandbox.commands.run(command) return { “output”: { “stdout”: result.stdout, “stderr”: result.stderr, “exit_code”: result.exit_code, “error”: result.error, }, “execution error”: None, } except Exception as e: return {“output”: None, “execution error”: str(e)} |
Создание MCP-сервера
Теперь, когда Менеджер песочницы настроен, пришло время поработать над mcp_server.py. Сначала мы создаём экземпляр FastMCP — фреймворка, на котором будет работать сервер, а также экземпляр Менеджера песочницы. Мы также создаём экземпляр консоли rich для красивого вывода в терминал.
Примечание: Таймаут песочницы, передаваемый Менеджеру песочницы, используется для всех песочниц, запущенных на этом сервере. Это максимальное время (в секундах), в течение которого каждая песочница может оставаться активной (работать), если она не была остановлена ранее.
| import asyncio import os from dotenv import load_dotenv from mcp.server.fastmcp import Context, FastMCP from rich.console import Console from rich.panel import Panel from rich.table import Table from starlette.requests import Request from sandbox_manager import SandboxManager # load .env variables load_dotenv() console = Console() # Initialize FastMCP server mcp = FastMCP(“MCP_Server”) # Initialize sandbox manager for the singleton sandbox instance. sandbox_manager = SandboxManager( sandbox_template=os.getenv(“NOVITA_E2B_TEMPLATE”), sandbox_domain=os.getenv(“NOVITA_E2B_DOMAIN”), sandbox_timeout=900, # 900 seconds (15 minutes), sandbox instance will be killed automatically after. ) |
Теперь, поскольку нам нужен API-ключ для подключения к песочнице пользователя, мы будем получать его из запроса пользователя на сервер. Как мы увидим позже в MCP-клиенте, этот ключ будет отправляться в заголовке авторизации каждого запроса. Это означает, что нам нужен способ извлечь API-ключ из этого заголовка на стороне сервера.
FastMCP предоставляет объект Context, который во время выполнения содержит информацию о пользователе, отправившем запрос. Поэтому мы создадим вспомогательный метод get_user_api_key, который принимает объект контекста, извлекает API-ключ из заголовка и возвращает его, либо вызывает исключение, если ключ отсутствует.
| … # below existing code def get_user_api_key(ctx: Context) -> str: “”“ Returns the API key from the request header if it exists otherwise raise an exception. ”“” request: Request = ctx.request_context.request # Access request data auth_header = request.headers.get(“Authorization”) if auth_header: auth_header = auth_header.split(" ")[1] if not auth_header: raise Exception(“Missing API Key in Authorization Bearer header”) return auth_header |
Пришло время предоставить промпты, инструменты и ресурсы на нашем сервере. Для этого мы просто добавляем декоратор @mcp.{prompt, tool, resource}() к Python-функции. Начнём с нашего промпта, который возвращает инструкции по использованию песочницы агентом.
| … # below existing code (Note: Console display helper methods were skipped for brevity) @mcp.prompt() def instructions_for_sandbox_use() -> str: “”“ RETURNS MUST READ INSTRUCTIONS FOR SANDBOX USE. ”“” return “”“ When you want to use the sandbox function, you must first create a new sandbox session by calling the create_sandbox_session() function. Then you can use the run_python_code() or run_on_command_line() function to run on the sandbox. When you are done, you must kill the sandbox session by calling the stop_sandbox_session() function. Note: - The sandbox already comes pre-installed with the usual data analysis packages but if there’s a package you are not sure exists or your code had an import error due to a missing package, you can check if it’s installed and if not install it. ”“” |
Для инструментов мы предоставляем методы, которые используют экземпляр sandbox_manager для создания, остановки и выполнения кода или команд в песочнице пользователя.
Примечание: Среди аргументов, которые принимают приведённые ниже методы инструментов, мы включим ctx: Context. Это указывает FastMCP автоматически внедрять контекст запроса в этот параметр — процесс, известный как внедрение зависимостей. Затем мы получаем API-ключ, если он существует, передавая этот контекст нашему вспомогательному методу (get_user_api_key).
| … # below existing code @mcp.tool() def create_sandbox_session(ctx: Context) -> str: “”“ This will create a sandbox instance and return success message with the sandbox id or error message. ”“” try: return sandbox_manager.create_sandbox_session(get_user_api_key(ctx)) except Exception as e: return e @mcp.tool() def stop_sandbox_session(sandbox_id: str, ctx: Context) -> str: “”“ This will kill a sandbox instance if it exists. ”“” try: return sandbox_manager.stop_sandbox_session(get_user_api_key(ctx), sandbox_id) except Exception as e: return e @mcp.tool() def run_python_code(python_code: str, sandbox_id: str, ctx: Context) -> dict: “”“ Runs the python code on the sandbox, and if there any image outputs they are skipped. Args: python_code (str): The python code to run. sandbox_id (str): The ID of the sandbox. Note: The ctx (Context) is a dependency injection object that is automatically passed. Returns: dict: Containing stdout, logs, error, etc. ”“” console.print( Panel( python_code, title=“Agent Executing Python Code”, border_style=“blue”, ) ) try: result = sandbox_manager.run_python_code( python_code, get_user_api_key(ctx), sandbox_id ) # display the result. Note: only do this in test not in prod. display_sandbox_code_output(result) return result except Exception as e: return {“error”: str(e)} @mcp.tool() def run_on_command_line(command_line: str, sandbox_id: str, ctx: Context) -> dict: “”“ Runs the command on the sandbox. Args: command_line (str): The command to run. sandbox_id (str): The ID of the sandbox. Note: The ctx (Context) is a dependency injection object that is automatically passed. Returns: dict: Containing the output of the command and the execution error if any. ”“” console.print( Panel( command_line, title=“Agent Executing Command Line”, border_style=“blue”, ) ) try: result = sandbox_manager.run_on_command_line( command_line, get_user_api_key(ctx), sandbox_id ) # display the result. Note: only do this in test not in prod. display_sandbox_command_output(result) return result except Exception as e: return {“execution error”: str(e)} |
Теперь мы предоставим один ресурс для одного из наших демо-сценариев, с которым мы познакомимся позже. Этот ресурс возвращает мок портфеля акций пользователя. В отличие от промптов и инструментов, для ресурсов требуется указать URL, по которому они будут доступны.
| … # below existing code @mcp.resource(“data://user_stock_portfolio”) def get_user_portfolio() -> dict: “”“ Returns the user’s portfolio holdings across major index ETFs and individual stocks. Returns: dict: Portfolio with ticker symbols, quantities, and average purchase prices ”“” portfolio = { “holdings”: [ # Major Index ETFs { “ticker”: “SPY”, “name”: “SPDR S&P 500 ETF”, “quantity”: 4, “avg_purchase_price”: 670.13, “asset_type”: “ETF”, }, … # skipped for brevity ] } return portfolio |
Наконец, добавим код, который запускает наш сервер. Мы не будем использовать транспорт MCP stdio, поскольку консоль Rich выводит данные в терминал, что является блокирующей операцией и может вызывать помехи. Вместо этого мы будем использовать транспорт MCP streamable-http (вы также будете использовать его в продакшене, так как он лучше всего подходит для удалённого подключения между клиентом и сервером по HTTP).
| … # below existing code if __name__ == “__main__”: # run the server # Note: We use streamable-http as the transport protocol instead of stdio because we are printing to the console which would block stdio. # Also in production you should use SSE or streamable-http rather than stdio. asyncio.run(mcp.run(transport=“streamable-http”)) |
Фух, давайте запустим наш MCP-сервер, чтобы получить URL, по которому он работает — он нам понадобится для подключения нашего ИИ-агента. Выполните команду ниже в терминале.
| uv run mcp_server.py |
Вы должны увидеть, что сервер теперь работает. Запомните URL, по которому он работает

Интеграция ИИ-агента с MCP-сервером
Теперь мы приступим к работе над ИИ-агентом в mcp_client.py. Библиотека mcp-use упрощает этот процесс. Сначала мы устанавливаем уровень отладки INFO, чтобы видеть, что делает агент. В основном методе мы создаём словарь конфигурации для MCP-клиента. В нём указываются доступные MCP-серверы: используется имя (я использовал “stock&sandbox”) и URL, по которому работает MCP-сервер (не забудьте добавить /mcp), а также мы указываем API-ключ пользователя в качестве значения для поля «auth» — он будет автоматически добавлен библиотекой mcp-use в заголовок Authorization bearer каждого запроса.
Поскольку mcp-use основан на langchain-openai, мы передаём базовый URL Novita, API-ключ и имя модели LLM, что работает, потому что Novita совместима с OpenAI.
Кроме того, в ответе агента мы хотим указывать ID песочницы, которую он использовал на сервере, если таковая была (мы объясним, почему, позже). Для этого мы определим класс Pydantic для представления формата нашего ответа.
| import asyncio import os from datetime import datetime from typing import Optional import mcp_use from dotenv import load_dotenv from langchain_openai import ChatOpenAI from mcp_use import MCPAgent, MCPClient from pydantic import BaseModel, Field from rich.console import Console from rich.panel import Panel from rich.prompt import Prompt # Load environment variables load_dotenv() console = Console() # Note: 1 for INFO level, 2 for full verbose DEBUG level and 0 for NO debug output. mcp_use.set_debug(1) class ResponseFormat(BaseModel): response: str id_of_used_sandbox: Optional[str] = Field( …, description=“The id of the sandbox used if any” ) async def main(model: str, base_url: str, api_key: str): # Create configuration dictionary config = { “mcpServers”: { “stock&sandbox”: { # If the url the mcp server is running at is different replace below, # also remember to add /mcp. “url”: “http://127.0.0.1:8000/mcp”, “auth”: api_key, } } } # Create MCPClient from configuration dictionary client = MCPClient(config) # Create LLM llm = ChatOpenAI(model=model, base_url=base_url, api_key=api_key) … |
Затем мы создаём MCP-агента, передавая в него LLM, MCP-клиент, максимальное количество шагов (которое ограничивает количество действий, которые агент может выполнить перед ответом), и включаем память, чтобы mcp-use управлял историей нашего разговора. Мы также предоставляем системный промпт, который включает текущую дату и время, а также пользовательские инструкции по использованию песочницы (я добавил их, потому что некоторые модели забывают читать инструкционные промпты, предоставляемые на сервере).
Наконец, мы настраиваем стандартный цикл общения: получаем ввод пользователя, передаём его в agent.run() и выводим ответ. Если была использована песочница, мы создаём сессию, чтобы вручную вызвать метод остановки на сервере в качестве меры безопасности на случай, если модель забудет её закрыть.
| … async def main(model: str, base_url: str, api_key: str): … # below existing code # Create agent with the client agent = MCPAgent( llm=llm, client=client, max_steps=25, memory_enabled=True, # mcp-use will auto handle the conversation history. system_prompt=f"“” You are a helpful assistant and the current date is {datetime.now().strftime(‘%Y-%m-%d’)} MUST REMEMBER: - Before any tool call first call instructions_for_sandbox_use() so you can read them. - Ensure you call stop_sandbox_session() after using the sandbox before responding to the user. “”“, ) console.print( Panel( ”[bold green]MCP Session Started[/bold green]\ Type ‘quit()’ to exit.“, title=“MCP Session”, border_style=“green”, ) ) while True: user_input = Prompt.ask(”\ [bold yellow]>>> User Message[/bold yellow]“) if user_input.lower().strip() == “quit()”: break # Pass the query to the agent and await the response. response_obj = await agent.run(user_input, output_schema=ResponseFormat) console.print( f”\ [bold green]>>> Assistant Response: {response_obj.response} [/]" ) if response_obj.id_of_used_sandbox: # Will trigger closure of sandbox on MCP server if it sill active. session = await client.create_session(“stock&sandbox”) await session.call_tool( name=“stop_sandbox_session”, arguments={“sandbox_id”: response_obj.id_of_used_sandbox}, ) await session.disconnect() |
В конце добавляем код, который запускает клиент:
| … # below existing code if __name__ == “__main__”: asyncio.run( main( model=“qwen/qwen3-coder-480b-a35b-instruct”, base_url=os.getenv(“NOVITA_BASE_URL”), api_key=os.getenv(“NOVITA_API_KEY”), ) ) |
Тестовый запуск нашего ИИ-агента MCP:
Вы можете запустить приложение ИИ-агента, выполнив команду ниже в терминале
| uv run mcp_client.py |
Ниже приведены ссылки на видео с демонстрационными запусками по следующим промптам:
- Промпт пользователя 1: «У меня есть 2000 долларов. Получите показатели крупных американских фондовых индексов из yfinance за последние 6 месяцев и запустите ML-модели, чтобы предсказать, как распределить эти инвестиции для максимизации потенциальной доходности в ближайшие 2 месяца.»(Вставьте ссылку здесь)
- Промпт пользователя 2: «Запустите несколько симуляций экономического дефляционного кризиса в США, выберите наиболее вероятный и объясните, какое влияние он окажет на мой портфель акций.»(Вставьте ссылку здесь)
Советы по развёртыванию MCP-серверов в продакшене
Хотя это руководство было посвящено созданию рабочего MCP-сервера с Novita Sandbox, развёртывание в продакшене требует дополнительных соображений:
Используйте правильный транспорт: Хотя «stdio» подходит для локальной разработки, в продакшене MCP-серверы должны использовать «streamable-http» для обеспечения удалённых подключений, как мы сделали выше.
Реализуйте аутентификацию: Как мы сделали выше, убедитесь, что вы защитили endpoints вашего MCP-сервера с помощью аутентификации. Убедитесь, что каждый клиент имеет доступ только к тем инструментам и ресурсам, которые ему нужны. Подробнее о методах аутентификации вы можете прочитать на странице FastMCP authentication
Включите логирование: Используйте логгер для мониторинга активности сервера, отладки проблем и отслеживания паттернов использования. Это крайне важно для обслуживания и устранения неполадок.
Ограничение частоты запросов и квоты: Защитите ваш сервер от злоупотреблений, реализовав ограничения частоты запросов и квоты. Это особенно важно при предоставлении доступа к ресурсоёмким инструментам.
Документация и версионирование: Поддерживайте понятную документацию API вашего MCP-сервера и систему версионирования, чтобы упростить интеграцию для разработчиков и LLM.
Заключение
Фух, наконец вы можете создать MCP-сервер, в котором ИИ-агенты могут удалённо выполнять код с помощью инструкций на естественном языке — это практическая реализация Software 3.0 в действии.
В этом руководстве вы научились создавать MCP-сервер с возможностью выполнения кода, управлять жизненным циклом песочницы и создавать ИИ-агента с помощью mcp-use, который подключается к вашему серверу. Далее попробуйте расширить его, добавив доступ к базе данных, веб-поиск или подключение нескольких серверов к одному агенту. Перейдите на сайт Novita, у нас есть все инструменты, необходимые для создания ваших ИИ-агентов.
Novita AI — это облачная ИИ-платформа, которая предлагает разработчикам простой способ развёртывания ИИ-моделей с помощью нашего простого API, а также доступное и надёжное облако GPU для построения и масштабирования решений.
